Wikilivres frwikibooks https://fr.wikibooks.org/wiki/Accueil MediaWiki 1.47.0-wmf.7 first-letter Média Spécial Discussion Utilisateur Discussion utilisateur Wikilivres Discussion Wikilivres Fichier Discussion fichier MediaWiki Discussion MediaWiki Modèle Discussion modèle Aide Discussion aide Catégorie Discussion catégorie Transwiki Discussion Transwiki Wikijunior Discussion Wikijunior TimedText TimedText talk Module Discussion module Event Event talk Méditations métaphysiques/Première méditation : Des choses que l'on peut révoquer en doute 0 3902 768094 767981 2026-06-18T19:12:39Z PandaMystique 119061 768094 wikitext text/x-wiki {| style="width: 100%; border-top: 3px solid #3366cc; border-bottom: 1px solid #ddd; background: #fafafa; margin: 1em 0; font-size: 90%;" |- | style="padding: 8px 12px;" | ← [[Méditations métaphysiques|Sommaire]] | style="padding: 8px 12px; text-align: center;" | René Descartes, '''''[[Méditations métaphysiques]]'''''<br />'''[[Méditations métaphysiques/Première méditation : Des choses que l'on peut révoquer en doute|<big>Première méditation</big> :<br />Des choses que l'on peut révoquer en doute]]''' | style="padding: 8px 12px; text-align: right;" | [[Méditations métaphysiques/Méditation seconde : De la nature de l'esprit humain ; et qu'il est plus aisé à connaître que le corps|Méditation II]] → |} La Première Méditation ouvre les ''Méditations métaphysiques'' et pose les fondations de tout l'édifice qui suivra. Son titre, « Des choses que l'on peut révoquer en doute », annonce le projet : non pas établir des vérités, mais mettre à l'épreuve tout ce que l'on tient pour vrai. Cette méditation met en place le « doute méthodique », parfois appelé « doute hyperbolique » à son point extrême, une démarche dont l'influence sur la philosophie moderne a été profonde. Il faut situer ce projet dans son contexte. Au {{sc|xvii}}<sup>e</sup> siècle, la science nouvelle de Galilée et de Kepler ébranle les certitudes héritées de la scolastique. Descartes entreprend de refonder l'ensemble des connaissances sur des bases assurées ; la Première Méditation en constitue le moment négatif, celui de la démolition préalable. La marche du texte est ordonnée. Le doute progresse par paliers, chaque niveau englobant le précédent : exposition du projet (§ 1-2), faillibilité des sens (§ 3-4), argument du rêve (§ 5), distinction entre sciences composées et sciences simples (§ 6-8), hypothèse du Dieu trompeur (§ 9-12), puis du malin génie et difficulté à maintenir le doute (§ 13-15). Cette progression conduit à une suspension du jugement qui prépare la découverte du ''cogito'' dans la Seconde Méditation. == I. Le projet de refondation du savoir (§ 1-2) == === L'incipit : un commencement à la première personne === <blockquote> « Il y a déjà quelque temps que je me suis aperçu que, dès mes premières années, j'avais reçu quantité de fausses opinions pour véritables, et que ce que j'ai depuis fondé sur des principes si mal assurés, ne pouvait être que fort douteux et incertain. » </blockquote> L'œuvre s'ouvre sur un constat rétrospectif : un sujet découvre que son éducation a mêlé le vrai et le faux, et que tout ce qu'il a bâti sur cette base chancelle. Hegel voyait dans cette page un seuil de la philosophie moderne ; commentant Descartes, il comparait le penseur à un marin qui, après une longue traversée, peut enfin crier « Terre ! »<ref>G. W. F. Hegel, ''Leçons sur l'histoire de la philosophie'', t. III. Le mot est rapporté et commenté par Charles Larmore, « The First Meditation: Skeptical Doubt and Certainty », dans David Cunning (dir.), ''The Cambridge Companion to Descartes' Meditations'', Cambridge University Press, 2014, p. 48.</ref>. La formule est juste à condition de ne pas durcir le propos : Descartes n'affirme pas, dès la première phrase, que toutes ses opinions sont fausses. Il inaugure une discipline du jugement. Le doute ne remplace pas une croyance par son contraire ; il suspend l'assentiment partout où une raison de douter se présente, afin de ne garder que ce qui résiste. Le constat mérite qu'on s'arrête à ses termes. Les opinions sont « reçues » (''admisi''), non choisies : l'enfant subit les croyances que lui transmettent l'éducation et le milieu, et le doute aura précisément pour tâche de transformer ce rapport passif en examen actif. Ces opinions sont « fausses », mais elles ont été tenues « pour véritables » : le mal n'est pas l'ignorance, mais la confusion du faux et du vrai, l'assentiment accordé à ce qui ne le méritait pas. L'erreur, enfin, est massive (« quantité ») et féconde : posées comme « principes », ces faussetés ont servi de base à des constructions ultérieures, de sorte que tout l'édifice s'en trouve fragilisé. De là découle la résolution : <blockquote> « [...] il me fallait entreprendre sérieusement une fois en ma vie de me défaire de toutes les opinions que j'avais reçues jusques alors en ma créance, et commencer tout de nouveau dès les fondements, si je voulais établir quelque chose de ferme et de constant dans les sciences. » </blockquote> Le vocabulaire est celui de la rupture : « me défaire » de « toutes » les opinions, « commencer tout de nouveau » et « dès les fondements ». Mais la fin est constructive, non sceptique : il s'agit d'« établir quelque chose de ferme et de constant », c'est-à-dire d'atteindre, par la démolition, le sol assez sûr pour rebâtir. Une objection se lève aussitôt : peut-on vraiment se défaire de toutes ses opinions ? Descartes y répond par avance, comme on le verra, en ne demandant pas de les juger fausses, mais de les traiter comme telles le temps de l'examen. Le ton surprend. Là où tant de traités commencent par des définitions, Descartes part d'un « je me suis aperçu » : une histoire intellectuelle datée, où le lecteur est invité à entrer. Cette dimension autobiographique tient à la méthode. Le savoir à fonder doit être assumé dans l'acte même où je juge, et non reçu par tradition ou par déférence. Reste à savoir qui parle. Le « je » des ''Méditations'' n'est pas seulement René Descartes ; c'est un méditant exemplaire dont chacun peut endosser le rôle<ref>Charles Larmore, art. cité, p. 48-68 ; voir aussi Lisa Shapiro, « The Self in the Meditations », dans Karen Detlefsen (dir.), ''Descartes' Meditations: A Critical Guide'', Cambridge University Press, 2012, p. 230.</ref>. Gary Hatfield distingue ce méditant de l'auteur historique : Descartes, lorsqu'il écrit, possède déjà sa métaphysique, tandis que le méditant doit la découvrir. Le méditant est un « débutant en philosophie » (''qui modo primum philosophari incipit'', selon l'''Entretien avec Burman'') qui adhère encore à l'idée que toute connaissance vient des sens<ref>Gary Hatfield, ''Routledge Philosophy GuideBook to Descartes and the Meditations'', Londres, Routledge, 2003 (désigné ci-après ''Descartes and the Meditations''), p. 40 et 89 ; Descartes, ''Entretien avec Burman'', AT V, p. 146.</ref>. Jorge Secada va plus loin : le texte cherche à devenir l'expression de la transformation du lecteur lui-même, qui doit refaire le parcours pour son compte plutôt que d'en suivre le récit en spectateur<ref>Jorge Secada, « God and Meditation in Descartes' ''Meditations on First Philosophy'' », dans Karen Detlefsen (dir.), ''op. cit.'', p. 201-202 : « Descartes espérait que les lecteurs de ses méditations seraient véritablement des méditants vivant le processus méditatif, processus de transformation. Les ''Méditations'' ne décrivent pas cette entreprise ; elles cherchent à devenir l'expression de la transformation du lecteur. »</ref>. L'ambiguïté du « je » est féconde : elle permet un texte à la fois personnel et universel, où chacun reconnaît ses propres préjugés. === L'erreur de l'enfance et ses mécanismes === L'expression « dès mes premières années » (''ineunte ætate'') situe l'origine de l'erreur non dans un accident isolé, mais dans l'économie de notre développement. L'enfance est le moment où se forment des habitudes de jugement difficiles à déraciner. Descartes développe cette analyse dans les ''Principes de la philosophie'' (I, 71-74)<ref>Descartes, ''Principia philosophiae'', I, art. 71-74, AT VIII-A, p. 35-37. Voir Gary Hatfield, ''Descartes and the Meditations'', p. 89-90.</ref>. L'idée n'est pas que l'enfant serait moins intelligent, mais que son esprit est d'abord étroitement lié au corps : il vit dans l'urgence des besoins, se règle sur ce qui attire ou repousse, fait plaisir ou fait mal. De là des erreurs caractéristiques. L'enfant croit que les qualités qu'il éprouve, couleurs, sons, saveurs, chaleur, existent dans les choses telles qu'il les ressent : c'est la « thèse de la ressemblance », qui traite l'expérience sensible comme une copie fidèle du réel<ref>Descartes, ''Meditationes'', VI, AT VII, p. 82 ; ''Principia'', I, art. 71, AT VIII-A, p. 35. Cf. Hatfield, ''Descartes and the Meditations'', p. 269-270.</ref>. Il tend aussi à ne donner de consistance qu'à ce qui tombe sous les sens, au point de juger qu'il n'y a rien là où il ne sent rien, habitude qui rend plus difficile, à l'âge adulte, la pensée d'êtres immatériels comme l'âme ou Dieu<ref>Descartes, ''Principia'', I, art. 71, AT VIII-A, p. 35-36.</ref>. Enfin, devenu adulte, il oublie la genèse de ses opinions : des croyances prises autrefois sur parole se présentent ensuite comme des évidences naturelles<ref>Descartes, ''Principia'', I, art. 71, AT VIII-A, p. 36.</ref>. Cet oubli explique la résistance de l'erreur : les préjugés se déguisent en certitudes. Les ''Principes'' rangent ces mécanismes sous quatre causes d'erreur : les préjugés de l'enfance, l'impossibilité de les oublier, la fatigue qu'impose l'attention aux objets non sensibles, et l'attachement de nos concepts à des mots qui ne leur correspondent pas exactement. Ces causes se soutiennent l'une l'autre : les préjugés persistent parce qu'on ne peut les oublier, parce que la pensée intellectuelle fatigue, et parce que le langage les entretient. La quatrième cause vise une difficulté à laquelle la Seconde Méditation s'attaquera, en montrant que « voir » la cire est en réalité un acte de l'intellect<ref>Descartes, ''Meditationes'', II, AT VII, p. 31-32. Cf. Martial Gueroult, ''Descartes selon l'ordre des raisons'', Paris, Aubier, 1953, t. I, p. 131-136.</ref>. On serait tenté de rapprocher cette analyse des théories modernes du conditionnement social. Le rapprochement éclaire, à condition de rester mesuré. Chez Descartes, l'éducation, le langage et l'autorité des maîtres fournissent bien une part du matériau des opinions, et l'enfance est le moment où ces contenus s'enracinent sans contrôle. Mais il ne propose pas une théorie sociale de la croyance : son but est d'expliquer pourquoi des erreurs ordinaires prennent l'allure d'évidences, afin de justifier un doute qui vise les opinions reçues et stabilisées par l'habitude. === L'édifice du savoir et la question des fondements === <blockquote> « [...] ce que j'ai depuis fondé sur des principes si mal assurés, ne pouvait être que fort douteux et incertain [...] » </blockquote> La métaphore architecturale traverse le passage : les opinions sont des « fondements » (''fundamenta''), le savoir un « édifice » (''ædificium''). Si les fondements sont « mal assurés » (''male firmata''), tout l'édifice est ébranlé. L'image est développée dans le ''Discours de la méthode'', où le philosophe est comparé à un architecte qui démolit un bâtiment instable pour rebâtir sur des bases solides<ref>Descartes, ''Discours de la méthode'', II<sup>e</sup> partie, AT VI, p. 13-14.</ref>. Cette métaphore engage une conception fondationnaliste : certaines croyances reposent sur d'autres, jusqu'à des croyances de base qui ne reposent sur rien et soutiennent l'ensemble. Edwin Curley a souligné ce trait de l'épistémologie cartésienne<ref>Edwin Curley, ''Descartes Against the Skeptics'', Cambridge (Mass.), Harvard University Press, 1978, p. 31-35 ; voir aussi « The Cogito and the Foundations of Knowledge », dans Stephen Gaukroger (dir.), ''The Blackwell Guide to Descartes' Meditations'', Oxford, Blackwell, 2006, p. 30-47.</ref>. La philosophie du {{sc|xx}}<sup>e</sup> siècle l'a discutée : Quine a soutenu que nos croyances forment un réseau plutôt qu'un édifice, où aucune n'est absolument première ; Wittgenstein a contesté qu'il faille justifier nos croyances de base. Ces objections relèvent du fondationnalisme en général ; Descartes y répondra à sa manière dans la suite des ''Méditations'', en présentant le ''cogito'' comme une vérité première, connue par intuition et non par inférence<ref>Sur le débat, voir Bernard Williams, ''Descartes: The Project of Pure Enquiry'', Harmondsworth, Penguin, 1978, chap. 2 ; Curley, ''op. cit.'', chap. 3.</ref>. Il convient toutefois de ne pas durcir l'opposition entre Descartes et la scolastique. Larmore rappelle que le fondationnalisme n'a rien d'une nouveauté cartésienne : l'idée que toute connaissance repose sur les sens imprégnait déjà la pensée du temps. Descartes ne substitue pas une vision fondationnaliste à une pensée qui en aurait été dépourvue ; il remplace une forme régnante par une autre<ref>Charles Larmore, art. cité, p. 50-51.</ref>. L'adage « il n'y a rien dans l'intellect qui n'ait d'abord été dans les sens » (''nihil est in intellectu quod non prius fuerit in sensu'') résumait cet enseignement<ref>La formule est scolastique, et non aristotélicienne au sens littéral : elle condense une thèse qu'Aristote développe dans le ''De l'âme'' (III, 7-8, 431a-432a), selon laquelle l'âme ne pense jamais sans image. Discutée par Thomas d'Aquin (''De veritate'', q. 2, a. 3, arg. 19), elle sera reprise par les empiristes, Leibniz lui ajoutant sa réserve fameuse : ''nisi ipse intellectus''.</ref>. Mais l'empirisme aristotélicien ne se réduit pas à une confiance naïve dans les sens : il fonde la connaissance sur la fiabilité de la perception dans des conditions normales, non sur son infaillibilité. C'est précisément cette nuance que le doute va exploiter. Cette mise en cause des fondements sensibles a une portée que Descartes laisse d'abord dans l'ombre. Hatfield rappelle que les « préjugés de l'enfance » recouvrent en réalité une bonne part de la métaphysique et de l'épistémologie aristotéliciennes alors enseignées<ref>Gary Hatfield, ''Descartes and the Meditations'', p. 89-90 : Descartes savait que ces « préjugés » incluaient nombre de thèses de la métaphysique et de l'épistémologie aristotéliciennes.</ref>. Ébranler la confiance dans les sens, c'est donc atteindre l'édifice de l'École. Descartes ne l'avoue pas dans les ''Méditations'', dédiées aux docteurs de la Faculté de théologie de Paris, mais il s'en ouvre à Mersenne : « Ces six Méditations contiennent tous les fondements de ma physique. Mais il ne faut pas le dire, s'il vous plaît, car ceux qui favorisent Aristote feraient peut-être plus de difficulté de les approuver »<ref>Descartes à Mersenne, 28 janvier 1641, AT III, p. 297-298. Cf. Charles Larmore, art. cité, p. 51.</ref>. En invitant chacun à refaire l'examen de ses croyances pour son propre compte, Descartes substitue à un critère de vérité un autre : non plus l'accord avec les Anciens ou l'autorité d'une tradition, mais l'évidence présente à l'esprit individuel. === Les conditions de la méditation === <blockquote> « Maintenant donc que mon esprit est libre de tous soins, et que je me suis procuré un repos assuré dans une paisible solitude, je m'appliquerai sérieusement et avec liberté à détruire généralement toutes mes anciennes opinions. » </blockquote> Descartes ne se contente pas d'énoncer des arguments ; il décrit le cadre où ils peuvent être conduits. Trois conditions sont requises. La liberté à l'égard des soucis (''curae'') d'abord : la méditation demande une attention unifiée que les préoccupations pratiques fragmentent. Cette exigence retrouve l'opposition antique entre vie active (''negotium'') et loisir studieux (''otium''), mais lui donne une fin nouvelle, puisque l'''otium'' cartésien est provisoire et ordonné à une refondation. La sécurité ensuite : un esprit menacé se tourne vers l'action et la survie, non vers la métaphysique. Historiquement, Descartes jouissait aux Pays-Bas, vers 1640, d'une retraite assez stable pour mener ce travail. La solitude enfin : non par misanthropie, mais parce que la présence d'autrui introduit des opinions et des autorités, et parce que le fondement recherché doit être trouvé en soi-même. Le ''cogito'' sera une vérité solitaire, accessible à chaque esprit pour son propre compte. Ce cadre est traversé par une exigence d'unicité, que le texte latin nomme ''semel in vita'', « une fois dans la vie » : « ''funditus omnia semel in vita esse evertenda'' ». Le doute n'est pas une attitude permanente, comme la suspension du jugement des sceptiques, mais un moment destiné à produire des résultats durables<ref>Gary Hatfield, « The Senses and the Fleshless Eye: The ''Meditations'' as Cognitive Exercises », dans Amélie O. Rorty (dir.), ''Essays on Descartes' Meditations'', Berkeley, University of California Press, 1986, p. 45-79 ; ''Descartes and the Meditations'', p. 40-43.</ref>. La métaphysique est épuisante : Descartes conseillera à Élisabeth de Bohême de ne lui consacrer que peu d'heures par an<ref>Descartes à Élisabeth, 28 juin 1643, AT III, p. 692-695.</ref>. Une fois le fondement atteint, il n'a pas à être cherché de nouveau, et le parcours méditatif opère une transformation du sujet qui ne se répète pas. Le terme même de « méditation » inscrit l'œuvre dans la tradition des exercices spirituels, dont les ''Exercices'' d'Ignace de Loyola, composés dans les années 1520 et imprimés en 1548, offrent le modèle le plus diffusé ; Descartes en avait pratiqué à La Flèche<ref>Gary Hatfield, « The Senses and the Fleshless Eye », p. 47-54 ; ''Descartes and the Meditations'', p. 40-42.</ref>. Les ''Méditations'' partagent avec ce genre une répartition en journées, un engagement actif du lecteur (la préface réclame « plusieurs mois, ou du moins plusieurs semaines » de réflexion sur la seule Première Méditation), une visée de transformation et une progression ordonnée où nul degré ne peut être sauté<ref>Descartes, ''Meditationes'', Préface, AT VII, p. 9.</ref>. Mais l'objet n'est pas Dieu pris pour lui-même, la méthode n'est pas l'imagination de scènes bibliques, et le but n'est pas le salut mais la certitude<ref>Jorge Secada, art. cité, p. 200-201, qui décrit les ''Méditations'' comme un « manuel thérapeutique » offrant un traitement pour une maladie cognitive liée à l'union de l'esprit et du corps.</ref>. Secada note d'ailleurs que nous, lecteurs d'aujourd'hui, ne pouvons plus revêtir aussi aisément l'habit du méditant, parce que nous n'accordons plus la même foi à la promesse cartésienne d'une science nouvelle<ref>Jorge Secada, art. cité, p. 202.</ref>. Une dernière condition est explicitée plus loin : « il n'est pas maintenant question d'agir, mais seulement de méditer et de connaître » (AT VII, 22). Le doute appartient à la théorie, non à la pratique. Dans l'action, on ne peut attendre la certitude absolue ; il faut se régler sur le probable, selon la « morale par provision » du ''Discours''<ref>Descartes, ''Discours de la méthode'', III<sup>e</sup> partie, AT VI, p. 22-28. Cf. ''Historical Dictionary of Descartes and Cartesian Philosophy'', 2<sup>e</sup> éd., Lanham, Rowman & Littlefield, 2015, art. « Doubt », p. 120-121, qui rappelle que, dans les affaires pratiques, on ne doit pas exiger la certitude due à la science théorique.</ref>. Cette distinction protège l'entreprise de l'objection d'apraxie : on continue d'agir selon ses croyances ordinaires alors même qu'on les a suspendues pour les besoins de la connaissance. === Le principe du doute : l'indubitabilité === <blockquote> « [...] il n'est pas besoin que je les examine chacune en particulier, ce qui serait d'un travail infini ; mais, parce que la ruine des fondements entraîne nécessairement avec soi tout le reste de l'édifice, je m'attaquerai d'abord aux principes sur lesquels toutes mes anciennes opinions étaient appuyées. » </blockquote> Le second paragraphe énonce la règle qui gouverne l'entreprise. Elle tient en peu de mots : ce qui donne la moindre raison de douter doit être traité comme faux. Le texte latin le dit nettement : « ''non minus accurate ab iis quae non plane certa sunt atque indubitata, quam ab aperte falsis assensionem esse cohibendam'' » (AT VII, 18). Du point de vue de la méthode, il n'y a pas de différence entre ce qui est « manifestement faux » et ce qui n'est « pas entièrement certain et indubitable ». Plutôt que d'examiner ses opinions une à une, ce qui serait sans fin, Descartes vise les principes qui les soutiennent. La métaphore de l'édifice commande cette économie : pour abattre une construction, mieux vaut saper les fondations que démolir les murs un par un. Le fondement à ébranler, ce sont les sens, sur lesquels reposent « toutes les choses que j'ai admises jusqu'à présent comme les plus vraies ». L'attaque vise donc l'empirisme du sens commun et celui de l'École. Une autre image, donnée dans les ''Septièmes Réponses'', éclaire le procédé. Qui possède un panier de pommes et craint que certaines soient gâtées a intérêt à les vider toutes, puis à ne remettre que les saines après examen<ref>Descartes, ''Responsiones VII'', AT VII, p. 481.</ref>. Le tri ne peut se faire qu'après le renversement : tant que les pommes restent empilées, la pomme gâtée se dissimule parmi les bonnes et risque de les corrompre. De même, une croyance fausse logée parmi les vraies se laisse mal repérer et menace l'ensemble ; mieux vaut suspendre l'adhésion à toutes, puis réexaminer chacune. Cette image rend compte du caractère apparemment excessif du doute : son ampleur n'est pas une fin, mais le moyen le plus sûr de ne laisser passer aucune erreur cachée. L'exigence est élevée : non la probabilité, mais l'indubitabilité absolue. Est certain ce qui résiste à tout doute concevable, fût-il improbable. Cette exigence n'a rien d'évident, et Larmore observe qu'un empiriste n'aurait aucune raison de l'adopter : pour Aristote, la perception fonde la connaissance par sa fiabilité dans des conditions normales, non par son infaillibilité<ref>Charles Larmore, art. cité, p. 62-63.</ref>. Pourquoi alors la requérir ? La réponse tient au cadre de l'enquête. Dans la vie ordinaire, où le temps presse et où il faut agir, nous nous en tenons aux croyances suffisamment appuyées. Mais chercher la connaissance pour elle-même est autre chose. C'est ce que Bernard Williams a nommé le point de vue de l'« enquête pure »<ref>Bernard Williams, ''Descartes: The Project of Pure Enquiry'', p. 46-49.</ref>. Larmore éclaire la logique de ce choix<ref>Charles Larmore, art. cité, p. 64.</ref>. Qui poursuit la connaissance a deux buts distincts : acquérir des vérités et éviter des erreurs. Ces buts ne coïncident pas. Qui ne viserait que le premier croirait tout, sans se soucier des faussetés accumulées ; qui ne viserait que le second ne croirait rien, ce qui écarte à coup sûr l'erreur. Les deux options sont déraisonnables, et il faut tenir les deux buts ensemble. Mais ils peuvent entrer en conflit, et Descartes tranche en faveur du second : si le moindre doute suffit à refuser l'assentiment, c'est qu'éviter l'erreur passe avant tout. « La recherche de la vérité » nomme donc mal ce qu'il vise, puisque sa préoccupation première est d'écarter le faux. === Le doute, instrument méthodique === Le traitement « comme faux » est provisoire. Descartes ne juge pas que ses opinions sont fausses ; il décide de les tenir pour telles tant que leur certitude n'est pas établie. La distinction importe : il ne ''nie'' pas ses anciennes opinions, il s'abstient de les ''affirmer''. Nier reviendrait à affirmer le contraire ; s'abstenir, c'est ne rien affirmer. Gueroult parle d'une « exclusion provisoire » des opinions hors du champ de la certitude, non d'un rejet définitif : ce qui a été écarté pourra être réintroduit à son rang dans la « chaîne des raisons »<ref>Martial Gueroult, ''Descartes selon l'ordre des raisons'', t. I, p. 33-34.</ref>. Cette idée de chaîne renvoie à ce que Gueroult tient pour la clé des ''Méditations'', l'« ordre des raisons » (''ordo rationum'') : chaque thèse ne vaut qu'à sa place dans une progression où elle dépend des précédentes et prépare les suivantes<ref>Martial Gueroult, ''op. cit.'', t. I, p. 19-22.</ref>. Le principe du doute occupe, dans cet ordre, le rang premier : il fixe la règle selon laquelle l'examen sera conduit. Mais cette règle est-elle elle-même à l'abri du doute ? Descartes ne la démontre pas ; il la présente comme un commandement de la raison (« la raison me persuade »). On peut y voir une difficulté : si toute évidence est suspecte, comment la règle peut-elle échapper au doute qu'elle prescrit ? La réponse tient à son statut : ce n'est pas une opinion sur le monde, mais une décision de méthode, qui ne prétend rien affirmer et se borne à régler une conduite. Gueroult dégage de ce dispositif quatre caractères du doute, tous solidaires du principe<ref>Martial Gueroult, ''op. cit.'', t. I, p. 33 : « À cette triple nécessité correspondent trois caractères du doute cartésien : il est méthodique, il est universel, il est radical. En outre, son caractère méthodique faisant de lui un simple instrument en vue de fonder la certitude du savoir, c'est-à-dire le dogmatisme de la science, il en résulte un quatrième caractère : le doute cartésien est provisoire. »</ref>. Le doute est méthodique : non un sentiment d'incertitude, mais une décision au service d'un objectif, fonder la certitude du savoir. Il est universel : rien n'en est exempté tant que le doute n'est pas « radicalement impossible ». Il est radical : les opinions douteuses ne sont pas mises entre parenthèses, mais rejetées entièrement. Il est provisoire : son caractère d'instrument l'ordonne à la reconstruction, et les opinions écartées pourront retrouver leur place une fois les fondements établis. Une fiction soutient ce traitement. Pour contrebalancer la force des opinions probables, Descartes décide de « feindre » que tout est faux. Gassendi, puis Huet, objecteront que traiter une opinion comme fausse, c'est en acquérir une autre, et que tenir pour fausses des opinions en partie vraies, c'est se tromper plutôt que l'éviter<ref>Pierre Gassendi, ''Cinquièmes Objections'', AT VII, p. 257-258. Cf. Charles Larmore, « Descartes and Skepticism », dans Stephen Gaukroger (dir.), ''The Blackwell Guide to Descartes' Meditations'', p. 24-25.</ref>. Descartes répond en distinguant le jugement de la fiction : feindre que ses opinions sont fausses n'est pas juger qu'elles le sont, mais procéder comme un géomètre qui suppose certaines propriétés pour les besoins d'une démonstration. Gueroult rapproche cette fiction des constructions auxiliaires de la géométrie<ref>Martial Gueroult, ''op. cit.'', t. I, p. 39.</ref>. Le malin génie sera l'aboutissement de ce procédé. Une telle décision suppose enfin une certaine conception de l'assentiment : pour Descartes, tenir une proposition pour vraie est un acte de la volonté, non une réponse passive de l'intellect. C'est ce qui rend le doute possible. L'entendement incline à affirmer ce qui paraît clair, mais la volonté, « infinie » en son genre, peut s'opposer à cette inclination et suspendre l'assentiment. Le doute est en ce sens un effort à contre-courant des tendances spontanées<ref>Cette conception de l'assentiment sera développée dans la Quatrième Méditation. Cf. Martial Gueroult, ''op. cit.'', t. I, p. 39.</ref>. Reste que ce principe s'inscrit dans la tradition sceptique tout en s'en séparant par sa fin. Comme le note Deborah Brown, on tient communément que Descartes n'introduit pas d'argument sceptique nouveau, mais que son usage proprement méthodique du scepticisme est, lui, inédit<ref>Deborah Brown, « Descartes and Content Skepticism », dans Karen Detlefsen (dir.), ''op. cit.'', p. 25-26.</ref>. Les Anciens visaient la tranquillité de l'âme (''ataraxia'') par la suspension du jugement ; Descartes vise des certitudes qui résistent à tous les doutes. Pour eux le doute était une fin et la suspension un terme ; pour lui le doute est un moyen et la suspension un passage. == II. Le doute sur les sens (§ 3-4) == === L'erreur des sens === <blockquote> « Tout ce que j'ai reçu jusqu'à présent pour le plus vrai et assuré, je l'ai appris des sens, ou par les sens ; or j'ai quelquefois éprouvé que ces sens étaient trompeurs, et il est de la prudence de ne se fier jamais entièrement à ceux qui nous ont une fois trompés. » </blockquote> Le premier argument est simple. Les sens nous ont parfois trompés ; or il n'est pas prudent de se fier entièrement à qui nous a déjà trompés ; donc les sens ne méritent pas une confiance entière. Le principe de prudence est emprunté au domaine moral, où l'on se méfie d'un témoin qui a menti, et transposé aux facultés. La distinction « des sens, ou par les sens » (''a sensibus, vel per sensus'') vaut d'être notée : certaines croyances viennent directement de la perception, d'autres indirectement, par le témoignage, les livres ou l'enseignement, qui passent tous par l'ouïe ou la vue. Ordinairement, ce principe n'a pas une portée si stricte : un ami qui enjolive la vérité ne perd pas toute crédibilité, et nous distinguons les contextes où une source est fiable de ceux où elle ne l'est pas. Si Descartes l'applique sans réserve, c'est en vertu de l'exigence qu'il s'est donnée : pour qui cherche l'indubitable, le moindre risque d'erreur disqualifie une source. La portée de l'argument reste pourtant limitée, et Descartes le reconnaît : les illusions concernent surtout les « choses peu sensibles et fort éloignées ». La tour paraît ronde parce qu'elle est loin ; le bâton paraît brisé parce que la réfraction déforme son image. Ces exemples reprennent ce que les sceptiques anciens nommaient les « tropes » de la suspension du jugement. Sextus Empiricus avait catalogué les variations de la perception selon les conditions ; c'est surtout le cinquième trope, celui « des positions, des distances et des lieux », que Descartes mobilise ici sans le nommer<ref>Sur la dette envers le scepticisme ancien, voir Thomas M. Lennon et Michael W. Hickson, « The Skepticism of the First Meditation », dans Karen Detlefsen (dir.), ''op. cit.'', p. 9-24, ainsi que Charles Larmore, « Descartes and Skepticism », p. 17-29.</ref>. Mais il n'en tire pas la conclusion pyrrhonienne : la faillibilité des sens n'est, pour lui, qu'une étape vers un fondement plus ferme. Que les sens trompent dans des conditions défavorables suggère une parade : peut-être sont-ils fiables pour les objets proches, de taille moyenne, perçus dans de bonnes conditions. Descartes formule lui-même cette objection. === L'évidence sensible et l'écart de la folie === <blockquote> « Mais, encore que les sens nous trompent quelquefois, touchant les choses peu sensibles et fort éloignées, il s'en rencontre peut-être beaucoup d'autres, desquelles on ne peut pas raisonnablement douter, quoique nous les connaissions par leur moyen : par exemple, que je sois ici, assis auprès du feu, vêtu d'une robe de chambre, ayant ce papier entre les mains, et autres choses de cette nature. » </blockquote> La scène du philosophe auprès du feu rassemble tout ce qui garantit une perception fiable : la proximité des objets, leur taille moyenne, des conditions d'observation normales, des objets familiers, la convergence des sens (il voit le feu, en sent la chaleur, touche le papier) et l'implication de son propre corps. La situation est ordinaire et chacun peut s'y reconnaître ; elle fonctionne comme un cas limite. Si les sens ne sont pas fiables ici, le seront-ils jamais ? Cette objection a une valeur pédagogique. En la formulant, Descartes donne voix à la résistance que tout lecteur oppose spontanément au doute : « les sens me trompent peut-être de loin, mais non sur ce que je perçois ici et maintenant ». Loin de l'écarter, il la prend au sérieux et la pousse à son point le plus fort, pour mieux la dépasser ensuite par l'argument du rêve. Le lecteur ne subit donc pas le doute de l'extérieur : il le voit naître de ses propres certitudes. Pour douter de telles évidences, il faudrait être fou. Descartes évoque alors la folie (''amentia'', ''dementia''), décrite selon la médecine de son temps : un cerveau « troublé et offusqué par les noires vapeurs de la bile », c'est-à-dire la mélancolie née de l'atrabile. Les exemples illustrent deux délires, l'un portant sur les circonstances (se croire roi quand on est pauvre), l'autre sur le corps propre (s'imaginer de verre). Le délire du « corps de verre » était un trouble bien repéré à l'époque, dont le cas le plus fameux est celui de Charles VI de France, mais Descartes reprend un exemple devenu courant dans la littérature médicale. Il écarte aussitôt l'hypothèse : « Mais quoi ? ce sont des fous ; et je ne serais pas moins extravagant, si je me réglais sur leurs exemples. » Ce rejet a nourri d'importants débats. Trois lectures se complètent. Pour la lecture méthodologique, l'hypothèse de la folie détruirait la raison elle-même : un fou ne raisonne pas, et l'entreprise des ''Méditations'' suppose un lecteur capable de suivre des arguments ; prendre la folie au sérieux reviendrait à arrêter l'ouvrage avant de l'avoir commencé<ref>Cette lecture remonte à Harry Frankfurt, ''Demons, Dreamers, and Madmen: The Defense of Reason in Descartes' Meditations'', Indianapolis, Bobbs-Merrill, 1970. Elle est reprise par Fred Ablondi (2007) ; David Scott (2009) lui oppose l'idée que la folie est prise au sérieux et reversée dans l'argument du rêve. On trouvera la discussion dans Lennon et Hickson, art. cité, p. 12-14.</ref>. Pour la lecture par l'universalité, proposée par Lennon et Hickson, l'argument de la folie manque de généralité : il fait voir que certains, parfois, sont trompés, là où l'argument du rêve fera voir que tous, parfois, le sont ; supposer que les vapeurs ont gagné toutes les têtes serait soi-même un signe de folie<ref>Thomas M. Lennon et Michael W. Hickson, art. cité, p. 11-16.</ref>. Pour la lecture dialogique de Larmore, enfin, celui qui rejette la folie n'est pas Descartes, mais le méditant empiriste qui croit encore aux sens : de son point de vue, écarter un cas pathologique est raisonnable<ref>Charles Larmore, « Descartes and Skepticism », p. 22-24, qui reconstruit la méditation comme un dialogue entre un empiriste et un sceptique.</ref>. Michel Foucault et Jacques Derrida ont mené sur ce passage une controverse restée fameuse. Pour Foucault, le rejet de la folie marque le geste par lequel l'âge classique exclut la déraison du champ de la pensée légitime<ref>Michel Foucault, ''Histoire de la folie à l'âge classique'', Paris, Gallimard, 1972 (1<sup>re</sup> éd. 1961), notamment p. 56-59.</ref>. Pour Derrida, au contraire, le ''cogito'' résiste même à l'hypothèse de la folie : que je sois fou ou non, je pense, donc je suis ; la folie n'est pas exclue mais débordée par le doute, qui ira jusqu'à envisager une tromperie atteignant même les esprits sains<ref>Jacques Derrida, « Le Cogito et l'histoire de la folie », dans ''L'Écriture et la différence'', Paris, Seuil, 1967, p. 51-97. Foucault répondra à Derrida dans « Mon corps, ce papier, ce feu », repris en appendice de l'''Histoire de la folie''.</ref>. == III. L'argument du rêve (§ 5) == === L'indiscernabilité de la veille et du sommeil === <blockquote> « Toutefois j'ai ici à considérer que je suis homme, et par conséquent que j'ai coutume de dormir et de me représenter en mes songes les mêmes choses, ou quelquefois de moins vraisemblables, que ces insensés, lorsqu'ils veillent. » </blockquote> Ce que Descartes refusait d'envisager comme folie, il l'accepte comme rêve. Le déplacement est subtil et tient à un mot : « je suis homme ». La folie frappe certains ; le rêve est le lot de tous. Chaque nuit, l'homme vit en songe des expériences semblables à celles des fous, et même de moins vraisemblables. L'argument quitte ainsi le pathologique pour le commun, ce que l'argument de la folie ne pouvait faire. <blockquote> « Combien de fois m'est-il arrivé de songer, la nuit, que j'étais en ce lieu, que j'étais habillé, que j'étais auprès du feu, quoique je fusse tout nu dedans mon lit ? » </blockquote> Le parallèle avec la scène du feu est exact : les détails mêmes qui semblaient garantir la réalité de l'expérience (le lieu, les vêtements, le feu) peuvent figurer dans un rêve. Le songe reproduit les conditions de l'évidence sensible. Descartes tente une résistance, en invoquant la clarté de la perception présente, le sentiment du mouvement volontaire, la netteté des sensations : « c'est avec dessein et de propos délibéré que j'étends cette main ». Mais le souvenir de rêves passés ruine ces critères : on a déjà cru, en songe, percevoir clairement et agir volontairement. <blockquote> « [...] je vois si manifestement qu'il n'y a point d'indices certains par où l'on puisse distinguer nettement la veille d'avec le sommeil, que j'en suis tout étonné ; et mon étonnement est tel, qu'il est presque capable de me persuader que je dors. » </blockquote> La conclusion est célèbre : aucun « indice certain » (''indicium certum'') ne permet de distinguer, du dedans de l'expérience, la veille du sommeil. Descartes ne dit pas qu'il n'y a aucune différence, mais qu'il n'y a pas de marque ''infaillible'', accessible au rêveur pendant qu'il rêve. La force de l'argument tient à ce que le rêve peut imiter toutes les propriétés de la veille : sa vivacité, sa cohérence apparente, le sentiment du contrôle. L'étonnement (le latin dit ''obstupescam'') n'est pas ici l'émerveillement serein qui, chez Aristote, donne naissance à la philosophie ; c'est un vertige, le trouble d'un esprit qui ne trouve plus d'appui pour départager le songe de la veille, et c'est ce déséquilibre qui fait avancer le doute. Il faut préciser ce que l'argument met en doute. Comme le souligne Larmore, il porte sur la question « puis-je savoir, à cet instant, que je suis éveillé ? », et non sur la question « l'expérience de veille est-elle véridique ? »<ref>Charles Larmore, « Descartes and Skepticism », p. 22-23 : le doute du rêve concerne d'un bout à l'autre la différence entre veille et sommeil, et sa résolution consiste à montrer comment établir que l'on veille.</ref>. Il présuppose donc que si je veille, mes perceptions d'objets proches sont véridiques ; ce qu'il conteste, c'est ma capacité à établir que je veille. Cette précision commande la résolution ultérieure : Descartes ne soutiendra pas que les perceptions de veille sont toujours vraies, mais montrera comment distinguer les deux états. L'argument semble pourtant se heurter à un paradoxe. Pour le formuler, Descartes doit savoir ce que « rêver » et « veiller » veulent dire, et se souvenir d'avoir rêvé ; or comment le saurait-il s'il ne pouvait distinguer les deux états ? Hatfield répond qu'il n'a pas à prouver l'existence de cas réels de veille : il lui suffit que le lecteur comprenne la possibilité de l'indiscernabilité<ref>Gary Hatfield, ''Descartes and the Meditations'', p. 75-77.</ref>. Descartes ne cherche pas à établir qu'on rêve toujours, mais à instiller un doute sur notre capacité à savoir, à un moment donné, si l'on veille. === Portée et limites de l'argument === L'argument, une fois admis, peut s'étendre. Si je ne puis être certain de ne pas rêver, alors les objets que je crois percevoir pourraient ne pas exister ; et l'on peut aller plus loin, en supposant que « peut-être nos mains, ni tout notre corps, ne sont pas tels que nous les voyons ». Le doute atteint le corps propre. Descartes ne pousse pas aussitôt cette extension à son terme : il introduit l'analogie du peintre, qui en marque la limite et fait transition vers les natures simples. L'argument du rêve a des précédents antiques : il figurait parmi les tropes pyrrhoniens, et Cicéron rapporte que les Académiciens tenaient qu'aucune impression n'est telle qu'une impression semblable ne pût venir d'une autre source<ref>Sur les précédents, voir Lennon et Hickson, art. cité, p. 17-20.</ref>. Mais l'usage cartésien diffère sur trois points. La fin d'abord : instrument d'un projet dogmatique, non chemin vers l'''ataraxia''. La portée ensuite : le scepticisme antique ne mettait pas en doute l'existence du monde, que l'argument cartésien, joint aux suivants, finira par atteindre. Le statut enfin : provisoire et destiné à être surmonté. Descartes reconnaissait lui-même que ces doutes n'étaient pas neufs, parlant de « réchauffer un vieux chou », mais il les pliait à une fin nouvelle<ref>Charles Larmore, « Descartes and Skepticism », p. 18-19.</ref>. === La résolution de la Sixième Méditation === L'argument n'est pas abandonné : il sera résolu dans la Sixième Méditation, après que la véracité divine aura été établie. Le critère proposé est la cohérence mémorielle. <blockquote> « Je remarque maintenant qu'il y a une grande différence entre les deux, en ce que jamais les rêves ne sont liés par la mémoire avec toutes les autres actions de la vie, comme le sont les choses qui arrivent à celui qui veille. [...] Lorsque je perçois distinctement d'où viennent les choses, où et quand elles me parviennent, et que je peux rattacher mes perceptions au reste de ma vie sans interruption, alors je suis tout à fait certain qu'en les rencontrant je ne suis pas endormi mais éveillé. » (AT VII, 89-90) </blockquote> Les expériences de veille s'enchaînent et se relient à l'ensemble de la vie par la mémoire ; les rêves sont fragmentaires et déconnectés. Ce critère ne relève pas des sens seuls, mais de l'intellect et de la mémoire, ce qui explique qu'il n'était pas disponible pour l'empiriste de la Première Méditation. La résolution illustre ainsi la thèse maîtresse de l'œuvre : la connaissance ne repose pas sur les sens, mais sur l'activité judicative de l'intellect<ref>Sur cette lecture, voir David Cunning (dir.), ''The Cambridge Companion to Descartes' Meditations'', notamment l'analyse de Larmore selon laquelle ces lignes sont le moment où le « je » parle enfin pleinement la voix de Descartes.</ref>. La résolution n'est pas sans difficultés. Ne pourrait-on rêver que le critère est satisfait, rêver d'une vie cohérente ? Descartes admet que la pression des affaires ne laisse pas toujours le temps de vérifier, et que des erreurs surviennent. Hatfield observe qu'il n'avait sans doute pas besoin d'une certitude absolue dans tous les cas : son but premier était d'établir les vérités de la métaphysique, qui ne dépendent pas des sens ; pour le reste, il suffit que les sens soient fiables dans l'ensemble et que leurs rapports puissent être recoupés<ref>Gary Hatfield, ''Descartes and the Meditations'', p. 276-277.</ref>. == IV. Les natures simples et l'analogie du peintre (§ 6-8) == === Ce qui résiste au doute du rêve === <blockquote> « Toutefois il faut au moins avouer que les choses qui nous sont représentées dans le sommeil sont comme des tableaux et des peintures, qui ne peuvent être formées qu'à la ressemblance de quelque chose de réel et de véritable. » </blockquote> L'analogie du peintre oppose une contre-objection au doute. Même un peintre qui invente des sirènes ou des satyres compose ses figures à partir d'éléments réels, en mêlant des membres empruntés à des animaux existants. De même, le rêve le plus extravagant présuppose des éléments simples qui, eux, doivent avoir quelque réalité. <blockquote> « [...] à tout le moins les couleurs dont ils le composent doivent-elles être véritables. » </blockquote> Descartes envisage le cas limite d'une invention entièrement nouvelle : même alors, les « couleurs », c'est-à-dire les éléments les plus simples de la composition, doivent être véritables. Il en tire la liste des natures simples qui résistent au doute du rêve : <blockquote> « De ce genre de choses est la nature corporelle en général, et son étendue ; ensemble la figure des choses étendues, leur quantité ou grandeur, et leur nombre ; comme aussi le lieu où elles sont, le temps qui mesure leur durée, et autres semblables. » </blockquote> Ces notions, étendue, figure, grandeur, nombre, lieu, temps, sont communes à tout ce qui peut être représenté, réel ou imaginaire ; elles forment le matériau de toute représentation possible. On notera que Descartes retient l'extension spatiale et la durée, mais non la couleur, parmi ces éléments premiers : il annonce ainsi, sans l'argumenter encore, sa thèse ultérieure selon laquelle la couleur n'est pas une propriété première des corps. Si cette réduction paraît naturelle au méditant, il est déjà en chemin vers le cartesianisme ; sinon, il peut passer outre et poursuivre<ref>Gary Hatfield, ''Descartes and the Meditations'', p. 78-79.</ref>. === La hiérarchie des sciences === <blockquote> « [...] la physique, l'astronomie, la médecine, et toutes les autres sciences qui dépendent de la considération des choses composées, sont fort douteuses et incertaines ; mais [...] l'arithmétique, la géométrie, et les autres sciences de cette nature, qui ne traitent que de choses fort simples et fort générales, sans se mettre beaucoup en peine si elles sont dans la nature, ou si elles n'y sont pas, contiennent quelque chose de certain et d'indubitable. » </blockquote> Le doute du rêve établit une partition. Les sciences des choses composées (physique, astronomie, médecine) dépendent de l'existence réelle de leurs objets ; elles sont donc atteintes. Les sciences des choses simples (arithmétique, géométrie) ne traitent que de relations entre concepts, indépendamment de toute existence : « soit que je veille ou que je dorme, deux et trois joints ensemble formeront toujours le nombre de cinq, et le carré n'aura jamais plus de quatre côtés ». Ces vérités paraissent inattaquables. Descartes semble avoir atteint un point fixe. Mais la formule « il ne semble pas possible » (''nec fieri posse videtur'') laisse entendre que cette impossibilité n'est qu'apparente : le doute n'est pas à son terme. == V. L'hypothèse du Dieu trompeur (§ 9-12) == === La toute-puissance et le doute sur les mathématiques === <blockquote> « Toutefois il y a longtemps que j'ai dans mon esprit une certaine opinion, qu'il y a un Dieu qui peut tout, et par qui j'ai été créé et produit tel que je suis. Or qui me peut avoir assuré que ce Dieu n'ait point fait qu'il n'y ait aucune terre, aucun ciel, aucun corps étendu [...] et que néanmoins j'aie les sentiments de toutes ces choses ? » </blockquote> L'hypothèse du Dieu trompeur porte le doute jusqu'aux vérités que le rêve épargnait. Elle s'appuie sur une opinion ancienne et reçue, non sur une connaissance : « une certaine opinion » selon laquelle un Dieu tout-puissant m'a créé. Si Dieu peut tout, rien ne l'empêche en principe de me faire éprouver un monde qui n'existe pas, ni même de me faire faillir dans les opérations les plus simples. <blockquote> « [...] il se peut faire qu'il ait voulu que je me trompe toutes les fois que je fais l'addition de deux et de trois, ou que je nombre les côtés d'un carré [...]. » </blockquote> Le doute atteint désormais les mathématiques. On peut, avec Hatfield, distinguer deux ressorts dans ce passage<ref>Gary Hatfield, « The Cartesian Circle », dans Stephen Gaukroger (dir.), ''The Blackwell Guide to Descartes' Meditations'', p. 126-127.</ref>. Selon le premier, le Dieu trompeur ''intervient'' à chaque opération pour fausser mon calcul : ma faculté de raisonner ne serait pas en cause, mais ses résultats deviendraient inutilisables, comme si une influence imperceptible me faisait tenir pour vrai que deux et trois ne font pas cinq. Selon le second, plus profond, c'est ma faculté de raisonner elle-même qui aurait été ''mal conçue'', de sorte qu'elle produirait régulièrement des résultats faux que je croirais pourtant assurés. Je serais alors comme une machine à calculer au mécanisme défectueux. C'est ce point culminant qui rend le doute « hyperbolique » : non seulement le monde, mais les évidences rationnelles les plus fermes deviennent suspectes. === Bonté divine et hypothèse athée === <blockquote> « Mais peut-être que Dieu n'a pas voulu que je fusse déçu de la sorte, car il est dit souverainement bon. » </blockquote> Une objection théologique se présente : un Dieu souverainement bon ne saurait vouloir me tromper. Mais elle se retourne. Si la bonté divine est incompatible avec une tromperie permanente, pourquoi serait-elle compatible avec une tromperie occasionnelle ? Or nous nous trompons parfois ; c'est un fait. La bonté de Dieu ne suffit donc pas à garantir l'absence d'erreur, et le doute subsiste. <blockquote> « Il y aura peut-être ici des personnes qui aimeront mieux nier l'existence d'un Dieu si puissant, que de croire que toutes les autres choses sont incertaines. » </blockquote> L'athéisme n'offre pas d'échappatoire ; il aggrave la situation. Descartes renforce le second ressort du doute en considérant les origines que l'incroyant pourrait substituer à Dieu : « quelque destin ou fatalité », le « hasard », ou « une continuelle suite et liaison des choses »<ref>Sur ces trois hypothèses d'origine, voir Gary Hatfield, « The Cartesian Circle », p. 127.</ref>. Quelle que soit la cause supposée, moins elle est parfaite, plus il est probable que son effet, moi, soit imparfait et porté à l'erreur. Faillir étant une imperfection, un auteur moins puissant qu'un Dieu parfait laisse craindre une faculté plus défaillante encore. Sans un Dieu parfait pour garantir mes facultés, je suis livré à une imperfection peut-être sans remède. Ce premier mouvement du doute trouve ici sa conclusion : <blockquote> « [...] je suis contraint d'avouer que, de toutes les opinions que j'avais autrefois reçues en ma créance pour véritables, il n'y en a pas une de laquelle je ne puisse maintenant douter, non par aucune inconsidération ou légèreté, mais pour des raisons très fortes et mûrement considérées : de sorte qu'il est nécessaire que j'arrête et suspende désormais mon jugement sur ces pensées [...]. » (AT VII, 21-22) </blockquote> Le résultat est sans reste : aucune des anciennes opinions n'échappe au doute. Descartes insiste sur la qualité de cette suspension, qui ne procède d'aucune « légèreté », mais de « raisons très fortes et mûrement considérées ». La formule « arrêter et suspendre mon jugement » retrouve le vocabulaire de l'''epochè'' sceptique, mais la fin reste opposée : on suspend pour pouvoir ensuite établir, non pour demeurer dans la suspension. == VI. Le malin génie (§ 13-15) == === La résistance des anciennes opinions et le choix de feindre === Avant d'introduire le malin génie, Descartes constate que la suspension du jugement ne tient pas d'elle-même. <blockquote> « Mais il ne suffit pas d'avoir fait ces remarques, il faut encore que je prenne soin de m'en souvenir ; car ces anciennes et ordinaires opinions me reviennent encore souvent en la pensée, le long et familier usage qu'elles ont eu avec moi leur donnant droit d'occuper mon esprit contre mon gré, et de se rendre presque maîtresses de ma créance. » </blockquote> La remarque est de psychologie épistémique. Les opinions tiennent leur force de l'habitude : elles reviennent « contre mon gré », et le « long et familier usage » leur confère un « droit », presque juridique, d'occuper l'esprit. L'esprit apparaît comme un champ de forces où la volonté de douter doit lutter contre l'inertie des croyances établies. <blockquote> « Et je ne me désaccoutumerai jamais d'y acquiescer [...] tant que je les considérerai telles qu'elles sont en effet, c'est à savoir en quelque façon douteuses [...] et toutefois fort probables, en sorte que l'on a beaucoup plus de raison de les croire que de les nier. » </blockquote> Descartes reconnaît que ces opinions sont « fort probables » : il serait plus raisonnable de les croire que de les nier. Mais la probabilité n'est pas la certitude, et le probable, pour les besoins de la recherche, doit être traité comme le faux. D'où la décision : <blockquote> « C'est pourquoi je pense que j'en userai plus prudemment, si, prenant un parti contraire, j'emploie tous mes soins à me tromper moi-même, feignant que toutes ces pensées sont fausses et imaginaires. » </blockquote> La solution est paradoxale : pour neutraliser la force des opinions probables, Descartes choisit de se tromper volontairement, en feignant que tout est faux. C'est le passage du doute simplement méthodique au doute hyperbolique assumé : il ne s'agit plus de suspendre le jugement, mais d'adopter activement la position contraire aux croyances naturelles. L'image de la balance éclaire ce choix : l'esprit penche du côté des préjugés ; pour rétablir l'équilibre, donc l'impartialité du jugement, il faut peser de l'autre côté. Le malin génie sera l'instrument de ce contrepoids. === L'invention d'une fiction === <blockquote> « Je supposerai donc qu'il y a, non point un vrai Dieu, qui est la souveraine source de vérité, mais un certain mauvais génie, non moins rusé et trompeur que puissant, qui a employé toute son industrie à me tromper. » </blockquote> Le malin génie (''genius malignus'') prolonge l'hypothèse précédente en écartant sa difficulté théologique. L'idée d'un Dieu trompeur heurte la notion de Dieu comme source de vérité ; le malin génie est une entité maléfique dont l'unique raison d'être est de tromper. Sa portée est totale : le ciel, l'air, la terre, les couleurs, les figures, les sons, et jusqu'au corps propre, « point de mains, point d'yeux, point de chair », tout peut être illusion. Seule subsiste une croyance, fausse mais réelle : « croyant faussement avoir toutes ces choses ». Le chemin vers le ''cogito'' est préparé, sans être encore ouvert. Pourquoi cette substitution ? Le malin génie n'est pas une thèse sur l'existence d'un trompeur, mais une fiction méthodique destinée à maintenir le doute à son intensité maximale. Gueroult a montré que cette fiction se distingue de l'hypothèse d'un Dieu trompeur sur un point précis. Bien compris, le concept de toute-puissance exclut la tromperie : vouloir tromper relève de la faiblesse (''imbecillitas'') autant que de la malice, et le Souverain Être ne peut se porter vers le non-être qu'est la tromperie. Un Dieu trompeur est donc une supposition contradictoire. Le malin génie évite cette contradiction parce qu'il n'est pas tout-puissant : il est « extrêmement puissant », mais le texte ajoute, à propos de sa malice, « si je l'ose dire » (''si fas est dicere''), comme pour signaler qu'on ne saurait joindre sans réserve la toute-puissance et la méchanceté<ref>Martial Gueroult, ''op. cit.'', t. I, p. 43-45, qui s'appuie notamment sur l'''Entretien avec Burman'' (AT V, p. 147 et 150-151) : « la toute-puissance et la méchanceté ne peuvent aller ensemble ». L'hypothèse du malin génie est, pour Gueroult, « le type des suppositions impossibles ou absurdes », rendue possible seulement parce que le vrai Dieu n'est encore que confusément connu.</ref>. La fiction n'est recevable que tant que la vraie nature de la toute-puissance divine demeure confusément connue ; une fois celle-ci clairement comprise, elle se dissipe d'elle-même. <blockquote> « [...] si, par ce moyen, il n'est pas en mon pouvoir de parvenir à la connaissance d'aucune vérité, à tout le moins il est en ma puissance de suspendre mon jugement. » </blockquote> Descartes affirme sa résolution avec fermeté. Même si aucune vérité ne peut être atteinte, la suspension du jugement reste possible, et c'est un gain : qui ne croit rien ne croit rien de faux. Le malin génie ne peut « rien imposer » à qui refuse tout assentiment. On voit ici le rôle de la volonté : le doute n'est pas un état subi, mais un acte par lequel l'esprit se met en garde contre les ruses du trompeur. === La difficulté de maintenir le doute === <blockquote> « Mais ce dessein est pénible et laborieux, et une certaine paresse m'entraîne insensiblement dans le train de ma vie ordinaire. » </blockquote> La méditation s'achève sur un aveu de difficulté. Tenir le doute est « pénible et laborieux », et une « paresse » naturelle ramène vers la vie ordinaire, où l'on ne doute de rien. Le doute hyperbolique exige un effort soutenu, une tension constante contre les pentes spontanées de l'esprit. <blockquote> « Et tout de même qu'un esclave qui jouissait dans le sommeil d'une liberté imaginaire [...] craint d'être réveillé, et conspire avec ces illusions agréables pour en être plus longuement abusé, ainsi je retombe insensiblement de moi-même dans mes anciennes opinions, et j'appréhende de me réveiller. » </blockquote> La comparaison finale est riche. L'esclave qui rêve de liberté ne veut pas se réveiller ; il préfère l'illusion agréable à la réalité pénible. Nous préférons de même nos croyances confortables à l'inconfort du doute. Mais l'image porte aussi une promesse : se réveiller, c'est découvrir sa condition réelle, premier pas vers une émancipation possible. La méditation se clôt pourtant sur une incertitude, Descartes craignant que l'effort de réflexion ne suffise pas à dissiper les « ténèbres » du doute. Cette fin ouverte appelle la suite : la Seconde Méditation apportera une première lumière. == VII. Conclusion == === Le bilan du doute === La Première Méditation a conduit un travail de démolition ordonnée. Toutes les sources de connaissance ont été éprouvées : les sens, par l'argument de leur faillibilité ; l'imagination, par l'argument du rêve ; l'entendement lui-même, par l'hypothèse du Dieu trompeur et du malin génie. Le doute a progressé par paliers, du plus superficiel au plus profond : faillibilité des sens, possibilité du rêve, puis possibilité qu'un être tout-puissant nous trompe sur tout, y compris les mathématiques. Chaque palier englobe et approfondit le précédent. Le doute cartésien se reconnaît à quelques traits qui le séparent du scepticisme antique : il est méthodique, instrument au service de la vérité et non fin en soi ; hyperbolique, puisqu'il traite le simplement douteux comme certainement faux ; provisoire, destiné à être surmonté ; volontaire, acte par lequel l'esprit résiste à ses propres inclinations. === Du doute au cogito === Le doute le plus poussé a isolé un élément qui lui résiste : l'acte même de douter. En supposant que je n'ai pas de corps, je suppose que je crois faussement en avoir un ; mais cette croyance, vraie ou fausse, existe. L'existence de la pensée est présupposée par le doute lui-même. La Seconde Méditation exploitera cette brèche. Un point mérite ici d'être précisé, car il prête souvent à confusion. La formule « je pense, donc je suis » (''cogito, ergo sum'') ne figure pas dans les ''Méditations'' de 1641. Sa version française, « je pense donc je suis », appartient au ''Discours de la méthode'' de 1637 ; sa version latine apparaît dans les ''Principes de la philosophie'' de 1644<ref>''Historical Dictionary of Descartes and Cartesian Philosophy'', art. « Cogito ergo sum », p. 80-81 ; ''Principia'', I, art. 7 et 10.</ref>. Dans la Seconde Méditation, l'énoncé est différent et plus précis : <blockquote> « [...] il faut enfin conclure, et tenir pour constant que cette proposition : Je suis, j'existe, est nécessairement vraie, toutes les fois que je la prononce, ou que je la conçois en mon esprit. » (AT VII, 25) </blockquote> La formulation méditative (''ego sum, ego existo'') ajoute deux précisions à l'adage familier : c'est la vérité d'une ''conception'' qui est en jeu, et cette vérité ne vaut qu'''au moment'' où je la conçois ou la prononce<ref>Gary Hatfield, ''Descartes and the Meditations'', p. 101-102 ; ''Historical Dictionary'', art. cité, p. 80-81.</ref>. Cette restriction temporelle n'est pas un détail : elle commande la réponse que Descartes apportera au « cercle cartésien », en distinguant l'évidence présente d'une perception et le souvenir qu'on en garde. Larmore note d'ailleurs que le ''cogito'' n'entre pas comme un argument que Descartes avance en son nom, mais comme une vérité que le sceptique lui-même ne peut éluder : en doutant, il pense, donc il existe, et se contredit s'il prétend suspendre tout jugement<ref>Charles Larmore, « Descartes and Skepticism », p. 24-25.</ref>. La proposition que nul ne peut refuser devient alors une vérité que chacun reconnaît pour son compte. === Héritage === L'influence de la Première Méditation sur la philosophie moderne a été considérable. On lui rattache souvent l'essor d'une « philosophie du sujet » et la primauté de l'épistémologie sur la métaphysique. La formule est commode, mais elle demande de la mesure. Le geste cartésien ne surgit pas de rien : il prolonge l'examen de soi augustinien, les débats de la scolastique tardive, le scepticisme renaissant de Montaigne et de Charron, et la tradition des exercices spirituels. Plutôt que d'inaugurer seul un commencement absolu, Descartes ressaisit et réoriente un héritage. Ce qui lui revient en propre, c'est d'avoir fait de l'examen méthodique des fondements le passage obligé de toute connaissance, et d'avoir donné à la certitude du sujet une fonction qu'elle n'avait pas eue jusque-là. Les arguments du doute ont été repris et discutés par les philosophes ultérieurs. L'argument du rêve est devenu un lieu classique de l'épistémologie. L'hypothèse du malin génie a connu des reformulations contemporaines, du « cerveau dans une cuve » aux fictions de la simulation. La question que pose Descartes, celle de savoir comment distinguer l'illusion de la réalité, garde toute son actualité. == Notes et références == {{Références|colonnes=2}} [[Catégorie:Méditations métaphysiques]] [[Catégorie:René Descartes]] [[Catégorie:Commentaire philosophique]] lh4pzb08d1e7nnpla18h2vekejvcyd7 768107 768094 2026-06-18T19:31:57Z PandaMystique 119061 768107 wikitext text/x-wiki {| style="width: 100%; border-top: 3px solid #3366cc; border-bottom: 1px solid #ddd; background: #fafafa; margin: 1em 0; font-size: 90%;" |- | style="padding: 8px 12px;" | ← [[Méditations métaphysiques|Sommaire]] | style="padding: 8px 12px; text-align: center;" | René Descartes, '''''[[Méditations métaphysiques]]'''''<br />'''[[Méditations métaphysiques/Première méditation : Des choses que l'on peut révoquer en doute|<big>Première méditation</big> :<br />Des choses que l'on peut révoquer en doute]]''' | style="padding: 8px 12px; text-align: right;" | [[Méditations métaphysiques/Méditation seconde : De la nature de l'esprit humain ; et qu'il est plus aisé à connaître que le corps|Méditation II]] → |} La Première Méditation ouvre les ''Méditations métaphysiques'' et pose les fondations de tout l'édifice qui suivra. Son titre, « Des choses que l'on peut révoquer en doute », annonce le projet : non pas établir des vérités, mais mettre à l'épreuve tout ce que l'on tient pour vrai. Cette méditation met en place le « doute méthodique », parfois appelé « doute hyperbolique » à son point extrême, une démarche dont l'influence sur la philosophie moderne a été profonde. Il faut situer ce projet dans son contexte. Au {{sc|xvii}}<sup>e</sup> siècle, la science nouvelle de Galilée et de Kepler contribue à déplacer l'autorité des cadres scolastiques : les mêmes principes ne suffisent plus à rendre compte des phénomènes, et la confiance dans l'enseignement reçu s'effrite. Descartes entreprend de refonder l'ensemble des connaissances sur des bases assurées ; la Première Méditation en constitue le moment négatif, celui de la démolition préalable. La marche du texte est ordonnée. Le doute progresse par paliers, chaque niveau englobant le précédent : exposition du projet (§ 1-2), faillibilité des sens (§ 3-4), argument du rêve (§ 5), distinction entre sciences composées et sciences simples (§ 6-8), hypothèse du Dieu trompeur (§ 9-12), puis du malin génie et difficulté à maintenir le doute (§ 13-15). Cette progression conduit à une suspension du jugement qui prépare la découverte du ''cogito'' dans la Seconde Méditation. == I. Le projet de refondation du savoir (§ 1-2) == === L'incipit : un commencement à la première personne === <blockquote> « Il y a déjà quelque temps que je me suis aperçu que, dès mes premières années, j'avais reçu quantité de fausses opinions pour véritables, et que ce que j'ai depuis fondé sur des principes si mal assurés, ne pouvait être que fort douteux et incertain. » </blockquote> L'œuvre s'ouvre sur un constat rétrospectif : un sujet découvre que son éducation a mêlé le vrai et le faux, et que tout ce qu'il a bâti sur cette base chancelle. Hegel voyait dans cette page un seuil de la philosophie moderne ; commentant Descartes, il comparait le penseur à un marin qui, après une longue traversée, peut enfin crier « Terre ! »<ref>G. W. F. Hegel, ''Leçons sur l'histoire de la philosophie'', t. III. Le mot est rapporté et commenté par Charles Larmore, « The First Meditation: Skeptical Doubt and Certainty », dans David Cunning (dir.), ''The Cambridge Companion to Descartes' Meditations'', Cambridge University Press, 2014, p. 48.</ref>. La formule est juste à condition de ne pas durcir le propos : Descartes n'affirme pas, dès la première phrase, que toutes ses opinions sont fausses. Il inaugure une discipline du jugement. Le doute ne remplace pas une croyance par son contraire ; il suspend l'assentiment partout où une raison de douter se présente, afin de ne garder que ce qui résiste. Le constat mérite qu'on s'arrête à ses termes. Les opinions sont « reçues » (''admisi''), non choisies : l'enfant subit les croyances que lui transmettent l'éducation et le milieu, et le doute aura précisément pour tâche de transformer ce rapport passif en examen actif. Ces opinions sont « fausses », mais elles ont été tenues « pour véritables » : le mal n'est pas l'ignorance, mais la confusion du faux et du vrai, l'assentiment accordé à ce qui ne le méritait pas. L'erreur, enfin, est massive (« quantité ») et féconde : posées comme « principes », ces faussetés ont servi de base à des constructions ultérieures, de sorte que tout l'édifice s'en trouve fragilisé. De là découle la résolution : <blockquote> « [...] il me fallait entreprendre sérieusement une fois en ma vie de me défaire de toutes les opinions que j'avais reçues jusques alors en ma créance, et commencer tout de nouveau dès les fondements, si je voulais établir quelque chose de ferme et de constant dans les sciences. » </blockquote> Le vocabulaire est celui de la rupture : « me défaire » de « toutes » les opinions, « commencer tout de nouveau » et « dès les fondements ». Mais la fin est constructive, non sceptique : il s'agit d'« établir quelque chose de ferme et de constant », c'est-à-dire d'atteindre, par la démolition, le sol assez sûr pour rebâtir. Une objection se lève aussitôt : peut-on vraiment se défaire de toutes ses opinions ? Descartes y répond par avance, comme on le verra, en ne demandant pas de les juger fausses, mais de les traiter comme telles le temps de l'examen. Le ton surprend. Là où tant de traités commencent par des définitions, Descartes part d'un « je me suis aperçu » : une histoire intellectuelle datée, où le lecteur est invité à entrer. Cette dimension autobiographique tient à la méthode. Le savoir à fonder doit être assumé dans l'acte même où je juge, et non reçu par tradition ou par déférence. Reste à savoir qui parle. Le « je » des ''Méditations'' n'est pas seulement René Descartes ; c'est un méditant exemplaire dont chacun peut endosser le rôle<ref>Charles Larmore, art. cité, p. 48-68 ; voir aussi Lisa Shapiro, « The Self in the Meditations », dans Karen Detlefsen (dir.), ''Descartes' Meditations: A Critical Guide'', Cambridge University Press, 2012, p. 230.</ref>. Gary Hatfield distingue ce méditant de l'auteur historique : Descartes, lorsqu'il écrit, possède déjà sa métaphysique, tandis que le méditant doit la découvrir. Le méditant est un « débutant en philosophie » (''qui modo primum philosophari incipit'', selon l'''Entretien avec Burman'') qui adhère encore à l'idée que toute connaissance vient des sens<ref>Gary Hatfield, ''Routledge Philosophy GuideBook to Descartes and the Meditations'', Londres, Routledge, 2003 (désigné ci-après ''Descartes and the Meditations''), p. 40 et 89 ; Descartes, ''Entretien avec Burman'', AT V, p. 146.</ref>. Jorge Secada va plus loin : le texte cherche à devenir l'expression de la transformation du lecteur lui-même, qui doit refaire le parcours pour son compte plutôt que d'en suivre le récit en spectateur<ref>Jorge Secada, « God and Meditation in Descartes' ''Meditations on First Philosophy'' », dans Karen Detlefsen (dir.), ''op. cit.'', p. 201-202 : « Descartes espérait que les lecteurs de ses méditations seraient véritablement des méditants vivant le processus méditatif, processus de transformation. Les ''Méditations'' ne décrivent pas cette entreprise ; elles cherchent à devenir l'expression de la transformation du lecteur. »</ref>. L'ambiguïté du « je » est féconde : elle permet un texte à la fois personnel et universel, où chacun reconnaît ses propres préjugés. === L'erreur de l'enfance et ses mécanismes === L'expression « dès mes premières années » (''ineunte ætate'') situe l'origine de l'erreur non dans un accident isolé, mais dans l'économie de notre développement. L'enfance est le moment où se forment des habitudes de jugement difficiles à déraciner. Descartes développe cette analyse dans les ''Principes de la philosophie'' (I, 71-74)<ref>Descartes, ''Principia philosophiae'', I, art. 71-74, AT VIII-A, p. 35-37. Voir Gary Hatfield, ''Descartes and the Meditations'', p. 89-90.</ref>. L'idée n'est pas que l'enfant serait moins intelligent, mais que son esprit est d'abord étroitement lié au corps : il vit dans l'urgence des besoins, se règle sur ce qui attire ou repousse, fait plaisir ou fait mal. De là des erreurs caractéristiques. L'enfant croit que les qualités qu'il éprouve, couleurs, sons, saveurs, chaleur, existent dans les choses telles qu'il les ressent : c'est la « thèse de la ressemblance », qui traite l'expérience sensible comme une copie fidèle du réel<ref>Descartes, ''Meditationes'', VI, AT VII, p. 82 ; ''Principia'', I, art. 71, AT VIII-A, p. 35. Cf. Hatfield, ''Descartes and the Meditations'', p. 269-270.</ref>. Il tend aussi à ne donner de consistance qu'à ce qui tombe sous les sens, au point de juger qu'il n'y a rien là où il ne sent rien, habitude qui rend plus difficile, à l'âge adulte, la pensée d'êtres immatériels comme l'âme ou Dieu<ref>Descartes, ''Principia'', I, art. 71, AT VIII-A, p. 35-36.</ref>. Enfin, devenu adulte, il oublie la genèse de ses opinions : des croyances prises autrefois sur parole se présentent ensuite comme des évidences naturelles<ref>Descartes, ''Principia'', I, art. 71, AT VIII-A, p. 36.</ref>. Cet oubli explique la résistance de l'erreur : les préjugés se déguisent en certitudes. Les ''Principes'' rangent ces mécanismes sous quatre causes d'erreur : les préjugés de l'enfance, l'impossibilité de les oublier, la fatigue qu'impose l'attention aux objets non sensibles, et l'attachement de nos concepts à des mots qui ne leur correspondent pas exactement. Ces causes se soutiennent l'une l'autre : les préjugés persistent parce qu'on ne peut les oublier, parce que la pensée intellectuelle fatigue, et parce que le langage les entretient. La quatrième cause vise une difficulté à laquelle la Seconde Méditation s'attaquera, en montrant que « voir » la cire est en réalité un acte de l'intellect<ref>Descartes, ''Meditationes'', II, AT VII, p. 31-32. Cf. Martial Gueroult, ''Descartes selon l'ordre des raisons'', Paris, Aubier, 1953, t. I, p. 131-136.</ref>. On serait tenté de rapprocher cette analyse des théories modernes du conditionnement social. Le rapprochement éclaire, à condition de rester mesuré. Chez Descartes, l'éducation, le langage et l'autorité des maîtres fournissent bien une part du matériau des opinions, et l'enfance est le moment où ces contenus s'enracinent sans contrôle. Mais il ne propose pas une théorie sociale de la croyance : son but est d'expliquer pourquoi des erreurs ordinaires prennent l'allure d'évidences, afin de justifier un doute qui vise les opinions reçues et stabilisées par l'habitude. === L'édifice du savoir et la question des fondements === <blockquote> « [...] ce que j'ai depuis fondé sur des principes si mal assurés, ne pouvait être que fort douteux et incertain [...] » </blockquote> La métaphore architecturale traverse le passage : les opinions sont des « fondements » (''fundamenta''), le savoir un « édifice » (''ædificium''). Si les fondements sont « mal assurés » (''male firmata''), tout l'édifice est ébranlé. L'image est développée dans le ''Discours de la méthode'', où le philosophe est comparé à un architecte qui démolit un bâtiment instable pour rebâtir sur des bases solides<ref>Descartes, ''Discours de la méthode'', II<sup>e</sup> partie, AT VI, p. 13-14.</ref>. Cette métaphore engage une conception fondationnaliste : certaines croyances reposent sur d'autres, jusqu'à des croyances de base qui ne reposent sur rien et soutiennent l'ensemble. Edwin Curley a souligné ce trait de l'épistémologie cartésienne<ref>Edwin Curley, ''Descartes Against the Skeptics'', Cambridge (Mass.), Harvard University Press, 1978, p. 31-35 ; voir aussi « The Cogito and the Foundations of Knowledge », dans Stephen Gaukroger (dir.), ''The Blackwell Guide to Descartes' Meditations'', Oxford, Blackwell, 2006, p. 30-47.</ref>. La philosophie du {{sc|xx}}<sup>e</sup> siècle l'a discutée : Quine a soutenu que nos croyances forment un réseau plutôt qu'un édifice, où aucune n'est absolument première ; Wittgenstein a contesté qu'il faille justifier nos croyances de base. Ces objections relèvent du fondationnalisme en général ; Descartes y répondra à sa manière dans la suite des ''Méditations'', en présentant le ''cogito'' comme une vérité première, connue par intuition et non par inférence<ref>Sur le débat, voir Bernard Williams, ''Descartes: The Project of Pure Enquiry'', Harmondsworth, Penguin, 1978, chap. 2 ; Curley, ''op. cit.'', chap. 3.</ref>. Il convient toutefois de ne pas durcir l'opposition entre Descartes et la scolastique. Larmore rappelle que le fondationnalisme n'a rien d'une nouveauté cartésienne : l'idée que toute connaissance repose sur les sens imprégnait déjà la pensée du temps. Descartes ne substitue pas une vision fondationnaliste à une pensée qui en aurait été dépourvue ; il remplace une forme régnante par une autre<ref>Charles Larmore, art. cité, p. 50-51.</ref>. L'adage « il n'y a rien dans l'intellect qui n'ait d'abord été dans les sens » (''nihil est in intellectu quod non prius fuerit in sensu'') résumait cet enseignement<ref>La formule est scolastique, et non aristotélicienne au sens littéral : elle condense une thèse qu'Aristote développe dans le ''De l'âme'' (III, 7-8, 431a-432a), selon laquelle l'âme ne pense jamais sans image. Discutée par Thomas d'Aquin (''De veritate'', q. 2, a. 3, arg. 19), elle sera reprise par les empiristes, Leibniz lui ajoutant sa réserve fameuse : ''nisi ipse intellectus''.</ref>. Mais l'empirisme aristotélicien ne se réduit pas à une confiance naïve dans les sens : il fonde la connaissance sur la fiabilité de la perception dans des conditions normales, non sur son infaillibilité. C'est précisément cette nuance que le doute va exploiter. Cette mise en cause des fondements sensibles a une portée que Descartes laisse d'abord dans l'ombre. Hatfield rappelle que les « préjugés de l'enfance » recouvrent en réalité une bonne part de la métaphysique et de l'épistémologie aristotéliciennes alors enseignées<ref>Gary Hatfield, ''Descartes and the Meditations'', p. 89-90 : Descartes savait que ces « préjugés » incluaient nombre de thèses de la métaphysique et de l'épistémologie aristotéliciennes.</ref>. Ébranler la confiance dans les sens, c'est donc atteindre l'édifice de l'École. Descartes ne l'avoue pas dans les ''Méditations'', dédiées aux docteurs de la Faculté de théologie de Paris, mais il s'en ouvre à Mersenne : « Ces six Méditations contiennent tous les fondements de ma physique. Mais il ne faut pas le dire, s'il vous plaît, car ceux qui favorisent Aristote feraient peut-être plus de difficulté de les approuver »<ref>Descartes à Mersenne, 28 janvier 1641, AT III, p. 297-298. Cf. Charles Larmore, art. cité, p. 51.</ref>. En invitant chacun à refaire l'examen de ses croyances pour son propre compte, Descartes substitue à un critère de vérité un autre : non plus l'accord avec les Anciens ou l'autorité d'une tradition, mais l'évidence présente à l'esprit individuel. === Les conditions de la méditation === <blockquote> « Maintenant donc que mon esprit est libre de tous soins, et que je me suis procuré un repos assuré dans une paisible solitude, je m'appliquerai sérieusement et avec liberté à détruire généralement toutes mes anciennes opinions. » </blockquote> Descartes ne se contente pas d'énoncer des arguments ; il décrit le cadre où ils peuvent être conduits. Trois conditions sont requises. La liberté à l'égard des soucis (''curae'') d'abord : la méditation demande une attention unifiée que les préoccupations pratiques fragmentent. Cette exigence retrouve l'opposition antique entre vie active (''negotium'') et loisir studieux (''otium''), mais lui donne une fin nouvelle, puisque l'''otium'' cartésien est provisoire et ordonné à une refondation. La sécurité ensuite : un esprit menacé se tourne vers l'action et la survie, non vers la métaphysique. Historiquement, Descartes jouissait aux Pays-Bas, vers 1640, d'une retraite assez stable pour mener ce travail. La solitude enfin : non par misanthropie, mais parce que la présence d'autrui introduit des opinions et des autorités, et parce que le fondement recherché doit être trouvé en soi-même. Le ''cogito'' sera une vérité solitaire, accessible à chaque esprit pour son propre compte. Ce cadre est traversé par une exigence d'unicité, que le texte latin nomme ''semel in vita'', « une fois dans la vie » : « ''funditus omnia semel in vita esse evertenda'' ». Le doute n'est pas une attitude permanente, comme la suspension du jugement des sceptiques, mais un moment destiné à produire des résultats durables<ref>Gary Hatfield, « The Senses and the Fleshless Eye: The ''Meditations'' as Cognitive Exercises », dans Amélie O. Rorty (dir.), ''Essays on Descartes' Meditations'', Berkeley, University of California Press, 1986, p. 45-79 ; ''Descartes and the Meditations'', p. 40-43.</ref>. La métaphysique est épuisante : Descartes conseillera à Élisabeth de Bohême de ne lui consacrer que peu d'heures par an<ref>Descartes à Élisabeth, 28 juin 1643, AT III, p. 692-695.</ref>. Une fois le fondement atteint, il n'a pas à être cherché de nouveau, et le parcours méditatif opère une transformation du sujet qui ne se répète pas. Le terme même de « méditation » inscrit l'œuvre dans la tradition des exercices spirituels, dont les ''Exercices'' d'Ignace de Loyola, composés dans les années 1520 et imprimés en 1548, offrent le modèle le plus diffusé ; Descartes en avait pratiqué à La Flèche<ref>Gary Hatfield, « The Senses and the Fleshless Eye », p. 47-54 ; ''Descartes and the Meditations'', p. 40-42.</ref>. Les ''Méditations'' partagent avec ce genre une répartition en journées, un engagement actif du lecteur (la préface réclame « plusieurs mois, ou du moins plusieurs semaines » de réflexion sur la seule Première Méditation), une visée de transformation et une progression ordonnée où nul degré ne peut être sauté<ref>Descartes, ''Meditationes'', Préface, AT VII, p. 9.</ref>. Mais l'objet n'est pas Dieu pris pour lui-même, la méthode n'est pas l'imagination de scènes bibliques, et le but n'est pas le salut mais la certitude<ref>Jorge Secada, art. cité, p. 200-201, qui décrit les ''Méditations'' comme un « manuel thérapeutique » offrant un traitement pour une maladie cognitive liée à l'union de l'esprit et du corps.</ref>. Secada note d'ailleurs que nous, lecteurs d'aujourd'hui, ne pouvons plus revêtir aussi aisément l'habit du méditant, parce que nous n'accordons plus la même foi à la promesse cartésienne d'une science nouvelle<ref>Jorge Secada, art. cité, p. 202.</ref>. Une dernière condition est explicitée plus loin : « il n'est pas maintenant question d'agir, mais seulement de méditer et de connaître » (AT VII, 22). Le doute appartient à la théorie, non à la pratique. Dans l'action, on ne peut attendre la certitude absolue ; il faut se régler sur le probable, selon la « morale par provision » du ''Discours''<ref>Descartes, ''Discours de la méthode'', III<sup>e</sup> partie, AT VI, p. 22-28. Cf. ''Historical Dictionary of Descartes and Cartesian Philosophy'', 2<sup>e</sup> éd., Lanham, Rowman & Littlefield, 2015, art. « Doubt », p. 120-121, qui rappelle que, dans les affaires pratiques, on ne doit pas exiger la certitude due à la science théorique.</ref>. Cette distinction protège l'entreprise de l'objection d'apraxie : on continue d'agir selon ses croyances ordinaires alors même qu'on les a suspendues pour les besoins de la connaissance. === Le principe du doute : l'indubitabilité === <blockquote> « [...] il n'est pas besoin que je les examine chacune en particulier, ce qui serait d'un travail infini ; mais, parce que la ruine des fondements entraîne nécessairement avec soi tout le reste de l'édifice, je m'attaquerai d'abord aux principes sur lesquels toutes mes anciennes opinions étaient appuyées. » </blockquote> Le second paragraphe énonce la règle qui gouverne l'entreprise. Elle tient en peu de mots : ce qui donne la moindre raison de douter doit être traité comme faux. Le texte latin le dit nettement : « ''non minus accurate ab iis quae non plane certa sunt atque indubitata, quam ab aperte falsis assensionem esse cohibendam'' » (AT VII, 18). Du point de vue de la méthode, il n'y a pas de différence entre ce qui est « manifestement faux » et ce qui n'est « pas entièrement certain et indubitable ». Plutôt que d'examiner ses opinions une à une, ce qui serait sans fin, Descartes vise les principes qui les soutiennent. La métaphore de l'édifice commande cette économie : pour abattre une construction, mieux vaut saper les fondations que démolir les murs un par un. Le fondement à ébranler, ce sont les sens, sur lesquels reposent « toutes les choses que j'ai admises jusqu'à présent comme les plus vraies ». L'attaque vise donc l'empirisme du sens commun et celui de l'École. Une autre image, donnée dans les ''Septièmes Réponses'', éclaire le procédé. Qui possède un panier de pommes et craint que certaines soient gâtées a intérêt à les vider toutes, puis à ne remettre que les saines après examen<ref>Descartes, ''Responsiones VII'', AT VII, p. 481.</ref>. Le tri ne peut se faire qu'après le renversement : tant que les pommes restent empilées, la pomme gâtée se dissimule parmi les bonnes et risque de les corrompre. De même, une croyance fausse logée parmi les vraies se laisse mal repérer et menace l'ensemble ; mieux vaut suspendre l'adhésion à toutes, puis réexaminer chacune. Cette image rend compte du caractère apparemment excessif du doute : son ampleur n'est pas une fin, mais le moyen le plus sûr de ne laisser passer aucune erreur cachée. L'exigence est élevée : non la probabilité, mais l'indubitabilité absolue. Est certain ce qui résiste à tout doute concevable, fût-il improbable. Cette exigence n'a rien d'évident, et Larmore observe qu'un empiriste n'aurait aucune raison de l'adopter : pour Aristote, la perception fonde la connaissance par sa fiabilité dans des conditions normales, non par son infaillibilité<ref>Charles Larmore, art. cité, p. 62-63.</ref>. Pourquoi alors la requérir ? La réponse tient au cadre de l'enquête. Dans la vie ordinaire, où le temps presse et où il faut agir, nous nous en tenons aux croyances suffisamment appuyées. Mais chercher la connaissance pour elle-même est autre chose. C'est ce que Bernard Williams a nommé le point de vue de l'« enquête pure »<ref>Bernard Williams, ''Descartes: The Project of Pure Enquiry'', p. 46-49.</ref>. La logique de ce choix peut se résumer simplement<ref>Charles Larmore, art. cité, p. 64.</ref>. Chercher la connaissance, c'est poursuivre à la fois deux buts qui ne vont pas ensemble : gagner des vérités et éviter des erreurs. On le voit dès qu'on les sépare. Un esprit qui ne voudrait qu'amasser des vérités croirait tout, quitte à se charger de faussetés ; un esprit qui ne voudrait qu'éviter l'erreur ne croirait rien, et y parviendrait à coup sûr. Ni l'un ni l'autre n'est raisonnable : il faut tenir les deux ensemble. Mais quand ils s'opposent, Descartes tranche pour la prudence, et c'est pourquoi le moindre doute suffit à refuser l'assentiment. À la lettre, « rechercher la vérité » nomme donc mal son entreprise, dont le premier soin est d'écarter le faux. === Le doute, instrument méthodique === Le traitement « comme faux » est provisoire. Descartes ne juge pas que ses opinions sont fausses ; il décide de les tenir pour telles tant que leur certitude n'est pas établie. La distinction importe : il ne ''nie'' pas ses anciennes opinions, il s'abstient de les ''affirmer''. Nier reviendrait à affirmer le contraire ; s'abstenir, c'est ne rien affirmer. Gueroult parle d'une « exclusion provisoire » des opinions hors du champ de la certitude, non d'un rejet définitif : ce qui a été écarté pourra être réintroduit à son rang dans la « chaîne des raisons »<ref>Martial Gueroult, ''Descartes selon l'ordre des raisons'', t. I, p. 33-34.</ref>. Cette idée de chaîne renvoie à ce que Gueroult tient pour la clé des ''Méditations'', l'« ordre des raisons » (''ordo rationum'') : chaque thèse ne vaut qu'à sa place dans une progression où elle dépend des précédentes et prépare les suivantes<ref>Martial Gueroult, ''op. cit.'', t. I, p. 19-22.</ref>. Le principe du doute occupe, dans cet ordre, le rang premier : il fixe la règle selon laquelle l'examen sera conduit. Mais cette règle est-elle elle-même à l'abri du doute ? Descartes ne la démontre pas ; il la présente comme un commandement de la raison (« la raison me persuade »). On peut y voir une difficulté : si toute évidence est suspecte, comment la règle peut-elle échapper au doute qu'elle prescrit ? La réponse tient à son statut : ce n'est pas une opinion sur le monde, mais une décision de méthode, qui ne prétend rien affirmer et se borne à régler une conduite. Gueroult dégage de ce dispositif quatre caractères du doute, tous solidaires du principe<ref>Martial Gueroult, ''op. cit.'', t. I, p. 33 : « À cette triple nécessité correspondent trois caractères du doute cartésien : il est méthodique, il est universel, il est radical. En outre, son caractère méthodique faisant de lui un simple instrument en vue de fonder la certitude du savoir, c'est-à-dire le dogmatisme de la science, il en résulte un quatrième caractère : le doute cartésien est provisoire. »</ref>. Le doute est méthodique : non un sentiment d'incertitude, mais une décision au service d'un objectif, fonder la certitude du savoir. Il est universel : rien n'en est exempté tant que le doute n'est pas « radicalement impossible ». Il est radical : les opinions douteuses ne sont pas mises entre parenthèses, mais rejetées entièrement. Il est provisoire : son caractère d'instrument l'ordonne à la reconstruction, et les opinions écartées pourront retrouver leur place une fois les fondements établis. Une fiction soutient ce traitement. Pour contrebalancer la force des opinions probables, Descartes décide de « feindre » que tout est faux. Gassendi, puis Huet, objecteront que traiter une opinion comme fausse, c'est en acquérir une autre, et que tenir pour fausses des opinions en partie vraies, c'est se tromper plutôt que l'éviter<ref>Pierre Gassendi, ''Cinquièmes Objections'', AT VII, p. 257-258. Cf. Charles Larmore, « Descartes and Skepticism », dans Stephen Gaukroger (dir.), ''The Blackwell Guide to Descartes' Meditations'', p. 24-25.</ref>. Descartes répond en distinguant le jugement de la fiction : feindre que ses opinions sont fausses n'est pas juger qu'elles le sont, mais procéder comme un géomètre qui suppose certaines propriétés pour les besoins d'une démonstration. Gueroult rapproche cette fiction des constructions auxiliaires de la géométrie<ref>Martial Gueroult, ''op. cit.'', t. I, p. 39.</ref>. Le malin génie sera l'aboutissement de ce procédé. Une telle décision suppose enfin une certaine conception de l'assentiment : pour Descartes, tenir une proposition pour vraie est un acte de la volonté, non une réponse passive de l'intellect. C'est ce qui rend le doute possible. L'entendement incline à affirmer ce qui paraît clair, mais la volonté, « infinie » en son genre, peut s'opposer à cette inclination et suspendre l'assentiment. Le doute est en ce sens un effort à contre-courant des tendances spontanées<ref>Cette conception de l'assentiment sera développée dans la Quatrième Méditation. Cf. Martial Gueroult, ''op. cit.'', t. I, p. 39.</ref>. Reste que ce principe s'inscrit dans la tradition sceptique tout en s'en séparant par sa fin. Comme le note Deborah Brown, on tient communément que Descartes n'introduit pas d'argument sceptique nouveau, mais que son usage proprement méthodique du scepticisme est, lui, inédit<ref>Deborah Brown, « Descartes and Content Skepticism », dans Karen Detlefsen (dir.), ''op. cit.'', p. 25-26.</ref>. Les Anciens visaient la tranquillité de l'âme (''ataraxia'') par la suspension du jugement ; Descartes vise des certitudes qui résistent à tous les doutes. Pour eux le doute était une fin et la suspension un terme ; pour lui le doute est un moyen et la suspension un passage. == II. Le doute sur les sens (§ 3-4) == === L'erreur des sens === <blockquote> « Tout ce que j'ai reçu jusqu'à présent pour le plus vrai et assuré, je l'ai appris des sens, ou par les sens ; or j'ai quelquefois éprouvé que ces sens étaient trompeurs, et il est de la prudence de ne se fier jamais entièrement à ceux qui nous ont une fois trompés. » </blockquote> Le premier argument est simple. Les sens nous ont parfois trompés ; or il n'est pas prudent de se fier entièrement à qui nous a déjà trompés ; donc les sens ne méritent pas une confiance entière. Le principe de prudence est emprunté au domaine moral, où l'on se méfie d'un témoin qui a menti, et transposé aux facultés. La distinction « des sens, ou par les sens » (''a sensibus, vel per sensus'') vaut d'être notée : certaines croyances viennent directement de la perception, d'autres indirectement, par le témoignage, les livres ou l'enseignement, qui passent tous par l'ouïe ou la vue. Ordinairement, ce principe n'a pas une portée si stricte : un ami qui enjolive la vérité ne perd pas toute crédibilité, et nous distinguons les contextes où une source est fiable de ceux où elle ne l'est pas. Si Descartes l'applique sans réserve, c'est en vertu de l'exigence qu'il s'est donnée : pour qui cherche l'indubitable, le moindre risque d'erreur disqualifie une source. La portée de l'argument reste pourtant limitée, et Descartes le reconnaît : les illusions concernent surtout les « choses peu sensibles et fort éloignées ». La tour paraît ronde parce qu'elle est loin ; le bâton paraît brisé parce que la réfraction déforme son image. Ces exemples reprennent ce que les sceptiques anciens nommaient les « tropes » de la suspension du jugement. Sextus Empiricus avait catalogué les variations de la perception selon les conditions ; c'est surtout le cinquième trope, celui « des positions, des distances et des lieux », que Descartes mobilise ici sans le nommer<ref>Sur la dette envers le scepticisme ancien, voir Thomas M. Lennon et Michael W. Hickson, « The Skepticism of the First Meditation », dans Karen Detlefsen (dir.), ''op. cit.'', p. 9-24, ainsi que Charles Larmore, « Descartes and Skepticism », p. 17-29.</ref>. Mais il n'en tire pas la conclusion pyrrhonienne : la faillibilité des sens n'est, pour lui, qu'une étape vers un fondement plus ferme. Que les sens trompent dans des conditions défavorables suggère une parade : peut-être sont-ils fiables pour les objets proches, de taille moyenne, perçus dans de bonnes conditions. Descartes formule lui-même cette objection. === L'évidence sensible et l'écart de la folie === <blockquote> « Mais, encore que les sens nous trompent quelquefois, touchant les choses peu sensibles et fort éloignées, il s'en rencontre peut-être beaucoup d'autres, desquelles on ne peut pas raisonnablement douter, quoique nous les connaissions par leur moyen : par exemple, que je sois ici, assis auprès du feu, vêtu d'une robe de chambre, ayant ce papier entre les mains, et autres choses de cette nature. » </blockquote> La scène du philosophe auprès du feu rassemble tout ce qui garantit une perception fiable : la proximité des objets, leur taille moyenne, des conditions d'observation normales, des objets familiers, la convergence des sens (il voit le feu, en sent la chaleur, touche le papier) et l'implication de son propre corps. La situation est ordinaire et chacun peut s'y reconnaître ; elle fonctionne comme un cas limite. Si les sens ne sont pas fiables ici, le seront-ils jamais ? Cette objection a une valeur pédagogique. En la formulant, Descartes donne voix à la résistance que tout lecteur oppose spontanément au doute : « les sens me trompent peut-être de loin, mais non sur ce que je perçois ici et maintenant ». Loin de l'écarter, il la prend au sérieux et la pousse à son point le plus fort, pour mieux la dépasser ensuite par l'argument du rêve. Le lecteur ne subit donc pas le doute de l'extérieur : il le voit naître de ses propres certitudes. Pour douter de telles évidences, il faudrait être fou. Descartes évoque alors la folie (''amentia'', ''dementia''), décrite selon la médecine de son temps : un cerveau « troublé et offusqué par les noires vapeurs de la bile », c'est-à-dire la mélancolie née de l'atrabile. Les exemples illustrent deux délires, l'un portant sur les circonstances (se croire roi quand on est pauvre), l'autre sur le corps propre (s'imaginer de verre). Le délire du « corps de verre » était un trouble bien repéré à l'époque, dont le cas le plus fameux est celui de Charles VI de France, mais Descartes reprend un exemple devenu courant dans la littérature médicale. Il écarte aussitôt l'hypothèse : « Mais quoi ? ce sont des fous ; et je ne serais pas moins extravagant, si je me réglais sur leurs exemples. » Ce rejet a nourri d'importants débats. Trois lectures se complètent. Pour la lecture méthodologique, l'hypothèse de la folie détruirait la raison elle-même : un fou ne raisonne pas, et l'entreprise des ''Méditations'' suppose un lecteur capable de suivre des arguments ; prendre la folie au sérieux reviendrait à arrêter l'ouvrage avant de l'avoir commencé<ref>Cette lecture remonte à Harry Frankfurt, ''Demons, Dreamers, and Madmen: The Defense of Reason in Descartes' Meditations'', Indianapolis, Bobbs-Merrill, 1970. Elle est reprise par Fred Ablondi (2007) ; David Scott (2009) lui oppose l'idée que la folie est prise au sérieux et reversée dans l'argument du rêve. On trouvera la discussion dans Lennon et Hickson, art. cité, p. 12-14.</ref>. Pour la lecture par l'universalité, proposée par Lennon et Hickson, l'argument de la folie manque de généralité : il fait voir que certains, parfois, sont trompés, là où l'argument du rêve fera voir que tous, parfois, le sont ; supposer que les vapeurs ont gagné toutes les têtes serait soi-même un signe de folie<ref>Thomas M. Lennon et Michael W. Hickson, art. cité, p. 11-16.</ref>. Pour la lecture dialogique de Larmore, enfin, celui qui rejette la folie n'est pas Descartes, mais le méditant empiriste qui croit encore aux sens : de son point de vue, écarter un cas pathologique est raisonnable<ref>Charles Larmore, « Descartes and Skepticism », p. 22-24, qui reconstruit la méditation comme un dialogue entre un empiriste et un sceptique.</ref>. Michel Foucault et Jacques Derrida ont mené sur ce passage une controverse restée fameuse. Pour Foucault, le rejet de la folie marque le geste par lequel l'âge classique exclut la déraison du champ de la pensée légitime<ref>Michel Foucault, ''Histoire de la folie à l'âge classique'', Paris, Gallimard, 1972 (1<sup>re</sup> éd. 1961), notamment p. 56-59.</ref>. Pour Derrida, au contraire, le ''cogito'' résiste même à l'hypothèse de la folie : que je sois fou ou non, je pense, donc je suis ; la folie n'est pas exclue mais débordée par le doute, qui ira jusqu'à envisager une tromperie atteignant même les esprits sains<ref>Jacques Derrida, « Le Cogito et l'histoire de la folie », dans ''L'Écriture et la différence'', Paris, Seuil, 1967, p. 51-97. Foucault répondra à Derrida dans « Mon corps, ce papier, ce feu », repris en appendice de l'''Histoire de la folie''.</ref>. == III. L'argument du rêve (§ 5) == === L'indiscernabilité de la veille et du sommeil === <blockquote> « Toutefois j'ai ici à considérer que je suis homme, et par conséquent que j'ai coutume de dormir et de me représenter en mes songes les mêmes choses, ou quelquefois de moins vraisemblables, que ces insensés, lorsqu'ils veillent. » </blockquote> Ce que Descartes refusait d'envisager comme folie, il l'accepte comme rêve. Le déplacement est subtil et tient à un mot : « je suis homme ». La folie frappe certains ; le rêve est le lot de tous. Chaque nuit, l'homme vit en songe des expériences semblables à celles des fous, et même de moins vraisemblables. L'argument quitte ainsi le pathologique pour le commun, ce que l'argument de la folie ne pouvait faire. <blockquote> « Combien de fois m'est-il arrivé de songer, la nuit, que j'étais en ce lieu, que j'étais habillé, que j'étais auprès du feu, quoique je fusse tout nu dedans mon lit ? » </blockquote> Le parallèle avec la scène du feu est exact : les détails mêmes qui semblaient garantir la réalité de l'expérience (le lieu, les vêtements, le feu) peuvent figurer dans un rêve. Le songe reproduit les conditions de l'évidence sensible. Descartes tente une résistance, en invoquant la clarté de la perception présente, le sentiment du mouvement volontaire, la netteté des sensations : « c'est avec dessein et de propos délibéré que j'étends cette main ». Mais le souvenir de rêves passés ruine ces critères : on a déjà cru, en songe, percevoir clairement et agir volontairement. <blockquote> « [...] je vois si manifestement qu'il n'y a point d'indices certains par où l'on puisse distinguer nettement la veille d'avec le sommeil, que j'en suis tout étonné ; et mon étonnement est tel, qu'il est presque capable de me persuader que je dors. » </blockquote> La conclusion est célèbre : aucun « indice certain » (''indicium certum'') ne permet de distinguer, du dedans de l'expérience, la veille du sommeil. Descartes ne dit pas qu'il n'y a aucune différence, mais qu'il n'y a pas de marque ''infaillible'', accessible au rêveur pendant qu'il rêve. La force de l'argument tient à ce que le rêve peut imiter toutes les propriétés de la veille : sa vivacité, sa cohérence apparente, le sentiment du contrôle. L'étonnement (le latin dit ''obstupescam'') n'est pas ici l'émerveillement serein qui, chez Aristote, donne naissance à la philosophie ; c'est un vertige, le trouble d'un esprit qui ne trouve plus d'appui pour départager le songe de la veille, et c'est ce déséquilibre qui fait avancer le doute. Il faut préciser ce que l'argument met en doute. Comme le souligne Larmore, il porte sur la question « puis-je savoir, à cet instant, que je suis éveillé ? », et non sur la question « l'expérience de veille est-elle véridique ? »<ref>Charles Larmore, « Descartes and Skepticism », p. 22-23 : le doute du rêve concerne d'un bout à l'autre la différence entre veille et sommeil, et sa résolution consiste à montrer comment établir que l'on veille.</ref>. Il présuppose donc que si je veille, mes perceptions d'objets proches sont véridiques ; ce qu'il conteste, c'est ma capacité à établir que je veille. Cette précision commande la résolution ultérieure : Descartes ne soutiendra pas que les perceptions de veille sont toujours vraies, mais montrera comment distinguer les deux états. L'argument semble pourtant se heurter à un paradoxe. Pour le formuler, Descartes doit savoir ce que « rêver » et « veiller » veulent dire, et se souvenir d'avoir rêvé ; or comment le saurait-il s'il ne pouvait distinguer les deux états ? Hatfield répond qu'il n'a pas à prouver l'existence de cas réels de veille : il lui suffit que le lecteur comprenne la possibilité de l'indiscernabilité<ref>Gary Hatfield, ''Descartes and the Meditations'', p. 75-77.</ref>. Descartes ne cherche pas à établir qu'on rêve toujours, mais à instiller un doute sur notre capacité à savoir, à un moment donné, si l'on veille. === Portée et limites de l'argument === L'argument, une fois admis, peut s'étendre. Si je ne puis être certain de ne pas rêver, alors les objets que je crois percevoir pourraient ne pas exister ; et l'on peut aller plus loin, en supposant que « peut-être nos mains, ni tout notre corps, ne sont pas tels que nous les voyons ». Le doute atteint le corps propre. Descartes ne pousse pas aussitôt cette extension à son terme : il introduit l'analogie du peintre, qui en marque la limite et fait transition vers les natures simples. L'argument du rêve a des précédents antiques : il figurait parmi les tropes pyrrhoniens, et Cicéron rapporte que les Académiciens tenaient qu'aucune impression n'est telle qu'une impression semblable ne pût venir d'une autre source<ref>Sur les précédents, voir Lennon et Hickson, art. cité, p. 17-20.</ref>. Mais l'usage cartésien diffère sur trois points. La fin d'abord : instrument d'un projet dogmatique, non chemin vers l'''ataraxia''. La portée ensuite : le scepticisme antique ne mettait pas en doute l'existence du monde, que l'argument cartésien, joint aux suivants, finira par atteindre. Le statut enfin : provisoire et destiné à être surmonté. Descartes reconnaissait lui-même que ces doutes n'étaient pas neufs, parlant de « réchauffer un vieux chou », mais il les pliait à une fin nouvelle<ref>Charles Larmore, « Descartes and Skepticism », p. 18-19.</ref>. === La résolution de la Sixième Méditation === L'argument n'est pas abandonné : il sera résolu dans la Sixième Méditation, après que la véracité divine aura été établie. Le critère proposé est la cohérence mémorielle. <blockquote> « Je remarque maintenant qu'il y a une grande différence entre les deux, en ce que jamais les rêves ne sont liés par la mémoire avec toutes les autres actions de la vie, comme le sont les choses qui arrivent à celui qui veille. [...] Lorsque je perçois distinctement d'où viennent les choses, où et quand elles me parviennent, et que je peux rattacher mes perceptions au reste de ma vie sans interruption, alors je suis tout à fait certain qu'en les rencontrant je ne suis pas endormi mais éveillé. » (AT VII, 89-90) </blockquote> Les expériences de veille s'enchaînent et se relient à l'ensemble de la vie par la mémoire ; les rêves sont fragmentaires et déconnectés. Ce critère ne relève pas des sens seuls, mais de l'intellect et de la mémoire, ce qui explique qu'il n'était pas disponible pour l'empiriste de la Première Méditation. La résolution illustre ainsi la thèse maîtresse de l'œuvre : la connaissance ne repose pas sur les sens, mais sur l'activité judicative de l'intellect<ref>Sur cette lecture, voir David Cunning (dir.), ''The Cambridge Companion to Descartes' Meditations'', notamment l'analyse de Larmore selon laquelle ces lignes sont le moment où le « je » parle enfin pleinement la voix de Descartes.</ref>. La résolution n'est pas sans difficultés. Ne pourrait-on rêver que le critère est satisfait, rêver d'une vie cohérente ? Descartes admet que la pression des affaires ne laisse pas toujours le temps de vérifier, et que des erreurs surviennent. Hatfield observe qu'il n'avait sans doute pas besoin d'une certitude absolue dans tous les cas : son but premier était d'établir les vérités de la métaphysique, qui ne dépendent pas des sens ; pour le reste, il suffit que les sens soient fiables dans l'ensemble et que leurs rapports puissent être recoupés<ref>Gary Hatfield, ''Descartes and the Meditations'', p. 276-277.</ref>. == IV. Les natures simples et l'analogie du peintre (§ 6-8) == === Ce qui résiste au doute du rêve === <blockquote> « Toutefois il faut au moins avouer que les choses qui nous sont représentées dans le sommeil sont comme des tableaux et des peintures, qui ne peuvent être formées qu'à la ressemblance de quelque chose de réel et de véritable. » </blockquote> L'analogie du peintre oppose une contre-objection au doute. Même un peintre qui invente des sirènes ou des satyres compose ses figures à partir d'éléments réels, en mêlant des membres empruntés à des animaux existants. De même, le rêve le plus extravagant présuppose des éléments simples qui, eux, doivent avoir quelque réalité. <blockquote> « [...] à tout le moins les couleurs dont ils le composent doivent-elles être véritables. » </blockquote> Descartes envisage le cas limite d'une invention entièrement nouvelle : même alors, les « couleurs », c'est-à-dire les éléments les plus simples de la composition, doivent être véritables. Il en tire la liste des natures simples qui résistent au doute du rêve : <blockquote> « De ce genre de choses est la nature corporelle en général, et son étendue ; ensemble la figure des choses étendues, leur quantité ou grandeur, et leur nombre ; comme aussi le lieu où elles sont, le temps qui mesure leur durée, et autres semblables. » </blockquote> Ces notions, étendue, figure, grandeur, nombre, lieu, temps, sont communes à tout ce qui peut être représenté, réel ou imaginaire ; elles forment le matériau de toute représentation possible. On notera que Descartes retient l'extension spatiale et la durée, mais non la couleur, parmi ces éléments premiers : il annonce ainsi, sans l'argumenter encore, sa thèse ultérieure selon laquelle la couleur n'est pas une propriété première des corps. Si cette réduction paraît naturelle au méditant, il est déjà en chemin vers le cartesianisme ; sinon, il peut passer outre et poursuivre<ref>Gary Hatfield, ''Descartes and the Meditations'', p. 78-79.</ref>. === La hiérarchie des sciences === <blockquote> « [...] la physique, l'astronomie, la médecine, et toutes les autres sciences qui dépendent de la considération des choses composées, sont fort douteuses et incertaines ; mais [...] l'arithmétique, la géométrie, et les autres sciences de cette nature, qui ne traitent que de choses fort simples et fort générales, sans se mettre beaucoup en peine si elles sont dans la nature, ou si elles n'y sont pas, contiennent quelque chose de certain et d'indubitable. » </blockquote> Le doute du rêve établit une partition. Les sciences des choses composées (physique, astronomie, médecine) dépendent de l'existence réelle de leurs objets ; elles sont donc atteintes. Les sciences des choses simples (arithmétique, géométrie) ne traitent que de relations entre concepts, indépendamment de toute existence : « soit que je veille ou que je dorme, deux et trois joints ensemble formeront toujours le nombre de cinq, et le carré n'aura jamais plus de quatre côtés ». Ces vérités paraissent inattaquables. Descartes semble avoir atteint un point fixe. Mais la formule « il ne semble pas possible » (''nec fieri posse videtur'') laisse entendre que cette impossibilité n'est qu'apparente : le doute n'est pas à son terme. == V. L'hypothèse du Dieu trompeur (§ 9-12) == === La toute-puissance et le doute sur les mathématiques === <blockquote> « Toutefois il y a longtemps que j'ai dans mon esprit une certaine opinion, qu'il y a un Dieu qui peut tout, et par qui j'ai été créé et produit tel que je suis. Or qui me peut avoir assuré que ce Dieu n'ait point fait qu'il n'y ait aucune terre, aucun ciel, aucun corps étendu [...] et que néanmoins j'aie les sentiments de toutes ces choses ? » </blockquote> L'hypothèse du Dieu trompeur porte le doute jusqu'aux vérités que le rêve épargnait. Elle s'appuie sur une opinion ancienne et reçue, non sur une connaissance : « une certaine opinion » selon laquelle un Dieu tout-puissant m'a créé. Si Dieu peut tout, rien ne l'empêche en principe de me faire éprouver un monde qui n'existe pas, ni même de me faire faillir dans les opérations les plus simples. <blockquote> « [...] il se peut faire qu'il ait voulu que je me trompe toutes les fois que je fais l'addition de deux et de trois, ou que je nombre les côtés d'un carré [...]. » </blockquote> Le doute atteint désormais les mathématiques. On peut, avec Hatfield, distinguer deux ressorts dans ce passage<ref>Gary Hatfield, « The Cartesian Circle », dans Stephen Gaukroger (dir.), ''The Blackwell Guide to Descartes' Meditations'', p. 126-127.</ref>. Selon le premier, le Dieu trompeur ''intervient'' à chaque opération pour fausser mon calcul : ma faculté de raisonner ne serait pas en cause, mais ses résultats deviendraient inutilisables, comme si une influence imperceptible me faisait tenir pour vrai que deux et trois ne font pas cinq. Selon le second, plus profond, c'est ma faculté de raisonner elle-même qui aurait été ''mal conçue'', de sorte qu'elle produirait régulièrement des résultats faux que je croirais pourtant assurés. Je serais alors comme une machine à calculer au mécanisme défectueux. C'est ce point culminant qui rend le doute « hyperbolique » : non seulement le monde, mais les évidences rationnelles les plus fermes deviennent suspectes. === Bonté divine et hypothèse athée === <blockquote> « Mais peut-être que Dieu n'a pas voulu que je fusse déçu de la sorte, car il est dit souverainement bon. » </blockquote> Une objection théologique se présente : un Dieu souverainement bon ne saurait vouloir me tromper. Mais elle se retourne. Si la bonté divine est incompatible avec une tromperie permanente, pourquoi serait-elle compatible avec une tromperie occasionnelle ? Or nous nous trompons parfois ; c'est un fait. La bonté de Dieu ne suffit donc pas à garantir l'absence d'erreur, et le doute subsiste. <blockquote> « Il y aura peut-être ici des personnes qui aimeront mieux nier l'existence d'un Dieu si puissant, que de croire que toutes les autres choses sont incertaines. » </blockquote> L'athéisme n'offre pas d'échappatoire ; il aggrave la situation. Descartes renforce le second ressort du doute en considérant les origines que l'incroyant pourrait substituer à Dieu : « quelque destin ou fatalité », le « hasard », ou « une continuelle suite et liaison des choses »<ref>Sur ces trois hypothèses d'origine, voir Gary Hatfield, « The Cartesian Circle », p. 127.</ref>. Quelle que soit la cause supposée, moins elle est parfaite, plus il est probable que son effet, moi, soit imparfait et porté à l'erreur. Faillir étant une imperfection, un auteur moins puissant qu'un Dieu parfait laisse craindre une faculté plus défaillante encore. Sans un Dieu parfait pour garantir mes facultés, je suis livré à une imperfection peut-être sans remède. Ce premier mouvement du doute trouve ici sa conclusion : <blockquote> « [...] je suis contraint d'avouer que, de toutes les opinions que j'avais autrefois reçues en ma créance pour véritables, il n'y en a pas une de laquelle je ne puisse maintenant douter, non par aucune inconsidération ou légèreté, mais pour des raisons très fortes et mûrement considérées : de sorte qu'il est nécessaire que j'arrête et suspende désormais mon jugement sur ces pensées [...]. » (AT VII, 21-22) </blockquote> Le résultat est sans reste : aucune des anciennes opinions n'échappe au doute. Descartes insiste sur la qualité de cette suspension, qui ne procède d'aucune « légèreté », mais de « raisons très fortes et mûrement considérées ». La formule « arrêter et suspendre mon jugement » retrouve le vocabulaire de l'''epochè'' sceptique, mais la fin reste opposée : on suspend pour pouvoir ensuite établir, non pour demeurer dans la suspension. == VI. Le malin génie (§ 13-15) == === La résistance des anciennes opinions et le choix de feindre === Avant d'introduire le malin génie, Descartes constate que la suspension du jugement ne tient pas d'elle-même. <blockquote> « Mais il ne suffit pas d'avoir fait ces remarques, il faut encore que je prenne soin de m'en souvenir ; car ces anciennes et ordinaires opinions me reviennent encore souvent en la pensée, le long et familier usage qu'elles ont eu avec moi leur donnant droit d'occuper mon esprit contre mon gré, et de se rendre presque maîtresses de ma créance. » </blockquote> La remarque est de psychologie épistémique. Les opinions tiennent leur force de l'habitude : elles reviennent « contre mon gré », et le « long et familier usage » leur confère un « droit », presque juridique, d'occuper l'esprit. L'esprit apparaît comme un champ de forces où la volonté de douter doit lutter contre l'inertie des croyances établies. <blockquote> « Et je ne me désaccoutumerai jamais d'y acquiescer [...] tant que je les considérerai telles qu'elles sont en effet, c'est à savoir en quelque façon douteuses [...] et toutefois fort probables, en sorte que l'on a beaucoup plus de raison de les croire que de les nier. » </blockquote> Descartes reconnaît que ces opinions sont « fort probables » : il serait plus raisonnable de les croire que de les nier. Mais la probabilité n'est pas la certitude, et le probable, pour les besoins de la recherche, doit être traité comme le faux. D'où la décision : <blockquote> « C'est pourquoi je pense que j'en userai plus prudemment, si, prenant un parti contraire, j'emploie tous mes soins à me tromper moi-même, feignant que toutes ces pensées sont fausses et imaginaires. » </blockquote> La solution est paradoxale : pour neutraliser la force des opinions probables, Descartes choisit de se tromper volontairement, en feignant que tout est faux. C'est le passage du doute simplement méthodique au doute hyperbolique assumé : il ne s'agit plus de suspendre le jugement, mais d'adopter activement la position contraire aux croyances naturelles. L'image de la balance éclaire ce choix : l'esprit penche du côté des préjugés ; pour rétablir l'équilibre, donc l'impartialité du jugement, il faut peser de l'autre côté. Le malin génie sera l'instrument de ce contrepoids. === L'invention d'une fiction === <blockquote> « Je supposerai donc qu'il y a, non point un vrai Dieu, qui est la souveraine source de vérité, mais un certain mauvais génie, non moins rusé et trompeur que puissant, qui a employé toute son industrie à me tromper. » </blockquote> Pour saisir pourquoi Descartes invente cette figure, il faut suivre les trois moments de son raisonnement. Le premier est l'opinion confuse, reçue pour ainsi dire par ouï-dire, d'un Dieu tout-puissant qui pourrait, s'il le voulait, me tromper sur tout, jusque dans les additions les plus simples. Le deuxième est une objection : un Dieu parfait ne saurait être trompeur, car tromper est une marque d'imperfection. Mais cette objection ne lève pas le doute, elle le déplace, car nous nous trompons en fait, et il faudrait encore expliquer comment un Dieu bon le permet. Le troisième moment résout cette tension : en imputant la tromperie non plus au vrai Dieu, mais à un esprit mauvais distinct de lui, Descartes maintient le doute à son intensité maximale sans rien attribuer d'indigne à la perfection divine. C'est l'office du malin génie (''genius malignus''). Sa portée est totale : le ciel, l'air, la terre, les couleurs, les figures, les sons, et jusqu'au corps propre, « point de mains, point d'yeux, point de chair », tout peut être illusion. Seule subsiste une croyance, fausse mais réelle : « croyant faussement avoir toutes ces choses ». Le chemin vers le ''cogito'' est préparé, sans être encore ouvert. Cette substitution a une raison de fond, que Gueroult a mise au jour. Le malin génie n'est pas une thèse sur l'existence d'un trompeur, mais une fiction destinée à maintenir le doute. Et s'il faut une fiction, c'est que l'hypothèse d'un Dieu trompeur n'est pas seulement choquante : bien comprise, elle est contradictoire. Le concept de toute-puissance exclut en effet la tromperie, car vouloir tromper relève de la faiblesse (''imbecillitas'') autant que de la malice, et le Souverain Être ne peut se porter vers le non-être qu'est la tromperie. Le malin génie échappe à cette contradiction parce qu'il n'est pas tout-puissant : il est « extrêmement puissant », mais le texte ajoute, à propos de sa malice, « si je l'ose dire » (''si fas est dicere''), comme pour avouer qu'on ne saurait joindre sans réserve la toute-puissance et la méchanceté<ref>Martial Gueroult, ''op. cit.'', t. I, p. 43-45, qui s'appuie notamment sur l'''Entretien avec Burman'' (AT V, p. 147 et 150-151) : « la toute-puissance et la méchanceté ne peuvent aller ensemble ». L'hypothèse du malin génie est, pour Gueroult, « le type des suppositions impossibles ou absurdes », rendue possible seulement parce que le vrai Dieu n'est encore que confusément connu.</ref>. La fiction n'est donc recevable que tant que la vraie nature de la toute-puissance divine demeure confusément connue ; une fois celle-ci clairement comprise, dans la Troisième Méditation, elle se dissipe d'elle-même. <blockquote> « [...] si, par ce moyen, il n'est pas en mon pouvoir de parvenir à la connaissance d'aucune vérité, à tout le moins il est en ma puissance de suspendre mon jugement. » </blockquote> Descartes affirme sa résolution avec fermeté. Même si aucune vérité ne peut être atteinte, la suspension du jugement reste possible, et c'est un gain : qui ne croit rien ne croit rien de faux. Le malin génie ne peut « rien imposer » à qui refuse tout assentiment. On voit ici le rôle de la volonté : le doute n'est pas un état subi, mais un acte par lequel l'esprit se met en garde contre les ruses du trompeur. === La difficulté de maintenir le doute === <blockquote> « Mais ce dessein est pénible et laborieux, et une certaine paresse m'entraîne insensiblement dans le train de ma vie ordinaire. » </blockquote> La méditation s'achève sur un aveu de difficulté. Tenir le doute est « pénible et laborieux », et une « paresse » naturelle ramène vers la vie ordinaire, où l'on ne doute de rien. Le doute hyperbolique exige un effort soutenu, une tension constante contre les pentes spontanées de l'esprit. <blockquote> « Et tout de même qu'un esclave qui jouissait dans le sommeil d'une liberté imaginaire [...] craint d'être réveillé, et conspire avec ces illusions agréables pour en être plus longuement abusé, ainsi je retombe insensiblement de moi-même dans mes anciennes opinions, et j'appréhende de me réveiller. » </blockquote> La comparaison finale est riche. L'esclave qui rêve de liberté ne veut pas se réveiller ; il préfère l'illusion agréable à la réalité pénible. Nous préférons de même nos croyances confortables à l'inconfort du doute. Mais l'image porte aussi une promesse : se réveiller, c'est découvrir sa condition réelle, premier pas vers une émancipation possible. La méditation se clôt pourtant sur une incertitude, Descartes craignant que l'effort de réflexion ne suffise pas à dissiper les « ténèbres » du doute. Cette fin ouverte appelle la suite : la Seconde Méditation apportera une première lumière. == VII. Conclusion == === Le bilan du doute === La Première Méditation a conduit un travail de démolition ordonnée. Toutes les sources de connaissance ont été éprouvées : les sens, par l'argument de leur faillibilité ; l'imagination, par l'argument du rêve ; et jusqu'à la confiance que nous accordons spontanément à nos opérations rationnelles, par l'hypothèse du Dieu trompeur et du malin génie. Il ne s'agit pas de détruire l'entendement, qui restera la faculté par laquelle Descartes reconstruira le savoir, mais de suspendre la créance que nous lui prêtons d'emblée, tant que sa fiabilité n'est pas garantie. Le doute a progressé par paliers, du plus superficiel au plus profond : faillibilité des sens, possibilité du rêve, puis possibilité qu'un être tout-puissant nous trompe sur tout, y compris les mathématiques. Chaque palier englobe et approfondit le précédent. Le doute cartésien se reconnaît à quelques traits qui le séparent du scepticisme antique : il est méthodique, instrument au service de la vérité et non fin en soi ; hyperbolique, puisqu'il traite le simplement douteux comme certainement faux ; provisoire, destiné à être surmonté ; volontaire, acte par lequel l'esprit résiste à ses propres inclinations. === Du doute au cogito === Le doute le plus poussé a isolé un élément qui lui résiste : l'acte même de douter. En supposant que je n'ai pas de corps, je suppose que je crois faussement en avoir un ; mais cette croyance, vraie ou fausse, existe. L'existence de la pensée est présupposée par le doute lui-même. La Seconde Méditation exploitera cette brèche. Un point mérite ici d'être précisé, car il prête souvent à confusion. La formule « je pense, donc je suis » (''cogito, ergo sum'') ne figure pas dans les ''Méditations'' de 1641. Sa version française, « je pense donc je suis », appartient au ''Discours de la méthode'' de 1637 ; sa version latine apparaît dans les ''Principes de la philosophie'' de 1644<ref>''Historical Dictionary of Descartes and Cartesian Philosophy'', art. « Cogito ergo sum », p. 80-81 ; ''Principia'', I, art. 7 et 10.</ref>. Dans la Seconde Méditation, l'énoncé est différent et plus précis : <blockquote> « [...] il faut enfin conclure, et tenir pour constant que cette proposition : Je suis, j'existe, est nécessairement vraie, toutes les fois que je la prononce, ou que je la conçois en mon esprit. » (AT VII, 25) </blockquote> La formulation méditative (''ego sum, ego existo'') ajoute deux précisions à l'adage familier : c'est la vérité d'une ''conception'' qui est en jeu, et cette vérité ne vaut qu'''au moment'' où je la conçois ou la prononce<ref>Gary Hatfield, ''Descartes and the Meditations'', p. 101-102 ; ''Historical Dictionary'', art. cité, p. 80-81.</ref>. Cette restriction temporelle n'est pas un détail. On reprochera en effet à Descartes un cercle : il se sert de la clarté de ses perceptions pour prouver Dieu, puis de Dieu pour garantir la clarté de ses perceptions. La précision sur l'instant offre une issue : une évidence saisie ici et maintenant s'impose d'elle-même, sans garantie extérieure ; c'est seulement pour se fier à un raisonnement passé, dont on ne retient que le souvenir, que la véracité divine devient nécessaire. On notera enfin une subtilité dans la manière dont le ''cogito'' surgit. Il n'apparaît pas comme une thèse que Descartes avancerait de son propre chef, mais comme une vérité que le sceptique lui-même ne peut éviter : en doutant, il pense ; en pensant, il existe ; et il se contredit s'il prétend douter de tout<ref>Charles Larmore, « Descartes and Skepticism », p. 24-25.</ref>. La proposition que nul ne peut refuser devient alors une vérité que chacun reconnaît pour son compte. === Héritage === L'influence de la Première Méditation sur la philosophie moderne a été considérable. On lui rattache souvent l'essor d'une « philosophie du sujet » et la primauté de l'épistémologie sur la métaphysique. La formule est commode, mais elle demande de la mesure. Le geste cartésien ne surgit pas de rien : il prolonge l'examen de soi augustinien, les débats de la scolastique tardive, le scepticisme renaissant de Montaigne et de Charron, et la tradition des exercices spirituels. Plutôt que d'inaugurer seul un commencement absolu, Descartes ressaisit et réoriente un héritage. Ce qui lui revient en propre, c'est d'avoir fait de l'examen méthodique des fondements le passage obligé de toute connaissance, et d'avoir donné à la certitude du sujet une fonction qu'elle n'avait pas eue jusque-là. Les arguments du doute ont été repris et discutés par les philosophes ultérieurs. L'argument du rêve est devenu un lieu classique de l'épistémologie. L'hypothèse du malin génie a connu des reformulations contemporaines, du « cerveau dans une cuve » aux fictions de la simulation. La question que pose Descartes, celle de savoir comment distinguer l'illusion de la réalité, garde toute son actualité. == Notes et références == {{Références|colonnes=2}} [[Catégorie:Méditations métaphysiques]] [[Catégorie:René Descartes]] [[Catégorie:Commentaire philosophique]] da25b1pay6v6m3crog782i45h6taloh 768144 768107 2026-06-19T03:35:54Z PandaMystique 119061 768144 wikitext text/x-wiki {| style="width: 100%; border-top: 3px solid #3366cc; border-bottom: 1px solid #ddd; background: #fafafa; margin: 1em 0; font-size: 90%;" |- | style="padding: 8px 12px;" | ← [[Méditations métaphysiques|Sommaire]] | style="padding: 8px 12px; text-align: center;" | René Descartes, '''''[[Méditations métaphysiques]]'''''<br />'''[[Méditations métaphysiques/Première méditation : Des choses que l'on peut révoquer en doute|<big>Première méditation</big> :<br />Des choses que l'on peut révoquer en doute]]''' | style="padding: 8px 12px; text-align: right;" | [[Méditations métaphysiques/Méditation seconde : De la nature de l'esprit humain ; et qu'il est plus aisé à connaître que le corps|Méditation II]] → |} La Première Méditation ouvre les ''Méditations métaphysiques'' et pose les fondations de tout l'édifice qui suivra. Son titre, « Des choses que l'on peut révoquer en doute », annonce le projet : non pas établir des vérités, mais mettre à l'épreuve tout ce que l'on tient pour vrai. Cette méditation met en place le « doute méthodique », parfois appelé « doute hyperbolique » à son point extrême, une démarche dont l'influence sur la philosophie moderne a été profonde. Il faut situer ce projet dans son contexte. Au {{sc|xvii}}<sup>e</sup> siècle, la science nouvelle de Galilée et de Kepler contribue à déplacer l'autorité des cadres scolastiques : les mêmes principes ne suffisent plus à rendre compte des phénomènes, et la confiance dans l'enseignement reçu s'effrite. Descartes entreprend de refonder l'ensemble des connaissances sur des bases assurées ; la Première Méditation en constitue le moment négatif, celui de la démolition préalable. La marche du texte est ordonnée. Le doute progresse par paliers, chaque niveau englobant le précédent : exposition du projet (§ 1-2), faillibilité des sens (§ 3-4), argument du rêve (§ 5), distinction entre sciences composées et sciences simples (§ 6-8), hypothèse du Dieu trompeur (§ 9-12), puis du malin génie et difficulté à maintenir le doute (§ 13-15). Cette progression conduit à une suspension du jugement qui prépare la découverte du ''cogito'' dans la Seconde Méditation. == I. Le projet de refondation du savoir (§ 1-2) == === L'incipit : un commencement à la première personne === <blockquote> « Il y a déjà quelque temps que je me suis aperçu que, dès mes premières années, j'avais reçu quantité de fausses opinions pour véritables, et que ce que j'ai depuis fondé sur des principes si mal assurés, ne pouvait être que fort douteux et incertain. » </blockquote> L'œuvre s'ouvre sur un constat rétrospectif : un sujet découvre que son éducation a mêlé le vrai et le faux, et que tout ce qu'il a bâti sur cette base chancelle. Hegel voyait dans cette page un seuil de la philosophie moderne ; commentant Descartes, il comparait le penseur à un marin qui, après une longue traversée, peut enfin crier « Terre ! »<ref>G. W. F. Hegel, ''Leçons sur l'histoire de la philosophie'', t. III. Le mot est rapporté et commenté par Charles Larmore, « The First Meditation: Skeptical Doubt and Certainty », dans David Cunning (dir.), ''The Cambridge Companion to Descartes' Meditations'', Cambridge University Press, 2014, p. 48.</ref>. La formule est juste à condition de ne pas durcir le propos : Descartes n'affirme pas, dès la première phrase, que toutes ses opinions sont fausses. Il inaugure une discipline du jugement. Le doute ne remplace pas une croyance par son contraire ; il suspend l'assentiment partout où une raison de douter se présente, afin de ne garder que ce qui résiste. Le constat mérite qu'on s'arrête à ses termes. Les opinions sont « reçues » (''admisi''), non choisies : l'enfant subit les croyances que lui transmettent l'éducation et le milieu, et le doute aura précisément pour tâche de transformer ce rapport passif en examen actif. Ces opinions sont « fausses », mais elles ont été tenues « pour véritables » : le mal n'est pas l'ignorance, mais la confusion du faux et du vrai, l'assentiment accordé à ce qui ne le méritait pas. L'erreur, enfin, est massive (« quantité ») et féconde : posées comme « principes », ces faussetés ont servi de base à des constructions ultérieures, de sorte que tout l'édifice s'en trouve fragilisé. De là découle la résolution : <blockquote> « [...] il me fallait entreprendre sérieusement une fois en ma vie de me défaire de toutes les opinions que j'avais reçues jusques alors en ma créance, et commencer tout de nouveau dès les fondements, si je voulais établir quelque chose de ferme et de constant dans les sciences. » </blockquote> Le vocabulaire est celui de la rupture : « me défaire » de « toutes » les opinions, « commencer tout de nouveau » et « dès les fondements ». Mais la fin est constructive, non sceptique : il s'agit d'« établir quelque chose de ferme et de constant », c'est-à-dire d'atteindre, par la démolition, le sol assez sûr pour rebâtir. Une objection se lève aussitôt : peut-on vraiment se défaire de toutes ses opinions ? Descartes y répond par avance, comme on le verra, en ne demandant pas de les juger fausses, mais de les traiter comme telles le temps de l'examen. Au-delà de ce qu'il affirme, l'incipit retient par sa forme. Le ton surprend : là où tant de traités commencent par des définitions, Descartes part d'un « je me suis aperçu », une histoire intellectuelle datée, où le lecteur est invité à entrer. Cette dimension autobiographique tient à la méthode. Le savoir à fonder doit être assumé dans l'acte même où je juge, et non reçu par tradition ou par déférence. Reste à savoir qui parle. Le « je » des ''Méditations'' n'est pas seulement René Descartes ; c'est un méditant exemplaire dont chacun peut endosser le rôle<ref>Charles Larmore, art. cité, p. 48-68 ; voir aussi Lisa Shapiro, « The Self in the Meditations », dans Karen Detlefsen (dir.), ''Descartes' Meditations: A Critical Guide'', Cambridge University Press, 2012, p. 230.</ref>. Gary Hatfield distingue ce méditant de l'auteur historique : Descartes, lorsqu'il écrit, possède déjà sa métaphysique, tandis que le méditant doit la découvrir. Le méditant est un « débutant en philosophie » (''qui modo primum philosophari incipit'', selon l'''Entretien avec Burman'') qui adhère encore à l'idée que toute connaissance vient des sens<ref>Gary Hatfield, ''Routledge Philosophy GuideBook to Descartes and the Meditations'', Londres, Routledge, 2003 (désigné ci-après ''Descartes and the Meditations''), p. 40 et 89 ; Descartes, ''Entretien avec Burman'', AT V, p. 146.</ref>. Jorge Secada va plus loin : le texte cherche à devenir l'expression de la transformation du lecteur lui-même, qui doit refaire le parcours pour son compte plutôt que d'en suivre le récit en spectateur<ref>Jorge Secada, « God and Meditation in Descartes' ''Meditations on First Philosophy'' », dans Karen Detlefsen (dir.), ''op. cit.'', p. 201-202 : « Descartes espérait que les lecteurs de ses méditations seraient véritablement des méditants vivant le processus méditatif, processus de transformation. Les ''Méditations'' ne décrivent pas cette entreprise ; elles cherchent à devenir l'expression de la transformation du lecteur. »</ref>. L'ambiguïté du « je » est féconde : elle permet un texte à la fois personnel et universel, où chacun reconnaît ses propres préjugés. === L'erreur de l'enfance et ses mécanismes === L'expression « dès mes premières années » (''ineunte ætate'') situe l'origine de l'erreur non dans un accident isolé, mais dans l'économie de notre développement. L'enfance est le moment où se forment des habitudes de jugement difficiles à déraciner. Descartes développe cette analyse dans les ''Principes de la philosophie'' (I, 71-74)<ref>Descartes, ''Principia philosophiae'', I, art. 71-74, AT VIII-A, p. 35-37. Voir Gary Hatfield, ''Descartes and the Meditations'', p. 89-90.</ref>. L'idée n'est pas que l'enfant serait moins intelligent, mais que son esprit est d'abord étroitement lié au corps : il vit dans l'urgence des besoins, se règle sur ce qui attire ou repousse, fait plaisir ou fait mal. De là des erreurs caractéristiques. L'enfant croit que les qualités qu'il éprouve, couleurs, sons, saveurs, chaleur, existent dans les choses telles qu'il les ressent : c'est la « thèse de la ressemblance », qui traite l'expérience sensible comme une copie fidèle du réel<ref>Descartes, ''Meditationes'', VI, AT VII, p. 82 ; ''Principia'', I, art. 71, AT VIII-A, p. 35. Cf. Hatfield, ''Descartes and the Meditations'', p. 269-270.</ref>. Il tend aussi à ne donner de consistance qu'à ce qui tombe sous les sens, au point de juger qu'il n'y a rien là où il ne sent rien, habitude qui rend plus difficile, à l'âge adulte, la pensée d'êtres immatériels comme l'âme ou Dieu<ref>Descartes, ''Principia'', I, art. 71, AT VIII-A, p. 35-36.</ref>. Enfin, devenu adulte, il oublie la genèse de ses opinions : des croyances prises autrefois sur parole se présentent ensuite comme des évidences naturelles<ref>Descartes, ''Principia'', I, art. 71, AT VIII-A, p. 36.</ref>. Cet oubli explique la résistance de l'erreur : les préjugés se déguisent en certitudes. Les ''Principes'' rangent ces mécanismes sous quatre causes d'erreur : les préjugés de l'enfance, l'impossibilité de les oublier, la fatigue qu'impose l'attention aux objets non sensibles, et l'attachement de nos concepts à des mots qui ne leur correspondent pas exactement. Ces causes se soutiennent l'une l'autre : les préjugés persistent parce qu'on ne peut les oublier, parce que la pensée intellectuelle fatigue, et parce que le langage les entretient. La quatrième cause vise une difficulté à laquelle la Seconde Méditation s'attaquera, en montrant que « voir » la cire est en réalité un acte de l'intellect<ref>Descartes, ''Meditationes'', II, AT VII, p. 31-32. Cf. Martial Gueroult, ''Descartes selon l'ordre des raisons'', Paris, Aubier, 1953, t. I, p. 131-136.</ref>. On serait tenté de rapprocher cette analyse des théories modernes du conditionnement social. Le rapprochement éclaire, à condition de rester mesuré. Chez Descartes, l'éducation, le langage et l'autorité des maîtres fournissent bien une part du matériau des opinions, et l'enfance est le moment où ces contenus s'enracinent sans contrôle. Mais il ne propose pas une théorie sociale de la croyance : son but est d'expliquer pourquoi des erreurs ordinaires prennent l'allure d'évidences, afin de justifier un doute qui vise les opinions reçues et stabilisées par l'habitude. === L'édifice du savoir et la question des fondements === <blockquote> « [...] ce que j'ai depuis fondé sur des principes si mal assurés, ne pouvait être que fort douteux et incertain [...] » </blockquote> La métaphore architecturale traverse le passage : les opinions sont des « fondements » (''fundamenta''), le savoir un « édifice » (''ædificium''). Si les fondements sont « mal assurés » (''male firmata''), tout l'édifice est ébranlé. L'image est développée dans le ''Discours de la méthode'', où le philosophe est comparé à un architecte qui démolit un bâtiment instable pour rebâtir sur des bases solides<ref>Descartes, ''Discours de la méthode'', II<sup>e</sup> partie, AT VI, p. 13-14.</ref>. Cette métaphore engage une conception fondationnaliste : certaines croyances reposent sur d'autres, jusqu'à des croyances de base qui ne reposent sur rien et soutiennent l'ensemble. Edwin Curley a souligné ce trait de l'épistémologie cartésienne<ref>Edwin Curley, ''Descartes Against the Skeptics'', Cambridge (Mass.), Harvard University Press, 1978, p. 31-35 ; voir aussi « The Cogito and the Foundations of Knowledge », dans Stephen Gaukroger (dir.), ''The Blackwell Guide to Descartes' Meditations'', Oxford, Blackwell, 2006, p. 30-47.</ref>. La philosophie du {{sc|xx}}<sup>e</sup> siècle l'a discutée : Quine a soutenu que nos croyances forment un réseau plutôt qu'un édifice, où aucune n'est absolument première ; Wittgenstein a contesté qu'il faille justifier nos croyances de base. Ces objections relèvent du fondationnalisme en général ; Descartes y répondra à sa manière dans la suite des ''Méditations'', en présentant le ''cogito'' comme une vérité première, connue par intuition et non par inférence<ref>Sur le débat, voir Bernard Williams, ''Descartes: The Project of Pure Enquiry'', Harmondsworth, Penguin, 1978, chap. 2 ; Curley, ''op. cit.'', chap. 3.</ref>. Il convient toutefois de ne pas durcir l'opposition entre Descartes et la scolastique. Larmore rappelle que le fondationnalisme n'a rien d'une nouveauté cartésienne : l'idée que toute connaissance repose sur les sens imprégnait déjà la pensée du temps. Descartes ne substitue pas une vision fondationnaliste à une pensée qui en aurait été dépourvue ; il remplace une forme régnante par une autre<ref>Charles Larmore, art. cité, p. 50-51.</ref>. L'adage « il n'y a rien dans l'intellect qui n'ait d'abord été dans les sens » (''nihil est in intellectu quod non prius fuerit in sensu'') résumait cet enseignement<ref>La formule est scolastique, et non aristotélicienne au sens littéral : elle condense une thèse qu'Aristote développe dans le ''De l'âme'' (III, 7-8, 431a-432a), selon laquelle l'âme ne pense jamais sans image. Discutée par Thomas d'Aquin (''De veritate'', q. 2, a. 3, arg. 19), elle sera reprise par les empiristes, Leibniz lui ajoutant sa réserve fameuse : ''nisi ipse intellectus''.</ref>. Mais l'empirisme aristotélicien ne se réduit pas à une confiance naïve dans les sens : il fonde la connaissance sur la fiabilité de la perception dans des conditions normales, non sur son infaillibilité. C'est précisément cette nuance que le doute va exploiter. Cette mise en cause des fondements sensibles a une portée que Descartes laisse d'abord dans l'ombre. Hatfield rappelle que les « préjugés de l'enfance » recouvrent en réalité une bonne part de la métaphysique et de l'épistémologie aristotéliciennes alors enseignées<ref>Gary Hatfield, ''Descartes and the Meditations'', p. 89-90 : Descartes savait que ces « préjugés » incluaient nombre de thèses de la métaphysique et de l'épistémologie aristotéliciennes.</ref>. Ébranler la confiance dans les sens, c'est donc atteindre l'édifice de l'École. Descartes ne l'avoue pas dans les ''Méditations'', dédiées aux docteurs de la Faculté de théologie de Paris, mais il s'en ouvre à Mersenne : « Ces six Méditations contiennent tous les fondements de ma physique. Mais il ne faut pas le dire, s'il vous plaît, car ceux qui favorisent Aristote feraient peut-être plus de difficulté de les approuver »<ref>Descartes à Mersenne, 28 janvier 1641, AT III, p. 297-298. Cf. Charles Larmore, art. cité, p. 51.</ref>. En invitant chacun à refaire l'examen de ses croyances pour son propre compte, Descartes substitue à un critère de vérité un autre : non plus l'accord avec les Anciens ou l'autorité d'une tradition, mais l'évidence présente à l'esprit individuel. === Les conditions de la méditation === <blockquote> « Maintenant donc que mon esprit est libre de tous soins, et que je me suis procuré un repos assuré dans une paisible solitude, je m'appliquerai sérieusement et avec liberté à détruire généralement toutes mes anciennes opinions. » </blockquote> Un tel examen, que chacun doit reprendre pour son propre compte, ne s'improvise pas : il demande des conditions que Descartes prend soin de décrire. Il a d'abord fallu attendre un âge assez mûr pour l'entreprendre, comme le note la première page. Il faut ensuite réunir trois conditions présentes. La liberté à l'égard des soucis (''curae'') d'abord : la méditation demande une attention unifiée que les préoccupations pratiques fragmentent. Cette exigence retrouve l'opposition antique entre vie active (''negotium'') et loisir studieux (''otium''), mais lui donne une fin nouvelle, puisque l'''otium'' cartésien est provisoire et ordonné à une refondation. La sécurité ensuite : un esprit menacé se tourne vers l'action et la survie, non vers la métaphysique. Historiquement, Descartes jouissait aux Pays-Bas, vers 1640, d'une retraite assez stable pour mener ce travail. La solitude enfin : non par misanthropie, mais parce que la présence d'autrui introduit des opinions et des autorités, et parce que le fondement recherché doit être trouvé en soi-même. Le ''cogito'' sera une vérité solitaire, accessible à chaque esprit pour son propre compte. Ce cadre est traversé par une exigence d'unicité, que le texte latin nomme ''semel in vita'', « une fois dans la vie » : « ''funditus omnia semel in vita esse evertenda'' ». Le doute n'est pas une attitude permanente, comme la suspension du jugement des sceptiques, mais un moment destiné à produire des résultats durables<ref>Gary Hatfield, « The Senses and the Fleshless Eye: The ''Meditations'' as Cognitive Exercises », dans Amélie O. Rorty (dir.), ''Essays on Descartes' Meditations'', Berkeley, University of California Press, 1986, p. 45-79 ; ''Descartes and the Meditations'', p. 40-43.</ref>. La métaphysique est épuisante : Descartes conseillera à Élisabeth de Bohême de ne lui consacrer que peu d'heures par an<ref>Descartes à Élisabeth, 28 juin 1643, AT III, p. 692-695.</ref>. Une fois le fondement atteint, il n'a pas à être cherché de nouveau, et le parcours méditatif opère une transformation du sujet qui ne se répète pas. Le terme même de « méditation » inscrit l'œuvre dans la tradition des exercices spirituels, dont les ''Exercices'' d'Ignace de Loyola, composés dans les années 1520 et imprimés en 1548, offrent le modèle le plus diffusé ; Descartes en avait pratiqué à La Flèche<ref>Gary Hatfield, « The Senses and the Fleshless Eye », p. 47-54 ; ''Descartes and the Meditations'', p. 40-42.</ref>. Les ''Méditations'' partagent avec ce genre une répartition en journées, un engagement actif du lecteur (la préface réclame « plusieurs mois, ou du moins plusieurs semaines » de réflexion sur la seule Première Méditation), une visée de transformation et une progression ordonnée où nul degré ne peut être sauté<ref>Descartes, ''Meditationes'', Préface, AT VII, p. 9.</ref>. Mais l'objet n'est pas Dieu pris pour lui-même, la méthode n'est pas l'imagination de scènes bibliques, et le but n'est pas le salut mais la certitude<ref>Jorge Secada, art. cité, p. 200-201, qui décrit les ''Méditations'' comme un « manuel thérapeutique » offrant un traitement pour une maladie cognitive liée à l'union de l'esprit et du corps.</ref>. Secada note d'ailleurs que nous, lecteurs d'aujourd'hui, ne pouvons plus revêtir aussi aisément l'habit du méditant, parce que nous n'accordons plus la même foi à la promesse cartésienne d'une science nouvelle<ref>Jorge Secada, art. cité, p. 202.</ref>. Une dernière condition est explicitée plus loin : « il n'est pas maintenant question d'agir, mais seulement de méditer et de connaître » (AT VII, 22). Le doute appartient à la théorie, non à la pratique. Dans l'action, on ne peut attendre la certitude absolue ; il faut se régler sur le probable, selon la « morale par provision » du ''Discours''<ref>Descartes, ''Discours de la méthode'', III<sup>e</sup> partie, AT VI, p. 22-28. Cf. ''Historical Dictionary of Descartes and Cartesian Philosophy'', 2<sup>e</sup> éd., Lanham, Rowman & Littlefield, 2015, art. « Doubt », p. 120-121, qui rappelle que, dans les affaires pratiques, on ne doit pas exiger la certitude due à la science théorique.</ref>. Cette distinction protège l'entreprise de l'objection d'apraxie : on continue d'agir selon ses croyances ordinaires alors même qu'on les a suspendues pour les besoins de la connaissance. === Le principe du doute : l'indubitabilité === <blockquote> « [...] il n'est pas besoin que je les examine chacune en particulier, ce qui serait d'un travail infini ; mais, parce que la ruine des fondements entraîne nécessairement avec soi tout le reste de l'édifice, je m'attaquerai d'abord aux principes sur lesquels toutes mes anciennes opinions étaient appuyées. » </blockquote> Le second paragraphe énonce la règle qui gouverne l'entreprise. Elle tient en peu de mots : ce qui donne la moindre raison de douter doit être traité comme faux. Le texte latin le dit nettement : « ''non minus accurate ab iis quae non plane certa sunt atque indubitata, quam ab aperte falsis assensionem esse cohibendam'' » (AT VII, 18). Du point de vue de la méthode, il n'y a pas de différence entre ce qui est « manifestement faux » et ce qui n'est « pas entièrement certain et indubitable ». Plutôt que d'examiner ses opinions une à une, ce qui serait sans fin, Descartes vise les principes qui les soutiennent. La métaphore de l'édifice commande cette économie : pour abattre une construction, mieux vaut saper les fondations que démolir les murs un par un. Le fondement à ébranler, ce sont les sens, sur lesquels reposent « toutes les choses que j'ai admises jusqu'à présent comme les plus vraies ». L'attaque vise donc l'empirisme du sens commun et celui de l'École. Une autre image, donnée dans les ''Septièmes Réponses'', éclaire le procédé. Qui possède un panier de pommes et craint que certaines soient gâtées a intérêt à les vider toutes, puis à ne remettre que les saines après examen<ref>Descartes, ''Responsiones VII'', AT VII, p. 481.</ref>. Le tri ne peut se faire qu'après le renversement : tant que les pommes restent empilées, la pomme gâtée se dissimule parmi les bonnes et risque de les corrompre. De même, une croyance fausse logée parmi les vraies se laisse mal repérer et menace l'ensemble ; mieux vaut suspendre l'adhésion à toutes, puis réexaminer chacune. Cette image rend compte du caractère apparemment excessif du doute : son ampleur n'est pas une fin, mais le moyen le plus sûr de ne laisser passer aucune erreur cachée. L'exigence est élevée : non la probabilité, mais l'indubitabilité absolue. Est certain ce qui résiste à tout doute concevable, fût-il improbable. Cette exigence n'a rien d'évident, et Larmore observe qu'un empiriste n'aurait aucune raison de l'adopter : pour Aristote, la perception fonde la connaissance par sa fiabilité dans des conditions normales, non par son infaillibilité<ref>Charles Larmore, art. cité, p. 62-63.</ref>. Pourquoi alors la requérir ? La réponse tient au cadre de l'enquête. Dans la vie ordinaire, où le temps presse et où il faut agir, nous nous en tenons aux croyances suffisamment appuyées. Mais chercher la connaissance pour elle-même est autre chose. C'est ce que Bernard Williams a nommé le point de vue de l'« enquête pure »<ref>Bernard Williams, ''Descartes: The Project of Pure Enquiry'', p. 46-49.</ref>. La logique de ce choix peut se résumer simplement<ref>Charles Larmore, art. cité, p. 64.</ref>. Chercher la connaissance, c'est poursuivre à la fois deux buts qui ne vont pas ensemble : gagner des vérités et éviter des erreurs. On le voit dès qu'on les sépare. Un esprit qui ne voudrait qu'amasser des vérités croirait tout, quitte à se charger de faussetés ; un esprit qui ne voudrait qu'éviter l'erreur ne croirait rien, et y parviendrait à coup sûr. Ni l'un ni l'autre n'est raisonnable : il faut tenir les deux ensemble. Mais quand ils s'opposent, Descartes tranche pour la prudence, et c'est pourquoi le moindre doute suffit à refuser l'assentiment. À la lettre, « rechercher la vérité » nomme donc mal son entreprise, dont le premier soin est d'écarter le faux. === Le doute, instrument méthodique === Le traitement « comme faux » est provisoire. Descartes ne juge pas que ses opinions sont fausses ; il décide de les tenir pour telles tant que leur certitude n'est pas établie. La distinction importe : il ne ''nie'' pas ses anciennes opinions, il s'abstient de les ''affirmer''. Nier reviendrait à affirmer le contraire ; s'abstenir, c'est ne rien affirmer. Gueroult parle d'une « exclusion provisoire » des opinions hors du champ de la certitude, non d'un rejet définitif : ce qui a été écarté pourra être réintroduit à son rang dans la « chaîne des raisons »<ref>Martial Gueroult, ''Descartes selon l'ordre des raisons'', t. I, p. 33-34.</ref>. Cette idée de chaîne renvoie à ce que Gueroult tient pour la clé des ''Méditations'', l'« ordre des raisons » (''ordo rationum'') : chaque thèse ne vaut qu'à sa place dans une progression où elle dépend des précédentes et prépare les suivantes<ref>Martial Gueroult, ''op. cit.'', t. I, p. 19-22.</ref>. Le principe du doute occupe, dans cet ordre, le rang premier : il fixe la règle selon laquelle l'examen sera conduit. Mais cette règle est-elle elle-même à l'abri du doute ? Descartes ne la démontre pas ; il la présente comme un commandement de la raison (« la raison me persuade »). On peut y voir une difficulté : si toute évidence est suspecte, comment la règle peut-elle échapper au doute qu'elle prescrit ? La réponse tient à son statut : ce n'est pas une opinion sur le monde, mais une décision de méthode, qui ne prétend rien affirmer et se borne à régler une conduite. Gueroult dégage de ce dispositif quatre caractères du doute, tous solidaires du principe<ref>Martial Gueroult, ''op. cit.'', t. I, p. 33 : « À cette triple nécessité correspondent trois caractères du doute cartésien : il est méthodique, il est universel, il est radical. En outre, son caractère méthodique faisant de lui un simple instrument en vue de fonder la certitude du savoir, c'est-à-dire le dogmatisme de la science, il en résulte un quatrième caractère : le doute cartésien est provisoire. »</ref>. Le doute est méthodique : non un sentiment d'incertitude, mais une décision au service d'un objectif, fonder la certitude du savoir. Il est universel : rien n'en est exempté tant que le doute n'est pas « radicalement impossible ». Il est radical : les opinions douteuses ne sont pas mises entre parenthèses, mais rejetées entièrement. Il est provisoire : son caractère d'instrument l'ordonne à la reconstruction, et les opinions écartées pourront retrouver leur place une fois les fondements établis. Une fiction soutient ce traitement. Pour contrebalancer la force des opinions probables, Descartes décide de « feindre » que tout est faux. Gassendi, puis Huet, objecteront que traiter une opinion comme fausse, c'est en acquérir une autre, et que tenir pour fausses des opinions en partie vraies, c'est se tromper plutôt que l'éviter<ref>Pierre Gassendi, ''Cinquièmes Objections'', AT VII, p. 257-258. Cf. Charles Larmore, « Descartes and Skepticism », dans Stephen Gaukroger (dir.), ''The Blackwell Guide to Descartes' Meditations'', p. 24-25.</ref>. Descartes répond en distinguant le jugement de la fiction : feindre que ses opinions sont fausses n'est pas juger qu'elles le sont, mais procéder comme un géomètre qui suppose certaines propriétés pour les besoins d'une démonstration. Gueroult rapproche cette fiction des constructions auxiliaires de la géométrie<ref>Martial Gueroult, ''op. cit.'', t. I, p. 39.</ref>. Le malin génie sera l'aboutissement de ce procédé. Une telle décision suppose enfin une certaine conception de l'assentiment : pour Descartes, tenir une proposition pour vraie est un acte de la volonté, non une réponse passive de l'intellect. C'est ce qui rend le doute possible. L'entendement incline à affirmer ce qui paraît clair, mais la volonté, « infinie » en son genre, peut s'opposer à cette inclination et suspendre l'assentiment. Le doute est en ce sens un effort à contre-courant des tendances spontanées<ref>Cette conception de l'assentiment sera développée dans la Quatrième Méditation. Cf. Martial Gueroult, ''op. cit.'', t. I, p. 39.</ref>. Reste que ce principe s'inscrit dans la tradition sceptique tout en s'en séparant par sa fin. Comme le note Deborah Brown, on tient communément que Descartes n'introduit pas d'argument sceptique nouveau, mais que son usage proprement méthodique du scepticisme est, lui, inédit<ref>Deborah Brown, « Descartes and Content Skepticism », dans Karen Detlefsen (dir.), ''op. cit.'', p. 25-26.</ref>. Les Anciens visaient la tranquillité de l'âme (''ataraxia'') par la suspension du jugement ; Descartes vise des certitudes qui résistent à tous les doutes. Pour eux le doute était une fin et la suspension un terme ; pour lui le doute est un moyen et la suspension un passage. == II. Le doute sur les sens (§ 3-4) == === L'erreur des sens === <blockquote> « Tout ce que j'ai reçu jusqu'à présent pour le plus vrai et assuré, je l'ai appris des sens, ou par les sens ; or j'ai quelquefois éprouvé que ces sens étaient trompeurs, et il est de la prudence de ne se fier jamais entièrement à ceux qui nous ont une fois trompés. » </blockquote> Le principe une fois posé, Descartes l'applique au fondement le plus apparent du savoir, les sens. Le premier argument est simple. Les sens nous ont parfois trompés ; or il n'est pas prudent de se fier entièrement à qui nous a déjà trompés ; donc les sens ne méritent pas une confiance entière. Le principe de prudence est emprunté au domaine moral, où l'on se méfie d'un témoin qui a menti, et transposé aux facultés. La distinction « des sens, ou par les sens » (''a sensibus, vel per sensus'') vaut d'être notée : certaines croyances viennent directement de la perception, d'autres indirectement, par le témoignage, les livres ou l'enseignement, qui passent tous par l'ouïe ou la vue. Ordinairement, ce principe n'a pas une portée si stricte : un ami qui enjolive la vérité ne perd pas toute crédibilité, et nous distinguons les contextes où une source est fiable de ceux où elle ne l'est pas. Si Descartes l'applique sans réserve, c'est en vertu de l'exigence qu'il s'est donnée : pour qui cherche l'indubitable, le moindre risque d'erreur disqualifie une source. La portée de l'argument reste pourtant limitée, et Descartes le reconnaît : les illusions concernent surtout les « choses peu sensibles et fort éloignées ». La tour paraît ronde parce qu'elle est loin ; le bâton paraît brisé parce que la réfraction déforme son image. Ces exemples reprennent ce que les sceptiques anciens nommaient les « tropes » de la suspension du jugement. Sextus Empiricus avait catalogué les variations de la perception selon les conditions ; c'est surtout le cinquième trope, celui « des positions, des distances et des lieux », que Descartes mobilise ici sans le nommer<ref>Sur la dette envers le scepticisme ancien, voir Thomas M. Lennon et Michael W. Hickson, « The Skepticism of the First Meditation », dans Karen Detlefsen (dir.), ''op. cit.'', p. 9-24, ainsi que Charles Larmore, « Descartes and Skepticism », p. 17-29.</ref>. Mais il n'en tire pas la conclusion pyrrhonienne : la faillibilité des sens n'est, pour lui, qu'une étape vers un fondement plus ferme. Que les sens trompent dans des conditions défavorables suggère une parade : peut-être sont-ils fiables pour les objets proches, de taille moyenne, perçus dans de bonnes conditions. Descartes formule lui-même cette objection. === L'évidence sensible et l'écart de la folie === <blockquote> « Mais, encore que les sens nous trompent quelquefois, touchant les choses peu sensibles et fort éloignées, il s'en rencontre peut-être beaucoup d'autres, desquelles on ne peut pas raisonnablement douter, quoique nous les connaissions par leur moyen : par exemple, que je sois ici, assis auprès du feu, vêtu d'une robe de chambre, ayant ce papier entre les mains, et autres choses de cette nature. » </blockquote> La scène du philosophe auprès du feu rassemble tout ce qui garantit une perception fiable : la proximité des objets, leur taille moyenne, des conditions d'observation normales, des objets familiers, la convergence des sens (il voit le feu, en sent la chaleur, touche le papier) et l'implication de son propre corps. La situation est ordinaire et chacun peut s'y reconnaître ; elle fonctionne comme un cas limite. Si les sens ne sont pas fiables ici, le seront-ils jamais ? Cette objection a une valeur pédagogique. En la formulant, Descartes donne voix à la résistance que tout lecteur oppose spontanément au doute : « les sens me trompent peut-être de loin, mais non sur ce que je perçois ici et maintenant ». Loin de l'écarter, il la prend au sérieux et la pousse à son point le plus fort, pour mieux la dépasser ensuite par l'argument du rêve. Le lecteur ne subit donc pas le doute de l'extérieur : il le voit naître de ses propres certitudes. Pour douter de telles évidences, il faudrait être fou. Descartes évoque alors la folie (''amentia'', ''dementia''), décrite selon la médecine de son temps : un cerveau « troublé et offusqué par les noires vapeurs de la bile », c'est-à-dire la mélancolie née de l'atrabile. Les exemples illustrent deux délires, l'un portant sur les circonstances (se croire roi quand on est pauvre), l'autre sur le corps propre (s'imaginer de verre). Le délire du « corps de verre » était un trouble bien repéré à l'époque, dont le cas le plus fameux est celui de Charles VI de France, mais Descartes reprend un exemple devenu courant dans la littérature médicale. Il écarte aussitôt l'hypothèse : « Mais quoi ? ce sont des fous ; et je ne serais pas moins extravagant, si je me réglais sur leurs exemples. » Ce rejet a nourri d'importants débats. Trois lectures se complètent. Pour la lecture méthodologique, l'hypothèse de la folie détruirait la raison elle-même : un fou ne raisonne pas, et l'entreprise des ''Méditations'' suppose un lecteur capable de suivre des arguments ; prendre la folie au sérieux reviendrait à arrêter l'ouvrage avant de l'avoir commencé<ref>Cette lecture remonte à Harry Frankfurt, ''Demons, Dreamers, and Madmen: The Defense of Reason in Descartes' Meditations'', Indianapolis, Bobbs-Merrill, 1970. Elle est reprise par Fred Ablondi (2007) ; David Scott (2009) lui oppose l'idée que la folie est prise au sérieux et reversée dans l'argument du rêve. On trouvera la discussion dans Lennon et Hickson, art. cité, p. 12-14.</ref>. Pour la lecture par l'universalité, proposée par Lennon et Hickson, l'argument de la folie manque de généralité : il fait voir que certains, parfois, sont trompés, là où l'argument du rêve fera voir que tous, parfois, le sont ; supposer que les vapeurs ont gagné toutes les têtes serait soi-même un signe de folie<ref>Thomas M. Lennon et Michael W. Hickson, art. cité, p. 11-16.</ref>. Pour la lecture dialogique de Larmore, enfin, celui qui rejette la folie n'est pas Descartes, mais le méditant empiriste qui croit encore aux sens : de son point de vue, écarter un cas pathologique est raisonnable<ref>Charles Larmore, « Descartes and Skepticism », p. 22-24, qui reconstruit la méditation comme un dialogue entre un empiriste et un sceptique.</ref>. Michel Foucault et Jacques Derrida ont mené sur ce passage une controverse restée fameuse. Pour Foucault, le rejet de la folie marque le geste par lequel l'âge classique exclut la déraison du champ de la pensée légitime<ref>Michel Foucault, ''Histoire de la folie à l'âge classique'', Paris, Gallimard, 1972 (1<sup>re</sup> éd. 1961), notamment p. 56-59.</ref>. Pour Derrida, au contraire, le ''cogito'' résiste même à l'hypothèse de la folie : que je sois fou ou non, je pense, donc je suis ; la folie n'est pas exclue mais débordée par le doute, qui ira jusqu'à envisager une tromperie atteignant même les esprits sains<ref>Jacques Derrida, « Le Cogito et l'histoire de la folie », dans ''L'Écriture et la différence'', Paris, Seuil, 1967, p. 51-97. Foucault répondra à Derrida dans « Mon corps, ce papier, ce feu », repris en appendice de l'''Histoire de la folie''.</ref>. == III. L'argument du rêve (§ 5) == === L'indiscernabilité de la veille et du sommeil === <blockquote> « Toutefois j'ai ici à considérer que je suis homme, et par conséquent que j'ai coutume de dormir et de me représenter en mes songes les mêmes choses, ou quelquefois de moins vraisemblables, que ces insensés, lorsqu'ils veillent. » </blockquote> Ce que Descartes refusait d'envisager comme folie, il l'accepte comme rêve. Le déplacement est subtil et tient à un mot : « je suis homme ». La folie frappe certains ; le rêve est le lot de tous. Chaque nuit, l'homme vit en songe des expériences semblables à celles des fous, et même de moins vraisemblables. L'argument quitte ainsi le pathologique pour le commun, ce que l'argument de la folie ne pouvait faire. <blockquote> « Combien de fois m'est-il arrivé de songer, la nuit, que j'étais en ce lieu, que j'étais habillé, que j'étais auprès du feu, quoique je fusse tout nu dedans mon lit ? » </blockquote> Le parallèle avec la scène du feu est exact : les détails mêmes qui semblaient garantir la réalité de l'expérience (le lieu, les vêtements, le feu) peuvent figurer dans un rêve. Le songe reproduit les conditions de l'évidence sensible. Descartes tente une résistance, en invoquant la clarté de la perception présente, le sentiment du mouvement volontaire, la netteté des sensations : « c'est avec dessein et de propos délibéré que j'étends cette main ». Mais le souvenir de rêves passés ruine ces critères : on a déjà cru, en songe, percevoir clairement et agir volontairement. <blockquote> « [...] je vois si manifestement qu'il n'y a point d'indices certains par où l'on puisse distinguer nettement la veille d'avec le sommeil, que j'en suis tout étonné ; et mon étonnement est tel, qu'il est presque capable de me persuader que je dors. » </blockquote> La conclusion est célèbre : aucun « indice certain » (''indicium certum'') ne permet de distinguer, du dedans de l'expérience, la veille du sommeil. Descartes ne dit pas qu'il n'y a aucune différence, mais qu'il n'y a pas de marque ''infaillible'', accessible au rêveur pendant qu'il rêve. La force de l'argument tient à ce que le rêve peut imiter toutes les propriétés de la veille : sa vivacité, sa cohérence apparente, le sentiment du contrôle. L'étonnement (le latin dit ''obstupescam'') n'est pas ici l'émerveillement serein qui, chez Aristote, donne naissance à la philosophie ; c'est un vertige, le trouble d'un esprit qui ne trouve plus d'appui pour départager le songe de la veille, et c'est ce déséquilibre qui fait avancer le doute. Il faut préciser ce que l'argument met en doute. Comme le souligne Larmore, il porte sur la question « puis-je savoir, à cet instant, que je suis éveillé ? », et non sur la question « l'expérience de veille est-elle véridique ? »<ref>Charles Larmore, « Descartes and Skepticism », p. 22-23 : le doute du rêve concerne d'un bout à l'autre la différence entre veille et sommeil, et sa résolution consiste à montrer comment établir que l'on veille.</ref>. Il présuppose donc que si je veille, mes perceptions d'objets proches sont véridiques ; ce qu'il conteste, c'est ma capacité à établir que je veille. Cette précision commande la résolution ultérieure : Descartes ne soutiendra pas que les perceptions de veille sont toujours vraies, mais montrera comment distinguer les deux états. L'argument semble pourtant se heurter à un paradoxe. Pour le formuler, Descartes doit savoir ce que « rêver » et « veiller » veulent dire, et se souvenir d'avoir rêvé ; or comment le saurait-il s'il ne pouvait distinguer les deux états ? Hatfield répond qu'il n'a pas à prouver l'existence de cas réels de veille : il lui suffit que le lecteur comprenne la possibilité de l'indiscernabilité<ref>Gary Hatfield, ''Descartes and the Meditations'', p. 75-77.</ref>. Descartes ne cherche pas à établir qu'on rêve toujours, mais à instiller un doute sur notre capacité à savoir, à un moment donné, si l'on veille. === Portée et limites de l'argument === L'argument, une fois admis, peut s'étendre. Si je ne puis être certain de ne pas rêver, alors les objets que je crois percevoir pourraient ne pas exister ; et l'on peut aller plus loin, en supposant que « peut-être nos mains, ni tout notre corps, ne sont pas tels que nous les voyons ». Le doute atteint le corps propre. Descartes ne pousse pas aussitôt cette extension à son terme : il introduit l'analogie du peintre, qui en marque la limite et fait transition vers les natures simples. L'argument du rêve a des précédents antiques : il figurait parmi les tropes pyrrhoniens, et Cicéron rapporte que les Académiciens tenaient qu'aucune impression n'est telle qu'une impression semblable ne pût venir d'une autre source<ref>Sur les précédents, voir Lennon et Hickson, art. cité, p. 17-20.</ref>. Mais l'usage cartésien diffère sur trois points. La fin d'abord : instrument d'un projet dogmatique, non chemin vers l'''ataraxia''. La portée ensuite : le scepticisme antique ne mettait pas en doute l'existence du monde, que l'argument cartésien, joint aux suivants, finira par atteindre. Le statut enfin : provisoire et destiné à être surmonté. Descartes reconnaissait lui-même que ces doutes n'étaient pas neufs, parlant de « réchauffer un vieux chou », mais il les pliait à une fin nouvelle<ref>Charles Larmore, « Descartes and Skepticism », p. 18-19.</ref>. === La résolution de la Sixième Méditation === L'argument n'est pas abandonné : il sera résolu dans la Sixième Méditation, après que la véracité divine aura été établie. Le critère proposé est la cohérence mémorielle. <blockquote> « Je remarque maintenant qu'il y a une grande différence entre les deux, en ce que jamais les rêves ne sont liés par la mémoire avec toutes les autres actions de la vie, comme le sont les choses qui arrivent à celui qui veille. [...] Lorsque je perçois distinctement d'où viennent les choses, où et quand elles me parviennent, et que je peux rattacher mes perceptions au reste de ma vie sans interruption, alors je suis tout à fait certain qu'en les rencontrant je ne suis pas endormi mais éveillé. » (AT VII, 89-90) </blockquote> Les expériences de veille s'enchaînent et se relient à l'ensemble de la vie par la mémoire ; les rêves sont fragmentaires et déconnectés. Ce critère ne relève pas des sens seuls, mais de l'intellect et de la mémoire, ce qui explique qu'il n'était pas disponible pour l'empiriste de la Première Méditation. La résolution illustre ainsi la thèse maîtresse de l'œuvre : la connaissance ne repose pas sur les sens, mais sur l'activité judicative de l'intellect<ref>Sur cette lecture, voir David Cunning (dir.), ''The Cambridge Companion to Descartes' Meditations'', notamment l'analyse de Larmore selon laquelle ces lignes sont le moment où le « je » parle enfin pleinement la voix de Descartes.</ref>. La résolution n'est pas sans difficultés. Ne pourrait-on rêver que le critère est satisfait, rêver d'une vie cohérente ? Descartes admet que la pression des affaires ne laisse pas toujours le temps de vérifier, et que des erreurs surviennent. Hatfield observe qu'il n'avait sans doute pas besoin d'une certitude absolue dans tous les cas : son but premier était d'établir les vérités de la métaphysique, qui ne dépendent pas des sens ; pour le reste, il suffit que les sens soient fiables dans l'ensemble et que leurs rapports puissent être recoupés<ref>Gary Hatfield, ''Descartes and the Meditations'', p. 276-277.</ref>. == IV. Les natures simples et l'analogie du peintre (§ 6-8) == === Ce qui résiste au doute du rêve === <blockquote> « Toutefois il faut au moins avouer que les choses qui nous sont représentées dans le sommeil sont comme des tableaux et des peintures, qui ne peuvent être formées qu'à la ressemblance de quelque chose de réel et de véritable. » </blockquote> L'analogie du peintre oppose une contre-objection au doute. Même un peintre qui invente des sirènes ou des satyres compose ses figures à partir d'éléments réels, en mêlant des membres empruntés à des animaux existants. De même, le rêve le plus extravagant présuppose des éléments simples qui, eux, doivent avoir quelque réalité. <blockquote> « [...] à tout le moins les couleurs dont ils le composent doivent-elles être véritables. » </blockquote> Descartes envisage le cas limite d'une invention entièrement nouvelle : même alors, les « couleurs », c'est-à-dire les éléments les plus simples de la composition, doivent être véritables. Il en tire la liste des natures simples qui résistent au doute du rêve : <blockquote> « De ce genre de choses est la nature corporelle en général, et son étendue ; ensemble la figure des choses étendues, leur quantité ou grandeur, et leur nombre ; comme aussi le lieu où elles sont, le temps qui mesure leur durée, et autres semblables. » </blockquote> Ces notions, étendue, figure, grandeur, nombre, lieu, temps, sont communes à tout ce qui peut être représenté, réel ou imaginaire ; elles forment le matériau de toute représentation possible. On notera que Descartes retient l'extension spatiale et la durée, mais non la couleur, parmi ces éléments premiers : il annonce ainsi, sans l'argumenter encore, sa thèse ultérieure selon laquelle la couleur n'est pas une propriété première des corps. Si cette réduction paraît naturelle au méditant, il est déjà en chemin vers le cartesianisme ; sinon, il peut passer outre et poursuivre<ref>Gary Hatfield, ''Descartes and the Meditations'', p. 78-79.</ref>. === La hiérarchie des sciences === <blockquote> « [...] la physique, l'astronomie, la médecine, et toutes les autres sciences qui dépendent de la considération des choses composées, sont fort douteuses et incertaines ; mais [...] l'arithmétique, la géométrie, et les autres sciences de cette nature, qui ne traitent que de choses fort simples et fort générales, sans se mettre beaucoup en peine si elles sont dans la nature, ou si elles n'y sont pas, contiennent quelque chose de certain et d'indubitable. » </blockquote> Le doute du rêve établit une partition. Les sciences des choses composées (physique, astronomie, médecine) dépendent de l'existence réelle de leurs objets ; elles sont donc atteintes. Les sciences des choses simples (arithmétique, géométrie) ne traitent que de relations entre concepts, indépendamment de toute existence : « soit que je veille ou que je dorme, deux et trois joints ensemble formeront toujours le nombre de cinq, et le carré n'aura jamais plus de quatre côtés ». Ces vérités paraissent inattaquables. Descartes semble avoir atteint un point fixe. Mais la formule « il ne semble pas possible » (''nec fieri posse videtur'') laisse entendre que cette impossibilité n'est qu'apparente : le doute n'est pas à son terme. == V. L'hypothèse du Dieu trompeur (§ 9-12) == === La toute-puissance et le doute sur les mathématiques === <blockquote> « Toutefois il y a longtemps que j'ai dans mon esprit une certaine opinion, qu'il y a un Dieu qui peut tout, et par qui j'ai été créé et produit tel que je suis. Or qui me peut avoir assuré que ce Dieu n'ait point fait qu'il n'y ait aucune terre, aucun ciel, aucun corps étendu [...] et que néanmoins j'aie les sentiments de toutes ces choses ? » </blockquote> L'hypothèse du Dieu trompeur porte le doute jusqu'aux vérités que le rêve épargnait. Elle s'appuie sur une opinion ancienne et reçue, non sur une connaissance : « une certaine opinion » selon laquelle un Dieu tout-puissant m'a créé. Si Dieu peut tout, rien ne l'empêche en principe de me faire éprouver un monde qui n'existe pas, ni même de me faire faillir dans les opérations les plus simples. <blockquote> « [...] il se peut faire qu'il ait voulu que je me trompe toutes les fois que je fais l'addition de deux et de trois, ou que je nombre les côtés d'un carré [...]. » </blockquote> Le doute atteint désormais les mathématiques. On peut, avec Hatfield, distinguer deux ressorts dans ce passage<ref>Gary Hatfield, « The Cartesian Circle », dans Stephen Gaukroger (dir.), ''The Blackwell Guide to Descartes' Meditations'', p. 126-127.</ref>. Selon le premier, le Dieu trompeur ''intervient'' à chaque opération pour fausser mon calcul : ma faculté de raisonner ne serait pas en cause, mais ses résultats deviendraient inutilisables, comme si une influence imperceptible me faisait tenir pour vrai que deux et trois ne font pas cinq. Selon le second, plus profond, c'est ma faculté de raisonner elle-même qui aurait été ''mal conçue'', de sorte qu'elle produirait régulièrement des résultats faux que je croirais pourtant assurés. Je serais alors comme une machine à calculer au mécanisme défectueux. C'est ce point culminant qui rend le doute « hyperbolique » : non seulement le monde, mais les évidences rationnelles les plus fermes deviennent suspectes. === Bonté divine et hypothèse athée === <blockquote> « Mais peut-être que Dieu n'a pas voulu que je fusse déçu de la sorte, car il est dit souverainement bon. » </blockquote> Une objection théologique se présente : un Dieu souverainement bon ne saurait vouloir me tromper. Mais elle se retourne. Si la bonté divine est incompatible avec une tromperie permanente, pourquoi serait-elle compatible avec une tromperie occasionnelle ? Or nous nous trompons parfois ; c'est un fait. La bonté de Dieu ne suffit donc pas à garantir l'absence d'erreur, et le doute subsiste. <blockquote> « Il y aura peut-être ici des personnes qui aimeront mieux nier l'existence d'un Dieu si puissant, que de croire que toutes les autres choses sont incertaines. » </blockquote> L'athéisme n'offre pas d'échappatoire ; il aggrave la situation. Descartes renforce le second ressort du doute en considérant les origines que l'incroyant pourrait substituer à Dieu : « quelque destin ou fatalité », le « hasard », ou « une continuelle suite et liaison des choses »<ref>Sur ces trois hypothèses d'origine, voir Gary Hatfield, « The Cartesian Circle », p. 127.</ref>. Quelle que soit la cause supposée, moins elle est parfaite, plus il est probable que son effet, moi, soit imparfait et porté à l'erreur. Faillir étant une imperfection, un auteur moins puissant qu'un Dieu parfait laisse craindre une faculté plus défaillante encore. Sans un Dieu parfait pour garantir mes facultés, je suis livré à une imperfection peut-être sans remède. Ce premier mouvement du doute trouve ici sa conclusion : <blockquote> « [...] je suis contraint d'avouer que, de toutes les opinions que j'avais autrefois reçues en ma créance pour véritables, il n'y en a pas une de laquelle je ne puisse maintenant douter, non par aucune inconsidération ou légèreté, mais pour des raisons très fortes et mûrement considérées : de sorte qu'il est nécessaire que j'arrête et suspende désormais mon jugement sur ces pensées [...]. » (AT VII, 21-22) </blockquote> Le résultat est sans reste : aucune des anciennes opinions n'échappe au doute. Descartes insiste sur la qualité de cette suspension, qui ne procède d'aucune « légèreté », mais de « raisons très fortes et mûrement considérées ». La formule « arrêter et suspendre mon jugement » retrouve le vocabulaire de l'''epochè'' sceptique, mais la fin reste opposée : on suspend pour pouvoir ensuite établir, non pour demeurer dans la suspension. == VI. Le malin génie (§ 13-15) == === La résistance des anciennes opinions et le choix de feindre === Avant d'introduire le malin génie, Descartes constate que la suspension du jugement ne tient pas d'elle-même. <blockquote> « Mais il ne suffit pas d'avoir fait ces remarques, il faut encore que je prenne soin de m'en souvenir ; car ces anciennes et ordinaires opinions me reviennent encore souvent en la pensée, le long et familier usage qu'elles ont eu avec moi leur donnant droit d'occuper mon esprit contre mon gré, et de se rendre presque maîtresses de ma créance. » </blockquote> La remarque est de psychologie épistémique. Les opinions tiennent leur force de l'habitude : elles reviennent « contre mon gré », et le « long et familier usage » leur confère un « droit », presque juridique, d'occuper l'esprit. L'esprit apparaît comme un champ de forces où la volonté de douter doit lutter contre l'inertie des croyances établies. <blockquote> « Et je ne me désaccoutumerai jamais d'y acquiescer [...] tant que je les considérerai telles qu'elles sont en effet, c'est à savoir en quelque façon douteuses [...] et toutefois fort probables, en sorte que l'on a beaucoup plus de raison de les croire que de les nier. » </blockquote> Descartes reconnaît que ces opinions sont « fort probables » : il serait plus raisonnable de les croire que de les nier. Mais la probabilité n'est pas la certitude, et le probable, pour les besoins de la recherche, doit être traité comme le faux. D'où la décision : <blockquote> « C'est pourquoi je pense que j'en userai plus prudemment, si, prenant un parti contraire, j'emploie tous mes soins à me tromper moi-même, feignant que toutes ces pensées sont fausses et imaginaires. » </blockquote> La solution est paradoxale : pour neutraliser la force des opinions probables, Descartes choisit de se tromper volontairement, en feignant que tout est faux. C'est le passage du doute simplement méthodique au doute hyperbolique assumé : il ne s'agit plus de suspendre le jugement, mais d'adopter activement la position contraire aux croyances naturelles. L'image de la balance éclaire ce choix : l'esprit penche du côté des préjugés ; pour rétablir l'équilibre, donc l'impartialité du jugement, il faut peser de l'autre côté. Le malin génie sera l'instrument de ce contrepoids. === L'invention d'une fiction === <blockquote> « Je supposerai donc qu'il y a, non point un vrai Dieu, qui est la souveraine source de vérité, mais un certain mauvais génie, non moins rusé et trompeur que puissant, qui a employé toute son industrie à me tromper. » </blockquote> Pour saisir pourquoi Descartes invente cette figure, il faut suivre les trois moments de son raisonnement. Le premier est l'opinion confuse, reçue pour ainsi dire par ouï-dire, d'un Dieu tout-puissant qui pourrait, s'il le voulait, me tromper sur tout, jusque dans les additions les plus simples. Le deuxième est une objection : un Dieu parfait ne saurait être trompeur, car tromper est une marque d'imperfection. Mais cette objection ne lève pas le doute, elle le déplace, car nous nous trompons en fait, et il faudrait encore expliquer comment un Dieu bon le permet. Le troisième moment résout cette tension : en imputant la tromperie non plus au vrai Dieu, mais à un esprit mauvais distinct de lui, Descartes maintient le doute à son intensité maximale sans rien attribuer d'indigne à la perfection divine. C'est l'office du malin génie (''genius malignus''). Sa portée est totale : le ciel, l'air, la terre, les couleurs, les figures, les sons, et jusqu'au corps propre, « point de mains, point d'yeux, point de chair », tout peut être illusion. Seule subsiste une croyance, fausse mais réelle : « croyant faussement avoir toutes ces choses ». Le chemin vers le ''cogito'' est préparé, sans être encore ouvert. Cette substitution a une raison de fond, que Gueroult a mise au jour. Le malin génie n'est pas une thèse sur l'existence d'un trompeur, mais une fiction destinée à maintenir le doute. Et s'il faut une fiction, c'est que l'hypothèse d'un Dieu trompeur n'est pas seulement choquante : bien comprise, elle est contradictoire. Le concept de toute-puissance exclut en effet la tromperie, car vouloir tromper relève de la faiblesse (''imbecillitas'') autant que de la malice, et le Souverain Être ne peut se porter vers le non-être qu'est la tromperie. Le malin génie échappe à cette contradiction parce qu'il n'est pas tout-puissant : il est « extrêmement puissant », mais le texte ajoute, à propos de sa malice, « si je l'ose dire » (''si fas est dicere''), comme pour avouer qu'on ne saurait joindre sans réserve la toute-puissance et la méchanceté<ref>Martial Gueroult, ''op. cit.'', t. I, p. 43-45, qui s'appuie notamment sur l'''Entretien avec Burman'' (AT V, p. 147 et 150-151) : « la toute-puissance et la méchanceté ne peuvent aller ensemble ». L'hypothèse du malin génie est, pour Gueroult, « le type des suppositions impossibles ou absurdes », rendue possible seulement parce que le vrai Dieu n'est encore que confusément connu.</ref>. La fiction n'est donc recevable que tant que la vraie nature de la toute-puissance divine demeure confusément connue ; une fois celle-ci clairement comprise, dans la Troisième Méditation, elle se dissipe d'elle-même. <blockquote> « [...] si, par ce moyen, il n'est pas en mon pouvoir de parvenir à la connaissance d'aucune vérité, à tout le moins il est en ma puissance de suspendre mon jugement. » </blockquote> Descartes affirme sa résolution avec fermeté. Même si aucune vérité ne peut être atteinte, la suspension du jugement reste possible, et c'est un gain : qui ne croit rien ne croit rien de faux. Le malin génie ne peut « rien imposer » à qui refuse tout assentiment. On voit ici le rôle de la volonté : le doute n'est pas un état subi, mais un acte par lequel l'esprit se met en garde contre les ruses du trompeur. === La difficulté de maintenir le doute === <blockquote> « Mais ce dessein est pénible et laborieux, et une certaine paresse m'entraîne insensiblement dans le train de ma vie ordinaire. » </blockquote> La méditation s'achève sur un aveu de difficulté. Tenir le doute est « pénible et laborieux », et une « paresse » naturelle ramène vers la vie ordinaire, où l'on ne doute de rien. Le doute hyperbolique exige un effort soutenu, une tension constante contre les pentes spontanées de l'esprit. <blockquote> « Et tout de même qu'un esclave qui jouissait dans le sommeil d'une liberté imaginaire [...] craint d'être réveillé, et conspire avec ces illusions agréables pour en être plus longuement abusé, ainsi je retombe insensiblement de moi-même dans mes anciennes opinions, et j'appréhende de me réveiller. » </blockquote> La comparaison finale est riche. L'esclave qui rêve de liberté ne veut pas se réveiller ; il préfère l'illusion agréable à la réalité pénible. Nous préférons de même nos croyances confortables à l'inconfort du doute. Mais l'image porte aussi une promesse : se réveiller, c'est découvrir sa condition réelle, premier pas vers une émancipation possible. La méditation se clôt pourtant sur une incertitude, Descartes craignant que l'effort de réflexion ne suffise pas à dissiper les « ténèbres » du doute. Cette fin ouverte appelle la suite : la Seconde Méditation apportera une première lumière. == VII. Conclusion == === Le bilan du doute === La Première Méditation a conduit un travail de démolition ordonnée. Toutes les sources de connaissance ont été éprouvées : les sens, par l'argument de leur faillibilité ; l'imagination, par l'argument du rêve ; et jusqu'à la confiance que nous accordons spontanément à nos opérations rationnelles, par l'hypothèse du Dieu trompeur et du malin génie. Il ne s'agit pas de détruire l'entendement, qui restera la faculté par laquelle Descartes reconstruira le savoir, mais de suspendre la créance que nous lui prêtons d'emblée, tant que sa fiabilité n'est pas garantie. Le doute a progressé par paliers, du plus superficiel au plus profond : faillibilité des sens, possibilité du rêve, puis possibilité qu'un être tout-puissant nous trompe sur tout, y compris les mathématiques. Chaque palier englobe et approfondit le précédent. Le doute cartésien se reconnaît à quelques traits qui le séparent du scepticisme antique : il est méthodique, instrument au service de la vérité et non fin en soi ; hyperbolique, puisqu'il traite le simplement douteux comme certainement faux ; provisoire, destiné à être surmonté ; volontaire, acte par lequel l'esprit résiste à ses propres inclinations. === Du doute au cogito === Le doute le plus poussé a isolé un élément qui lui résiste : l'acte même de douter. En supposant que je n'ai pas de corps, je suppose que je crois faussement en avoir un ; mais cette croyance, vraie ou fausse, existe. L'existence de la pensée est présupposée par le doute lui-même. La Seconde Méditation exploitera cette brèche. Un point mérite ici d'être précisé, car il prête souvent à confusion. La formule « je pense, donc je suis » (''cogito, ergo sum'') ne figure pas dans les ''Méditations'' de 1641. Sa version française, « je pense donc je suis », appartient au ''Discours de la méthode'' de 1637 ; sa version latine apparaît dans les ''Principes de la philosophie'' de 1644<ref>''Historical Dictionary of Descartes and Cartesian Philosophy'', art. « Cogito ergo sum », p. 80-81 ; ''Principia'', I, art. 7 et 10.</ref>. Dans la Seconde Méditation, l'énoncé est différent et plus précis : <blockquote> « [...] il faut enfin conclure, et tenir pour constant que cette proposition : Je suis, j'existe, est nécessairement vraie, toutes les fois que je la prononce, ou que je la conçois en mon esprit. » (AT VII, 25) </blockquote> La formulation méditative (''ego sum, ego existo'') ajoute deux précisions à l'adage familier : c'est la vérité d'une ''conception'' qui est en jeu, et cette vérité ne vaut qu'''au moment'' où je la conçois ou la prononce<ref>Gary Hatfield, ''Descartes and the Meditations'', p. 101-102 ; ''Historical Dictionary'', art. cité, p. 80-81.</ref>. Cette restriction temporelle n'est pas un détail. On reprochera en effet à Descartes un cercle : il se sert de la clarté de ses perceptions pour prouver Dieu, puis de Dieu pour garantir la clarté de ses perceptions. La précision sur l'instant offre une issue : une évidence saisie ici et maintenant s'impose d'elle-même, sans garantie extérieure ; c'est seulement pour se fier à un raisonnement passé, dont on ne retient que le souvenir, que la véracité divine devient nécessaire. On notera enfin une subtilité dans la manière dont le ''cogito'' surgit. Il n'apparaît pas comme une thèse que Descartes avancerait de son propre chef, mais comme une vérité que le sceptique lui-même ne peut éviter : en doutant, il pense ; en pensant, il existe ; et il se contredit s'il prétend douter de tout<ref>Charles Larmore, « Descartes and Skepticism », p. 24-25.</ref>. La proposition que nul ne peut refuser devient alors une vérité que chacun reconnaît pour son compte. === Héritage === L'influence de la Première Méditation sur la philosophie moderne a été considérable. On lui rattache souvent l'essor d'une « philosophie du sujet » et la primauté de l'épistémologie sur la métaphysique. La formule est commode, mais elle demande de la mesure. Le geste cartésien ne surgit pas de rien : il prolonge l'examen de soi augustinien, les débats de la scolastique tardive, le scepticisme renaissant de Montaigne et de Charron, et la tradition des exercices spirituels. Plutôt que d'inaugurer seul un commencement absolu, Descartes ressaisit et réoriente un héritage. Ce qui lui revient en propre, c'est d'avoir fait de l'examen méthodique des fondements le passage obligé de toute connaissance, et d'avoir donné à la certitude du sujet une fonction qu'elle n'avait pas eue jusque-là. Les arguments du doute ont été repris et discutés par les philosophes ultérieurs. L'argument du rêve est devenu un lieu classique de l'épistémologie. L'hypothèse du malin génie a connu des reformulations contemporaines, du « cerveau dans une cuve » aux fictions de la simulation. La question que pose Descartes, celle de savoir comment distinguer l'illusion de la réalité, garde toute son actualité. == Notes et références == {{Références|colonnes=2}} [[Catégorie:Méditations métaphysiques]] [[Catégorie:René Descartes]] [[Catégorie:Commentaire philosophique]] 8zqjz052fqzacbhcx1w7khdweqm2mtk Photographie/Fabricants/Nikon 0 6160 768053 760964 2026-06-18T16:09:48Z Alexis Jazz 81580 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Rear lens of the Nikon KeyMission 360 by D Ramey Logan.jpg]] → [[File:Rear lens of the Nikon KeyMission 360 by Don Ramey Logan.jpg]] [[c:COM:FR|rename criterion 2]] 768053 wikitext text/x-wiki {{Ph s Fabricants}} [[File:Nikon Museum20151104c.jpg|thumb|500px|le Musée Nikon]] == Appareils pour la photographie argentique == {{T|[[/Appareils argentiques Nikon|Voir les appareils Nikon pour la photographie argentique]]}} == Appareils numériques non reflex == === année 1997 === <gallery> IMG.svg|[[/Nikon Coolpix 300|Nikon Coolpix 300]] {{50}} (3&nbsp;janvier 1997) Nikon Coolpix 100.jpg|[[/Nikon Coolpix 100|Nikon Coolpix 100]] {{50}} (20&nbsp;janvier 1997) </gallery> === année 1998 === <gallery> Nikon Coolpix 600.jpg|[[/Nikon Coolpix 600|Nikon Coolpix 600]] (16&nbsp;mars 1998) {{75}} Nikon Coolpix 900 CP+ 2011.jpg|[[/Nikon Coolpix 900|Nikon Coolpix 900]] (16&nbsp;mars 1998) {{75}} IMG.svg|[[/Nikon Coolpix 900S|Nikon Coolpix 900S]] (26&nbsp;octobre 1998) {{50}} </gallery> === année 1999 === <gallery> DSCN1606-coolpix-950.jpg|[[/Nikon Coolpix 950/]] {{75}} (15&nbsp;février 1999) Nikon-coolpix-700.jpg|[[/Nikon Coolpix 700/]] {{100}} (15&nbsp;février 1999) Coolpix-800 et WC-E24 etTC-E2.jpg|[[/Nikon Coolpix 800/]] (27&nbsp;septembre&nbsp;1999) Nikon Coolpix 800 (4519837731).jpg </gallery> === année 2000 === <gallery> Nikon Coolpix 990.jpg|[[/Nikon Coolpix 990/]] (27&nbsp;janvier&nbsp;2000) Nikon COOLPIX990 + FC-E8 (19604763468).jpg|[[/Nikon Coolpix 990/]] Nikon Coolpix 800 (4519837731).jpg|[[/Nikon Coolpix 800/]] (28&nbsp;août&nbsp;2000) </gallery> === année 2001 === <gallery> Nikon Coolpix 775 - 1.JPG|[[/Nikon Coolpix 775/]] (25&nbsp;avril&nbsp;2001) Nikon Coolpix 775.JPG Nikon Coolpix 775 arrière.JPG Nikon COOLPIX 995.jpg|[[/Nikon Coolpix 995/]] (25&nbsp;avril&nbsp;2001) Nikon Coolpix 995.jpg Nikon Coolpix 995 with lenscap off.jpg IMG.svg|[[/Nikon Coolpix 885/]] (23&nbsp;août&nbsp;2001) Nikon E5000.jpg|[[/Nikon Coolpix 5000/]] (18&nbsp;septembre&nbsp;2001) </gallery> === année 2002 === <gallery> Nikon Coolpix 2500.jpg|[[/Nikon Coolpix 2500|Nikon Coolpix 2500]] (21&nbsp;février&nbsp;2002) NikonE5700.jpg|[[/Nikon Coolpix 5700|Nikon Coolpix 5700]] (29&nbsp;mai&nbsp;2002) {{25}} IMG.svg|[[/Nikon Coolpix 2000|Nikon Coolpix 2000]] (29&nbsp;mai&nbsp;2002) Nikon COOLPIX 4500.jpg|[[/Nikon Coolpix 4500|Nikon Coolpix 4500]] (29&nbsp;mai&nbsp;2002) IMG.svg|[[/Nikon Coolpix 4300|Nikon Coolpix 4300]] (29&nbsp;août&nbsp;2002) IMG.svg|[[/Nikon Coolpix 3500|Nikon Coolpix 3500]] (19&nbsp;septembre&nbsp;2002) </gallery> === année 2003 === <gallery> Nikon-coolpix-sq-02.jpg|[[/Nikon Coolpix SQ|Nikon Coolpix SQ]] (18&nbsp;février&nbsp;2003) Assembled compact camera.jpg|[[/Nikon Coolpix 3100|Nikon Coolpix 3100]] (18&nbsp;février&nbsp;2003) Disassembled compact camera.jpg Nikon Coolpix 2100,1.jpg|[[/Nikon Coolpix 2100|Nikon Coolpix 2100]] (18&nbsp;février&nbsp;2003) Nikon Coolpix 2100,2.jpg Nikon Coolpix 2100,3.jpg IMG.svg|[[/Nikon Coolpix 5400|Nikon Coolpix 5400]] (28&nbsp;mai&nbsp;2003) Nikon-Coolpix-37 029.JPG|[[/Nikon Coolpix 3700|Nikon Coolpix 3700]] {{25}} (28&nbsp;octobre&nbsp;2003) </gallery> === année 2004 === <gallery> Nikon CoolPix 3200.jpg|[[/Nikon Coolpix 3200|Nikon Coolpix 3200]] (8&nbsp;janvier&nbsp;2004) Nikon Coolpix 2200 - 1.JPG|[[/Nikon Coolpix 2200|Nikon Coolpix 2200]] (8&nbsp;janvier&nbsp;2004) Nikon Coolpix 2200.JPG Nikon Coolpix 2200 arrière.JPG Nikon Coolpix 8700 2371px.jpg|[[/Nikon Coolpix 8700|Nikon Coolpix 8700]] (28&nbsp;janvier&nbsp;2004) {{50}} Nikon Coolpix 5200 - 1.JPG|[[/Nikon Coolpix 5200|Nikon Coolpix 5200]] (12&nbsp;février&nbsp;2004) Nikon Coolpix 5200.JPG Nikon Coolpix 5200 arrière.JPG Nikon Coolpix 4200.jpg|[[/Nikon Coolpix 4200|Nikon Coolpix 4200]] (12&nbsp;février&nbsp;2004) Nikon 4100.jpg|[[/Nikon Coolpix 4100|Nikon Coolpix 4100]] (28&nbsp;mai&nbsp;2004) IMG.svg|[[/Nikon Coolpix 4800|Nikon Coolpix 4800]] (16&nbsp;septembre&nbsp;2004) Coolpix 8400.jpg|[[/Nikon Coolpix 8400|Nikon Coolpix 8400]] (16&nbsp;septembre&nbsp;2004) Nikon E8400.jpg Coolpix 8400 front.jpg Coolpix 8400 back.jpg Nikon COOLPIX 8800r.jpg|[[/Nikon Coolpix 8800|Nikon Coolpix 8800]] (16&nbsp;septembre&nbsp;2004) </gallery> === année 2005 === <gallery> IMG.svg|[[/Nikon Coolpix 5900|Nikon Coolpix 5900]] (16&nbsp;février&nbsp;2005) Nikon Coolpix 7900.jpg|[[/Nikon Coolpix 7900|Nikon Coolpix 7900]] (16&nbsp;février&nbsp;2005) NikonE4600.JPG|[[/Nikon Coolpix 4600|Nikon Coolpix 4600]] (16&nbsp;février&nbsp;2005) E4600.jpg IMG.svg|[[/Nikon Coolpix 5600|Nikon Coolpix 5600]] (16&nbsp;février&nbsp;2005) Nikon Coolpix 7600.jpg|[[/Nikon Coolpix 7600|Nikon Coolpix 7600]] (16&nbsp;février&nbsp;2005) Nikon Coolpix S1 Black.jpg|[[/Nikon Coolpix S1|Nikon Coolpix S1]] (16&nbsp;mars&nbsp;2005) Digitalkamer Coolpix S2.JPG|[[/Nikon Coolpix S2|Nikon Coolpix S2]] (1er&nbsp;septembre&nbsp;2005) IMG.svg|[[/Nikon Coolpix S3|Nikon Coolpix S3]] (1er&nbsp;septembre&nbsp;2005) IMG.svg|[[/Nikon Coolpix L1|Nikon Coolpix L1]] (1er&nbsp;septembre&nbsp;2005) Nikon Coolpix S4.jpg|[[/Nikon Coolpix S4|Nikon Coolpix S4]] (1er&nbsp;septembre&nbsp;2005) Nikon-Coolpix-p1-p1030347.jpg|[[/Nikon Coolpix P1|Nikon Coolpix P1]] (1er&nbsp;septembre&nbsp;2005) Nikon_Coolpix_P1_CP%2B_2011.jpg|Nikon Coolpix P1 IMG.svg|[[/Nikon Coolpix P2|Nikon Coolpix P2]] (1er&nbsp;septembre&nbsp;2005) </gallery> === année 2006 === <gallery> IMG.svg|[[/Nikon Coolpix S5|Nikon Coolpix S5]] (21&nbsp;février&nbsp;2006) IMG.svg|[[/Nikon Coolpix S6|Nikon Coolpix S6]] {{50}} (21&nbsp;février&nbsp;2006) Nikon Coolpix P4 - 1.JPG|[[/Nikon Coolpix P4|Nikon Coolpix P4]] {{50}} (21&nbsp;février&nbsp;2006) Nikon Coolpix L2 front.JPG|[[/Nikon Coolpix L2|Nikon Coolpix L2]] {{50}} (21&nbsp;février&nbsp;2006) IMG.svg|[[/Nikon Coolpix L3|Nikon Coolpix L3]] (21&nbsp;février&nbsp;2006) IMG.svg|[[/Nikon Coolpix L4|Nikon Coolpix L4]] {{50}} (21&nbsp;février&nbsp;2006) IMG.svg|[[/Nikon Coolpix P3|Nikon Coolpix P3]] {{50}} (21&nbsp;février&nbsp;2006) IMG.svg|[[/Nikon Coolpix L5|Nikon Coolpix L5]] (24&nbsp;août&nbsp;2006) Nikon Coolpix L6.JPG|[[/Nikon Coolpix L6|Nikon Coolpix L6]] {{25}} (24&nbsp;août&nbsp;2006) IMG.svg|[[/Nikon Coolpix S7c|Nikon Coolpix S7c]] {{75}} (24&nbsp;août&nbsp;2006) IMG.svg|[[/Nikon Coolpix S9|Nikon Coolpix S9]] (24&nbsp;août&nbsp;2006) IMG.svg|[[/Nikon Coolpix S10|Nikon Coolpix S10]] {{25}} (24&nbsp;août&nbsp;2006) </gallery> === année 2007 === <gallery> Nikon Coolpix-L12.jpg|[[/Nikon Coolpix L12|Nikon Coolpix L12]] (20&nbsp;février&nbsp;2007) Nikon Coolpix L12 (front).jpg Nikon Coolpix L12 (rear).jpg Nikon Coolpix L12 (top).jpg Nikon Coolpix L12 (right).jpg Nikon Coolpix L12 (left).jpg IMG.svg|[[/Nikon Coolpix S50|Nikon Coolpix S50]] (20&nbsp;février&nbsp;2007) IMG.svg|[[/Nikon Coolpix S50c|Nikon Coolpix S50c]] (20&nbsp;février&nbsp;2007) IMG.svg|[[/Nikon Coolpix S200|Nikon Coolpix S200]] (20&nbsp;février&nbsp;2007) {{50}} IMG.svg|[[/Nikon Coolpix S500|Nikon Coolpix S500]] (20&nbsp;février&nbsp;2007) {{50}} Nikon coolpix-P5000 IMG 0202.JPG|[[/Nikon Coolpix P5000|Nikon Coolpix P5000]] (20&nbsp;février&nbsp;2007) {{100}} Càmera Nikon Coolpix L10 (2405574011).jpg|[[/Nikon Coolpix L10|Nikon Coolpix L10]] (20&nbsp;février&nbsp;2007) {{75}} NikonCoolpixL11a.jpg|[[/Nikon Coolpix L11|Nikon Coolpix L11]] (20&nbsp;février&nbsp;2007) {{100}} IMG.svg|[[/Nikon Coolpix L15|Nikon Coolpix L15]] (30&nbsp;août&nbsp;2007) {{75}} Nikon Coolpix L14.jpg|[[/Nikon Coolpix L14|Nikon Coolpix L14]] (30&nbsp;août&nbsp;2007) {{75}} Nikon Coolpix P50 (4876695009) (2).jpg|[[/Nikon Coolpix P50|Nikon Coolpix P50]] (30&nbsp;août&nbsp;2007) {{100}} Nikon Coolpix P5100 01.JPG|[[/Nikon Coolpix P5100|Nikon Coolpix P5100]] (30&nbsp;août&nbsp;2007) {{75}} Nikon Coolpix S51.jpg|[[/Nikon Coolpix S51|Nikon Coolpix S51]] (30&nbsp;août&nbsp;2007) {{100}} IMG.svg|[[/Nikon Coolpix S51c|Nikon Coolpix S51c]] 30&nbsp;août&nbsp;2007) {{75}} IMG.svg|[[/Nikon Coolpix S510|Nikon Coolpix S510]] (30&nbsp;août&nbsp;2007) {{75}} IMG.svg|[[/Nikon Coolpix S700|Nikon Coolpix S700]] (30&nbsp;août&nbsp;2007) {{00}} </gallery> === année 2008 === <gallery> IMG.svg|[[/Nikon Coolpix P60|Nikon Coolpix P60]] (29&nbsp;janvier&nbsp;2008) NikonS520Front.JPG|[[/Nikon Coolpix S520|Nikon Coolpix S520]] (29&nbsp;janvier&nbsp;2008) NikonS520On.JPG NikonS520Base.JPG NikonS520Back.JPG Nikon COOLPIX L16.jpg|[[/Nikon Coolpix L16|Nikon Coolpix L16]] (29&nbsp;janvier&nbsp;2008) Nikon COOLPIX L16b.jpg Nikon COOLPIX L16c.JPG Nikon Coolpix L18.JPG|[[/Nikon Coolpix L18|Nikon Coolpix L18]] (29&nbsp;janvier&nbsp;2008) IMG.svg|[[/Nikon Coolpix S210|Nikon Coolpix S210]] (29&nbsp;janvier&nbsp;2008) IMG.svg|[[/Nikon Coolpix S550|Nikon Coolpix S550]] (29&nbsp;janvier&nbsp;2008) {{75}} IMG.svg|[[/Nikon Coolpix S600|Nikon Coolpix S600]] (29&nbsp;janvier&nbsp;2008) {{75}} NikonCoolpixP80-1.jpg|[[/Nikon Coolpix P80|Nikon Coolpix P80]] (10&nbsp;avril&nbsp;2008) {{75}} IMG.svg|[[/Nikon Coolpix S52|Nikon Coolpix S52]] (10&nbsp;avril&nbsp;2008) {{75}} IMG.svg|[[/Nikon Coolpix S52c|Nikon Coolpix S52c]] (10&nbsp;avril&nbsp;2008) {{75}} Nikon Coolpix P6000 CP+ 2011.jpg|[[/Nikon Coolpix P6000|Nikon Coolpix P6000]] (7&nbsp;août&nbsp;2008) {{25}} IMG.svg|[[/Nikon Coolpix S60|Nikon Coolpix S60]] (7&nbsp;août&nbsp;2008) (2008) IMG.svg|[[/Nikon Coolpix S560|Nikon Coolpix S560]] (7&nbsp;août&nbsp;2008) (2008) IMG.svg|[[/Nikon Coolpix S610|Nikon Coolpix S610]] (7&nbsp;août&nbsp;2008) (2008) IMG.svg|[[/Nikon Coolpix S610c|Nikon Coolpix S610c]] (7&nbsp;août&nbsp;2008) (2008) IMG.svg|[[/Nikon Coolpix S710|Nikon Coolpix S710]] (7&nbsp;août&nbsp;2008) (2008) </gallery> === année 2009 === <gallery> IMG.svg|[[/Nikon Coolpix L19|Nikon Coolpix L19]] (3&nbsp;février&nbsp;2009) IMG.svg|[[/Nikon Coolpix L20|Nikon Coolpix L20]] (3&nbsp;février&nbsp;2009) IMG.svg|[[/Nikon Coolpix S620|Nikon Coolpix S620]] (3&nbsp;février&nbsp;2009) IMG.svg|[[/Nikon Coolpix S220|Nikon Coolpix S220]] (3&nbsp;février&nbsp;2009) Nikon Coolpix L100.JPG|[[/Nikon Coolpix L100|Nikon Coolpix L100]] (3&nbsp;février&nbsp;2009) IMG.svg|[[/Nikon Coolpix S230|Nikon Coolpix S230]] (3&nbsp;février&nbsp;2009) Nikon Coolpix P90.jpg|[[/Nikon Coolpix P90|Nikon Coolpix P90]] (3&nbsp;février&nbsp;2009) IMG.svg|[[/Nikon Coolpix S630|Nikon Coolpix S630]] (3&nbsp;février&nbsp;2009) Tollbodbryggen OB.F03198.jpg|[[/Nikon Coolpix S570|Nikon Coolpix S570]] (4&nbsp;août&nbsp;2009) IMG.svg|[[/Nikon Coolpix S70|Nikon Coolpix S70]] (4&nbsp;août&nbsp;2009) Nikon Coolpix s1000pj.jpg|[[/Nikon Coolpix S1000pj|Nikon Coolpix S1000pj]] (4&nbsp;août&nbsp;2009) {{100}} IMG.svg|[[/Nikon Coolpix S640|Nikon Coolpix S640]] (4&nbsp;août&nbsp;2009) </gallery> === année 2010 === <gallery> IMG.svg|[[/Nikon Coolpix L21|Nikon Coolpix L21]] (3&nbsp;février&nbsp;2010) IMG.svg|[[/Nikon Coolpix L22|Nikon Coolpix L22]] (3&nbsp;février&nbsp;2010) {{75}} IMG.svg|[[/Nikon Coolpix L110|Nikon Coolpix L110]] (3&nbsp;février&nbsp;2010) {{75}} Nikon Coolpix P100.jpg|[[/Nikon Coolpix P100|Nikon Coolpix P100]] (3&nbsp;février&nbsp;2010) Nikon Coolpix S3000.jpg|[[/Nikon Coolpix S3000|Nikon Coolpix S3000]] (3&nbsp;février&nbsp;2010) {{100}} IMG.svg|[[/Nikon Coolpix S4000|Nikon Coolpix S4000]] (3&nbsp;février&nbsp;2010) {{75}} IMG.svg|[[/Nikon Coolpix S6000|Nikon Coolpix S6000]] (3&nbsp;février&nbsp;2010) {{75}} Nikon Coolpix S8000.JPG|[[/Nikon Coolpix S8000|Nikon Coolpix S8000]] (3&nbsp;février&nbsp;2010) IMG.svg|[[/Nikon Coolpix S1100pj|Nikon Coolpix S1100pj]] (17&nbsp;août&nbsp;2010) Nikon P7000.jpg|[[/Nikon Coolpix P7000|Nikon Coolpix P7000]] (8&nbsp;septembre&nbsp;2010) {{100}} IMG.svg|[[/Nikon Coolpix S80|Nikon Coolpix S80]] (8&nbsp;septembre&nbsp;2010) {{75}} </gallery> === année 2011 === <gallery> 2013-05-03 12-49-03-p7100-off.jpg|[[/Nikon Coolpix P7100|Nikon Coolpix P7100]] (24&nbsp;août&nbsp;2011) {{100}} Nikon Coolpix P500s5s.jpg|[[/Nikon Coolpix P500|Nikon Coolpix P500]] (9&nbsp;février&nbsp;2011) {{75}} IMG.svg|[[/Nikon Coolpix L24|Nikon Coolpix L24]] (9&nbsp;février&nbsp;2011) {{75}} IMG.svg|[[/Nikon Coolpix S3100|Nikon Coolpix S3100]] (9&nbsp;février&nbsp;2011) </gallery> === année 2012 === <gallery> Unterwassergehaeuse-Test-RalfR-N3S 7810-3.jpg|[[/Nikon Coolpix S9300|Nikon Coolpix S9300]] (1er&nbsp;février&nbsp;2012) {{100}} Nikon Coolpix P310.jpg|[[/Nikon Coolpix P310|Nikon Coolpix P310]] (1er&nbsp;février&nbsp;2012) {{100}} </gallery> === année 2013 === <gallery> </gallery> === année 2014 === <gallery> IMG.svg|[[/Nikon Coolpix P340|Nikon Coolpix P340]] (7&nbsp;février&nbsp;2014) {{75}} </gallery> === année 2015 === <gallery> IMG.svg|[[/Nikon Coolpix P900|Nikon Coolpix P900]] (2&nbsp;mars&nbsp;2015) {{75}} IMG.svg|[[/Nikon 1 J5|Nikon 1 J5]] (2&nbsp;avril&nbsp;2015) {{75}} </gallery> '''à classer''' <gallery> Nikon 1 S1.jpg|Nikon 1 S1 Nikon COOLPIX L840 01.jpg|Nikon COOLPIX L840 Nikon L840 (17624042426).jpg Nikon Coolpix L810 - optimized darker.jpg|Nikon Coolpix L810 Nikon Coolpix L810.jpg Nikon One Touch 100 (13624916645).jpg|Nikon One Touch 100 Nikon One Touch 100 (13624944105).jpg Nikon One Touch 100 (13625287914).jpg Nikon One Touch 100 (13625314784).jpg Nikon DL18-50 front-left 2016 China P&E.jpg|Nikon DL18-50 Nikon DL24-500 front-left 2016 China P&E.jpg|Nikon DL24-500 Nikon DL24-85 front-right 2016 China P&E.jpg|Nikon DL24-85 Nikon KeyMission 170.jpg|Nikon KeyMission 170 Nikon KeyMission 360 front-left 2016 China P&E.jpg|Nikon KeyMission 360 Nikon KeyMission 360.JPG Nikon B700 front-left 2016 China P&E.jpg|Nikon B700 Nikon-Coolpix P610-A.jpg|Nikon Coolpix P610 Nikon-Coolpix P610-B.jpg Nikon-Coolpix P610-C.jpg Nikon Coolpix P610 - 01.jpg Nikon Coolpix P610 - 02.jpg Nikon Coolpix P610 - 03.jpg Nikon Coolpix P610 - 04.jpg Camera Nikon P610.jpg Nikon 1 S2.jpg|Nikon 1 S2 Nikon Coolpix S8200 wit, -16 september 2013 a.jpg|Nikon Coolpix S8200 01091jfNikon Coolpix S8200 -21 October 2016fvf 16.jpg 01091jfNikon Coolpix S8200 -21 October 2016fvf 15.jpg 01091jfNikon Coolpix S8200 -21 October 2016fvf 14.jpg 01091jfNikon Coolpix S8200 -21 October 2016fvf 13.jpg 01091jfNikon Coolpix S8200 -21 October 2016fvf 12.jpg 01091jfNikon Coolpix S8200 -21 October 2016fvf 10.jpg 01091jfNikon Coolpix S8200 -21 October 2016fvf 11.jpg 01091jfNikon Coolpix S8200 -21 October 2016fvf 09.jpg 01091jfNikon Coolpix S8200 -21 October 2016fvf 08.jpg 01091jfNikon Coolpix S8200 -21 October 2016fvf 07.jpg 01091jfNikon Coolpix S8200 -21 October 2016fvf 06.jpg 01091jfNikon Coolpix S8200 -21 October 2016fvf 04.jpg 01091jfNikon Coolpix S8200 -21 October 2016fvf 05.jpg 01091jfNikon Coolpix S8200 -21 October 2016fvf 02.jpg 01091jfNikon Coolpix S8200 -21 October 2016fvf 03.jpg 01091jfNikon Coolpix S8200 -21 October 2016fvf 01.jpg Nikon Coolpix S9700 Front 01.JPG|Nikon Coolpix S9700 Nikon Coolpix P510 (13).JPG|Nikon Coolpix P510 Nikon Coolpix P510 (12).JPG Nikon Coolpix P510 (11).JPG Nikon Coolpix P510 (10).JPG Nikon Coolpix P510 (9).JPG Nikon Coolpix P510 (8).JPG Nikon Coolpix P510 (7).JPG Nikon Coolpix P510 (6).JPG Nikon Coolpix P510 (5).JPG Nikon Coolpix P510 (4).JPG Nikon Coolpix P510 (3).JPG Nikon Coolpix P510 (2).JPG Nikon Coolpix P510 (1).JPG Nikon CoolPix P510.jpg 14-08-01-kameravergleich-4.jpg Nikon Coolpix A Front View 20140728.jpg|Nikon Coolpix A Nikon Coolpix A Rear View 20140728.jpg Nikon Coolpix L310.JPG|Nikon Coolpix L310 Nikon COOLPIX P7700 front.JPG|Nikon Coolpix P7700 Nikon COOLPIX P7700 back.JPG Nikon 1 J1 in Milan, Italy 20111106.jpg|Nikon 1 J1 Nikon 1 J1 black 01 cropped.jpg|Nikon 1 J1 Nikon 1 J1 black 02.jpg|Nikon 1 J1 Nikon J1 image, 10-30mm lens.jpg|Nikon 1 J1 Nikon J1 5.jpg IMG.svg|Nikon 1 J2 Nikon Coolpix AW100 Frontansicht 01 11.jpg|[[/Nikon Coolpix AW100|Nikon Coolpix AW100]] NikonCoolpixE3700front.JPG|E3700 IMG.svg|S2500 IMG.svg|S2500 IMG.svg|S6100 Nikon Coolpix L120s5s.jpg|L120 Nikon 1 V1 and J1.jpg|Nikon 1 V1 et 1 J1 Nikon 1 V1 with 10-30 and 30-110mm.jpg|Nikon 1 V1 Nikon 1 V1 with 10-30mm.jpg|Nikon 1 V1 Nikon 1 V1 + Fisheye FC-E9 01.jpg|Nikon 1 V1 + Fisheye FC-E9 Nikon 1 V1 + Fisheye FC-E9 02.jpg|Nikon 1 V1 + Fisheye FC-E9 Nikon 1 V1 with lenses and flash.jpg Nikon 1 V1.jpg Nikon 1 V1 + Fisheye FC-E9 (4).jpg Nikon 1 V1 + Fisheye FC-E9 (3).jpg Nikon 1 V1 + Fisheye FC-E9 (2).jpg Nikon 1 V1 + Fisheye FC-E9.jpg Nikon V1 (21471809285).jpg Nikon1 V2 V1 (2).jpg Nikon1 V1 V2.jpg Nikon1 V2 V1.jpg Nikon1 V2.jpg|Nikon 1 v2 Nikon1 V2 (2).jpg Nikon 1 V2 + 1 NIKKOR VR 10-30mm f-3.5-5.6 PD-ZOOM (18576507853).jpg </gallery> == Appareils reflex numériques == <gallery> Nikon QV1000C front-right 2015 Nikon Museum.jpg|Nikon QV1000C premier appareil entièrement électronique commercialisé par Nikon, il enregistrait des images NB sur disquette ; réservé à la presse (1988) Nikon QV1000C front-left 2015 Nikon Museum.jpg </gallery> === année 1994 === <gallery> Nikon E2 front-right 2015 Nikon Museum.jpg|[[/Nikon E2/]] (1994) </gallery> === année 1995 === <gallery> Nikon E2S front-right 2015 Nikon Museum.jpg|[[/Nikon E2S/]] (1995) </gallery> === année 1996 === <gallery> Nikon E2N CP+ 2011.jpg|[[/Nikon E2N|Nikon E2N]] (1996) </gallery> === année 1997 === <gallery> IMG.svg|[[/Nikon E2NS|Nikon E2NS]] (1997) IMG.svg|[[/Nikon E2S|Nikon E2S]] (1997) </gallery> === année 1998 === <gallery> Nikon E3 front-right 2015 Nikon Museum.jpg|[[/Nikon E3/]] (1998) Nikon E3 front-left 2015 Nikon Museum.jpg Nikon E3s IMG 2466.jpg|[[/Nikon E3S/]] (1998) Nikon E3s IMG 2465.jpg|E3s Nikon E3s IMG 2464.jpg|E3s Nikon E3s IMG 2463.jpg|E3s Nikon E3s IMG 2462.jpg|E3s Nikon E3s IMG 2461.jpg|E3s Nikon E3s IMG 2460.jpg|E3s Nikon E3s IMG 2459.jpg|E3s Nikon-E3s.jpg|E3s Nikon E3S front-left 2015 Nikon Museum.jpg </gallery> === année 1999 === <gallery> Nikon D1 8373.jpg|[[/Nikon D1|Nikon D1]] {{50}} (15&nbsp;juin&nbsp;1999) </gallery> === année 2001 === <gallery> IMG.svg|[[/Nikon D1H|Nikon DIH]] (5&nbsp;février&nbsp;2001) Nikon D1x 3656.jpg|[[/Nikon D1X|Nikon D1X]] (5&nbsp;février&nbsp;2001) </gallery> === année 2002 === <gallery> B. Nikon !! 2016 Nikon Museum.jpg|Nikon B (2002) Nikon D100 f2329032 (filtered retouched).jpg|[[/Nikon D100/]] (21&nbsp;février&nbsp;2002) Nikon D100 f2329032.jpg D100 front.jpg Nikon D100 f2311080.jpg Nikon D100 f2302056.jpg Nikon D100 04FP.jpg Nikon D100 03FP.jpg Nikon D100 01FP.jpg </gallery> === année 2003 === <gallery> Nikon D2H Front quarter.jpg|[[/Nikon D2H|Nikon D2H]] (29&nbsp;juillet&nbsp;2003) Nikon D2H img 1319.jpg Nikon D2H Rear quarter.jpg Beaten Nikon D2H.jpg </gallery> === année 2004 === <gallery> Nikond70front.jpg|[[/Nikon D70|Nikon D70]] {{25}} (28&nbsp;janvier&nbsp;2004) Nikon D2x 0601.jpg|[[/Nikon D2X|Nikon D2X]] (16&nbsp;septembre&nbsp;2004) Nikon D2x.jpg|Nikon D2X Nikon D2X 4001133484.jpg </gallery> === année 2005 === <gallery> IMG.svg|[[/Nikon D2Hs|Nikon D2Hs]] (16&nbsp;février&nbsp;2005) {{75}} Nikon D50 front.jpg|[[/Nikon D50|Nikon D50]] (20&nbsp;avril&nbsp;2005) {{75}} Nikon D70s with 24-120mm lens - 8199.jpg|[[/Nikon D70s|Nikon D70s]] (20&nbsp;avril&nbsp;2005) {{25}} Nikon-D200-IMG 0240.JPG|[[/Nikon D200|Nikon D200]] (1er&nbsp;octobre&nbsp;2005) {{100}} </gallery> === année 2006 === <gallery> IMG.svg|[[/Nikon D2Xs|Nikon D2Xs]] {{00}} (1&nbsp;juin&nbsp;2006) Nikon D80 Nikkor 50mm F1.4.jpg|[[/Nikon D80|Nikon D80]] {{75}} (9&nbsp;août&nbsp;2006) D40 jm3 rotate.jpg|[[/Nikon D40|Nikon D40]] {{75}} (16&nbsp;novembre&nbsp;2006) </gallery> === année 2007 === <gallery> Nikon D40x.jpg|[[/Nikon D40X|Nikon D40X]] (6&nbsp;mars&nbsp;2007) {{100}} Nikon D3 img 1246.jpg|[[/Nikon D3|Nikon D3]] {{75}} (23&nbsp;août&nbsp;2007) Nikon D300.jpg|[[/Nikon D300|Nikon D300]] {{75}} (23&nbsp;août&nbsp;2007) </gallery> === année 2008 === <gallery> Nikon D60 flash.JPG|[[/Nikon D60/]] (29&nbsp;janvier&nbsp;2008) {{75}} My Nikon - D90 (13536773553).jpg|[[/Nikon D90/]] (27&nbsp;août&nbsp;2008) {{75}} Nikon D700 img 1745.jpg|[[/Nikon D700/]] {{25}} IMG.svg|[[/Nikon D3X/]] (1&nbsp;décembre&nbsp;2008) {{50}} </gallery> === année 2009 === <gallery> Nikon D5000 - AF-S DX VR Zoom-NIKKOR 18-200 mm 1-3,5-5,6G IF-ED.JPG|[[/Nikon D5000|Nikon D5000]] (14&nbsp;avril&nbsp;2009) {{100}} Nikon D3000 DSLR by Davit Sharyan (adjusted).jpg|[[/Nikon D3000|Nikon D3000]] (30 juillet 2009) {{100}} </gallery> === année 2010 === <gallery> Nikon D3100.jpg|[[/Nikon D3100|Nikon D3100]] (19&nbsp;août&nbsp;2010) {{75}} Nikon D7000 (4992738793).jpg|[[/Nikon D7000|Nikon D7000]] (15 septembre 2010) {{100}} </gallery> === année 2011 === <gallery> Nikon D5100 18-55mm front.jpg|[[/Nikon D5100|Nikon D5100]] (5 avril 2011) {{100}} </gallery> === année 2012 === <gallery> </gallery> === année 2013 === <gallery> Nikon Df golden 01.jpg|[[/Nikon Df|Nikon Df]] (novembre 2013) </gallery> === année 2014 === <gallery> </gallery> === année 2015 === <gallery> Nikon D7200 01-2016 img4 with Nikon 18-105.jpg|[[/Nikon D7200/]] (2&nbsp;mars&nbsp;2015) {{75}} </gallery> '''à classer''' <gallery> Nikon D3400 1 2017-03-10.jpg|Nikon D3400 Nikon D5600 1 2017-03-10.jpg|Nikon D5600 Nikon D5600 1 2017-03-13.jpg Nikon 1 V2 + Nikon Df-1.jpg|Nikon Df Nikon D5500 - 18-55mm - Front 2.jpg|D5500 Nikon D5500 - 18-55mm - Bottom.jpg Nikon D5500 - 18-55mm - Back.jpg 2017 Nikon D5500.jpg Nikon D5500 red 01.JPG Nikon D5500 with Aokatec AK-N7000 - Customized socket cover - 01.jpg Nikon D5500 with Aokatec AK-N7000 - Customized socket cover - 02.jpg Nikon D5500 with Aokatec AK-N7000 - 01.jpg Nikon D5500 with Aokatec AK-N7000 - 02.jpg Nikon D5500 with Aokatec AK-N7000 - 03.jpg Nikon D5500 with Aokatec AK-N7000 - 04.jpg Nikon D5500 with Aokatec AK-N7000 - 05.jpg Nikon D5500 with Aokatec AK-N7000 - 06.jpg Nikon D5 front-left 2016 China P&E.jpg|Nikon D5 Nikon D5 cutaway 2016 China P&E.jpg Nikon D810A front-left 2016 Nikon Museum.jpg|Nikon D810A Nikon D500 front 2016 Nikon Museum.jpg|Nikon D500 Nikon D500 front-left 2016 Nikon Museum.jpg Nikon D500 magnesium-alloy carbon chassis front-left 2016 China P&E.jpg Nikon D500 magnesium-alloy carbon chassis front-right 2016 China P&E.jpg D800, MB-D12, AF-S Zoom-Nikkor 24-70mm 2.8E ED VR-102.jpg|[[/Nikon D800/]] Nikon D610.jpg|[[/Nikon D610|Nikon D610]] Nikon D750 01.jpg|Nikon D750 Nikon D4s (prototype) 2014 CP+.jpg|Nikon D4s Nikon D4S Front DS7 4250 PK.jpg Nikon D3300 and parts 2014 CP+ (crop).jpg|Nikon D3300 Nikon D3300 and parts 2014 CP+.jpg Nikon D3300 and parts 2014 CP+ (crop).jpg Nikon D3300.jpg Nikon D7100 DSC7310EC.jpg|Nikon D7100 Nikon D7100 DSC7312EC.jpg Nikon D7100 DSC7311EC.jpg Nikon D7100 DSC7324EC.jpg Nikon D7100 DSC7323EC.jpg Nikon D7100 DSC7363EC.jpg Nikon D7100 DSC7312EC.jpg 2017 Nikon D7100.jpg Nikon D7100 DSLR with AF-S Nikkor 55-200m.jpg D7100 with 16-85mm.jpg 2014-12-29 15-46-54 d7100+24-70-tamron.jpg Nikon D7100 & Tamron SP 24-70mm F-2.8 Di VC USD 01.jpg Nikon 7100 mit Empfänger für GPS-Daten DSC03425.JPG|Nikon D7100 + GPS 2015-09-02 18-54-58 d7100+grip.jpg My Nikon - D7100 (13642541085).jpg Nikon MB-D15 DSC7355EC.jpg Nikon D30.jpg|Nikon D30 Nikon D5200 01 (retouch redo).jpg|D5200 Nikon D5200 02.jpg Nikon D5300.jpg|Nikon D5300 Nikon d5300 up.jpg|Nikon D5300 Main.JPG.jpg Nikon d5300 front.jpg D5300-3018.JPG Nikon D5300 (back).jpg Nik d5300 front2.jpg Nik d5300 front.jpg Nikon D800E.jpg|Nikon D800E Nikon D800E body only 01.jpg Nikon D800E with AF-S Nikkor 50mm f1.4G n02.jpg Nikon D800E with AF-S Nikkor 50mm f1.4G n03.jpg Nikon D810.jpg|Nikon D810 Nikon D810 - Crop - White background.jpg Nikon D810 (14509003190).jpg Nikon D810 EM1B6357-2.jpg Nikon F5 Kodak DCS660 01kln.jpg|Nikon F5 Kodak DCS660 Nikon D600 Front View.jpg|D600 Nikon D600 back view.jpg|D600 Nikon D600.JPG|D600 NIKON600.JPG Nikon D600 camera.jpg Nikon D600 med superzoom.jpg Nikon D600 med batterigrepp.jpg D600.jpg D600の外観.jpg Nikon D600.jpg D6002.jpg Nikon D600, Wikimedia Sverige.jpg Nikon D600 Front View.jpg D4-85 1.4.JPG|Nikon D4 Nikon D4-Detail-5549.jpg Nikon D4-Detail-5548.jpg Nikon D4-Back-5558.jpg Nikon D4-Detail-5555.jpg Nikon D4-Detail-5545.jpg Nikon D4-Detail-5544.jpg Nikon D4-Detail-5542.jpg Nikon D4-Detail-5539.jpg Nikon D4-Front-5559.jpg Nikon D4-Back-Display-5538.jpg Nikon D4-Detail-5533.jpg Nikon D4.jpg Nikon D4 20150213.jpg DS7 4252 PK.jpg DS7 4244 PK.jpg DS7 4238 PK.jpg DS7 4232 PK.jpg DS7 4227 PK.jpg Nikon d3200.jpg|Nikon D3200 Nikon D3200 (yellow).jpg|Nikon D3200 Nikon D3200, front left.JPG Nikon D3200, back left.JPG Nikon D3200, front.JPG Nikon D3S img 3543.jpg|[[/Nikon D3s/]] Nikon D80 Kamera edit.jpg|D80 Nikon D100 f2302056.jpg|D 100 Nikon D4 in a show-case.jpg|Nikon D4 Nikon D300s - Front Mk2.jpg|[[/Nikon D300s/]] Nikon D300s (camera body side view).jpg Nikon D300s - Front Mk2 edit.jpg Nikon D7000 and D800.jpg|Nikon D7000 and D800 </gallery> == Appareils numériques spéciaux == <gallery > 2016 Photokina - Nikon - by 2eight - DSC6691.jpg|Nikon KeyMission 80 2016 Photokina - Nikon - by 2eight - DSC6693.jpg|Nikon KeyMission 170 2016 Photokina - Nikon - by 2eight - DSC6688.jpg|Nikon KeyMission 360 2016 Photokina - Nikon - by 2eight - DSC6878.jpg CP+2016-36 (25207553941).jpg CP+2016-39 (25274413186).jpg CP+2016-40 (24932985389).jpg CP+2016-41 (24670037424).jpg Nikon KeyMission 360 front-left 2016 China P&E.jpg Nikon KeyMission 360.jpg Nikon KeyMission 360.JPG Rear lens of the Nikon KeyMission 360 by Don Ramey Logan.jpg </gallery> == Fourre-tout et sacs == Outre les étuis et sacs tout-prêts destinés à ses appareils et à ses objectifs, la marque vend l'un des derniers fourre-tout rigides que l'on puisse trouver sur le marché (réf. FB-17). == Objectifs == === Photos en réserve === <gallery> AF Nikkor 50 18.JPG Lens Nikkor 18-70mm.jpg Lens Nikkor 50mm.jpg AF Nikkor 50 18.JPG PC Nikkor 35mm.jpg Nikon UR-E8 2000px.jpg Nikon WC-E80 0.8x Wide Converter Top View 2900px.jpg Nikon WC-E80 0.8x Wide Converter Side View 2300px.jpg Nikon WC-E80 0.8x Wide Converter Bottom View 2100px.jpg Nikon HR-E5700 Lens Hood 2500px.jpg Nikkor AF 300mm f4 camo.jpg Nikon MB-D200 multi-power grip.jpg Micro-Nikkor AFS VR 105mm control panel.jpg </gallery> === Objectifs à mise au point manuelle === '''Images en attente''' <gallery> Montura Nikon F medidas.png|Monture Nikon F Fisheye-Nikkor Auto 6mm f2.8 lens 2015 Nikon Museum.jpg|Fisheye-Nikkor Auto 6 mm f/2,8 IMG.svg|Nikon Nikkor 8 mm f/5,6 Nikkormat FT SLR camera with Fisheye-NIKKOR 5,6 f=7,5mm and finder.jpg|Nikon Nikkor 7,5 mm f/5,6 fisheye NIKKOR-H 2.8cm f-3.5 lens (4202223258).jpg|Nikkor-H 28 mm f/3,5 Nikkor AF 35-70mm f3.3-4.5 zoom lens.jpg|AF 35-70mm GN45.jpg|GN 45 mm f/2,8 IMG.svg|/Nikon 50-300 (1976) Nikkor AF 50mm f1.8 with HN-3.jpg|AF 50mm f1.8 with HN-3 NIKKOR-S 5.8cm f-1.4 lens (4202223484).jpg|Nikkor-S 58 mm f/1,4 Nikon 80-200mm f4.5 MkII.jpg|80-200 f/4,5 MkII NIKKOR-O-55.jpg EL68.jpg|EL-68 Medical-nikkor.jpg|Medical Nikkor Nikkor 28-200 zoom.jpg|28-200 Nikkor Fisheye f2827616.jpg|Fisheye Nikon UR-E8 2000px.jpg|Nikon UR-E8 NIKKOR-S 5cm f-2 lens (4202223718).jpg|NIKKOR-S 50 mm f/2 Nikon F Photomic Auto Nikkor Telephoto-Zoom top 2015 Nikon Museum.jpg|85-250 (1959) K Micro Nikkor 105mm-4.0 (3120835837).jpg|K Micro Nikkor 105 mm f/4 Nikkor-P 105mm f-4 bellows lens (4299629334).jpg|Nikkor-P 105 mm f/4 bellows Nikkor-Q 13.5cm f-4 bellows lens (4298882553).jpg|Nikkor-Q 135 mm f/4 bellows NIKKOR-Q 13.5cm f-4 lens with BR1 ring (4201469297).jpg NIKKOR-Q 13.5cm f-4 lens attached to BR1 ring (4202223894).jpg Teleobjektiv-180mm.JPG|Nikon-P Auto 180 mm f/2,8 Nikkor AF 300mm f4 camo.jpg|AF 300mm f4 Nikkor AF 300mm f4 camo n2.jpg|AF 300mm f4 Nikkor Reflex 500mm 9078.jpg|Nikon Reflex-Nikkor-C 500 mm f/8 Nikkor Reflex 500mm 9079.jpg Nikkor Reflex 500mm 9080.jpg Nikkor Reflex 500mm 9081.jpg Nikkor Reflex 500mm 9082.jpg Nikon 500mm f8 Reflex-Nikkor 9082.jpg Nikon 500mm f8 Reflex-Nikkor 9081.jpg Nikon F Reflex-Nikkor 1000mm f6.3 lens left 2015 Nikon Museum.jpg|1000 mm f/6,3 Nikon F Reflex-Nikkor 1000mm f6.3 lens front-left 2015 Nikon Museum.jpg </gallery> {{Début cadre|bleu}} '''Attention !''' La liste qui suit est très incomplète et les questions de compatibilité ou d'incompatibilité des boîtiers Nikon aves les objectifs de marque Nikon ou en monture Nikon relèvent presque du cas par cas. De plus, certaines montures ont été modifiées par les soins de Nikon ou d'artisans indépendants, par exemple la fourchette de couplage a pu être ajoutée à un objectif qui en était dépourvu ou retirée d'un autre lorsqu'elle ne servait à rien. <center>'''Si un nikoniste veut s'y mettre ...'''</center> {{Fin cadre}} === Série F NAI === Le couplage au posemètre du boîtier se fait par une fourchette fixée sur la bague de diaphragme. <gallery> Auto nikkor 50mm.jpg|[[Nikon Nikkor-S Auto 50 mm f/1.4|Nikon Nikkor-S Auto 50 mm f/1.4]] IMG.svg|[[/Nikon Reflex-Nikkor 2.000 mm f/11|Nikon Reflex-Nikkor 2.000 mm f/11]] (1968) objectif catadioptrique </gallery> === Série AI === Le diaphragme est couplé mécaniquement au posemètre du boîtier (AI = ''Aperture Indexing''). <gallery> IMG.svg|[[/Nikon Nikkor AI Fisheye 8 mm f/2,8|Nikon Nikkor AI Fisheye 8 mm f/2,8]] {{25}} IMG.svg|[[/Nikon Nikkor AI 15 mm f/5,6|Nikon Nikkor AI 15 mm f/5,6]] {{25}} IMG.svg|[[/Nikon Nikkor AI 16 mm f/3,5|Nikon Nikkor AI 16 mm f/3,5]] {{25}} IMG.svg|[[/Nikon Nikkor AI 18 mm f/4|Nikon Nikkor AI 18 mm f/4]] {{25}} IMG.svg|[[/Nikon Nikkor AI 20 mm f/4|Nikon Nikkor AI 20 mm f/4]] {{25}} IMG.svg|[[/Nikon Nikkor AI 24 mm f/2,8|Nikon Nikkor AI 24 mm f/2,8]] {{25}} IMG.svg|[[/Nikon Nikkor AI 28 mm f/2|Nikon Nikkor AI 28 mm f/2]] {{25}} IMG.svg|[[/Nikon Nikkor AI 28 mm f/2,8|Nikon Nikkor AI 28 mm f/2,8]] {{25}} IMG.svg|[[/Nikon Nikkor AI 28 mm f/3,5|Nikon Nikkor AI 28 mm f/3,5]] {{25}} IMG.svg|[[/Nikon Nikkor AI 35 mm f/1,4|Nikon Nikkor AI 35 mm f/1,4]] {{25}} Nikkor 35mm f 2.0-4627.jpg|[[/Nikon Nikkor AI 35 mm f/2/]] {{50}} Nikkor 35mm f2.8 AI lens.jpg|[[/Nikon Nikkor AI 35 mm f/2,8/]] {{50}} Lifting-up-the-aperture-ring-of-the-nikkor-85mm-f2-ai.jpg|Nikon Nikkor 85 mm f/2 Lifting-up-the-bayonet-mount-of-the-nikkor-85mm-f2-ai.jpg Unscrewing-nikkor-85mm-f2-ai-bayonet-mount.jpg Unscrewing-the-front-lens-assembly-of-the-nikkor-85mm-f2-ai.jpg Unscrewing-the-front-lens-holder-ring-of-the-nikkor-85mm-f2-ai.jpg Unscrewing-the-front-labeled-ring-of-the-nikkor-85mm-f2-ai.jpg Unscrewing-the-focusing-ring-of-the-nikkor-85mm-f2-ai.jpg Nikkor-135-f2.8-Ai.jpg|[[/Nikon Nikkor AI 135 mm f/2,8/]] AI Zoom-Nikkor 1200-1700mm f5.6-8P IF-ED 2013 CP+.jpg|Nikon Nikkor AI 1200-1700 mm f/5,6-8 P IF-ED (1990) </gallery> === Série AI-S === Elle succède à la monture AI. La bague de diaphragme possède un ergot arrière qui transmet la valeur de l'ouverture au posemètre du boîtier. La couronne qui a été ajoutée à l'arrière de l'objectif peut poser des problèmes de mesure avec les boîtiers antérieurs à l'apparition de cette monture. La monture AI-S, contrairement à la monture AI, permet d'utiliser le mode programme de certains boîtiers comme les FA, F301 ou F501. Sur les boîtiers récents compatibles AI, les deux montures ont le même comportement sauf en ce qui concerne la mesure matricielle sur les F4 et D2h. Un objectif à monture AI-S reste toujours un AI et permet donc la mise au point assistée et la mesure de la lumière sur des boîtiers autofocus tels que les F501, F601, F801, F70, F90, F100, F4, F5, D1, D2. === Focale fixe === <gallery> Nikon-AI-S-Bajonett 1-1000x1000.jpg|Baïonnette AI-S Fisheye Nikkor 16mm.jpg|[[/Nikon AI-S fisheye 16 mm f/2.8/]] Nikkor 24 mm f2.8.jpg|[[/Nikon AI-S 24 mm f/2,8/]] Nikon 28mm f2.8 MF.jpg|Nikon 28 mm f/2,8 AI50F14S.JPG|[[/Nikon AI-S 50 mm f/1,4/]] Nikon 50mm f1.4 MF.JPG Nikon Nikkor 50 mm AIS, Seitenansicht DSC 7063 PK.jpg Nikon Nikkor 50 mm AIS DSC 7064 PK.jpg Ais5018ex.jpg|[[/Nikon AI-S 50 mm f/1,8/]] Micro-Nikkor 55mm f2.8.jpg|[[/Nikon AI-S Micro-Nikkor 55 mm f/2,8/]] {{75}} Noct nikkor 58mm.jpg|[[/Nikon Noct-Nikkor 58 mm f/1,2/]] Nikkor 85mm f2.jpg|[[/Nikon AI-S 85 mm f/2/]] IMG.svg|[[/Nikon AI-S Micro-Nikkor 105 mm f/2,8/]] {{50}} Nikon 135mm f2.8 MF.JPG|Nikon 135 mm f/2,8 Nikkor 180mm f2.8.jpg|180 mm Nikon 200mm f4 MF.JPG|Nikon 200 mm f/4 Nikkor 300mm f4.5 AIS lens.jpg|300 mm Nikkor 300 mm f4.5.jpg|300 mm </gallery> === Focale variable === <gallery> Nikkor 28-85 f3.5-4.5.jpg|[[/Nikon AI-S Nikkor 28-85 mm f/3.5~4.5|Nikon AI-S Nikkor 28-85 mm f/3.5~4.5]] Nikon 35-105 MF zoom lens.JPG|Nikon 35-105 Nikon 80-200 f4.JPG|Nikon Nikkor 80-200 mm f/4 IMG.svg|[[/Nikon AI-S Nikkor 80-200 mm f/4.5|Nikon AI-S Nikkor 80-200 mm f/4.5]] </gallery> === Série E === Le couplage AI-S est complet mais les objectifs n'ont pas de fourchette et ne peuvent donc pas être montés sur les appareils anciens. Il s'agit d'une série économique de qualité moindre que celle des AI-S. <gallery> Nikon Series E 50mm f1.8.jpg|E 50 mm f/1,8 </gallery> == Objectifs à mise au point « autofocus » == Depuis l'apparition de la mise au point automatique sur les appareils reflex, Nikon a commercialisé plusieurs séries d'objectifs AF (autofocus) ; presque tous sont encore compatibles avec les boîtiers actuels. Pour caractériser les fonctions propres à ces différentes séries, Nikon utilise un ensemble de désignations qui peuvent être regroupées en cinq grandes catégories : AF, AF-D, AF-G, AF-S et DX. Voici un résumé de la situation, début 2011. * '''AF''' : ce sont les objectifs de la première génération, ils portent la mention '''AF''' et présentent des contacts destinés au microprocesseur interne. Les premiers boîtiers permettant la mise au point automatique assurent seulement les fonctions de base, ceux qui ont été commercialisés à partir de 1996 requièrent l'envoi de données depuis les objectifs, en particulier la distance de mise au point, utile pour le fonctionnement du système d'exposition. * '''AF-D''' : les objectifs de cette série ont été lancés en 1996, ils ressemblent aux objectifs AF mais ils contiennent un microprocesseur qui transmet les indications de distance au boîtier, facilitant la détermination de l'exposition et surtout l'exposition au flash. Tous les objectifs Nikon actuels sont compatibles avec le système AF-D, ils se distinguent par la mention '''D'''. Il s'agit d'une série éconopique assurant le couplage AI-S complet * '''AF-G''' : ces objectifs ont fait leur apparition sur le marché en 2000, ils offrent les mêmes fonctions que les objectifs AF-D mais ils ne comportent aucune bague d'ouverture. Cette dernière n'était requise que par les boîtiers des anciennes générations, cette donnée n'étant alors pas transmise par l'objectif. On les reconnaît à la lettre '''G'''. * '''AF-S (ou AF-I)''' : ces objectifs offrent les mêmes fonctionnalités que les objectifs AF-D ou AF-G mais ils sont dotés d'un moteur de mise au point ultrasonique intégré (AF-S = ''Autofocus-Silent''). Le système SWM (''Silent Wave Motor''), lancé en 1996, permet une mise au point encore plus rapide et discrète. Le moteur intégré se substitue au moteur conventionnel auparavant placé dans le boîtier. * '''DX''' : commercialisés à partir de 2002, ils ne couvrent pas le format 24 x 36 et sont donc destinés aux boîtiers reflex « demi-format ». Leur montage reste possible sur les appareils argentiques mais l'image n'est pas complète, il n'est donc pas recommandé de se livrer à ce genre d'exercice. {{en travaux}} === Série AF === <gallery> Nikon 18-35mm F3.5-4.5 (4691108094).jpg|[[/Nikon AF Nikkor 18-35 mm f/3,5-4,5 D IF ED/]] (29 août 2000) {{100}} Nikkor AF 24 f2.8.jpg|[[/Nikon Nikkor AF 24 mm f/2,8/]] AF Zoom-Nikkor 28-80mm f-3.5-5.6D-1042.jpg|Nikon Zoom-Nikkor AF 28-80 mm f/3,5-5,6 D Nikon 35-70mm f3.3-f4.5.jpg|[[/Nikon Nikkor AF 35-70 mm f/3,3-4,5/]] AF Nikkor 50mm-1.4 (3120834901).jpg|[[/Nikon Nikkor AF 50 mm f/1,4/]] Nikon 50mm f1.8 Austin Calhoon Photograph.jpg|[[/Nikon Nikkor AF 50 mm f/1,8/]] (1986-2011) My new toy (420543111).jpg|[[/Nikon Nikkor AF 50 mm f/1,8 D/]] Nikon 20110209 70-210D.jpg|[[/Nikon Nikkor AF 70-210 mm f/4-5,6/]] Nikon 70-210mm f4 Austin Calhoon Photograph.jpg|Nikon AF 70-210 mm f/4 AF Zoom-Nikkor 75-300mm f-4.5-5.6-7297.jpg|AF Zoom-Nikkor 75-300mm f-4.5-5.6 AF Zoom-Nikkor 75-300mm f-4.5-5.6-7298.jpg AF Zoom-Nikkor 75-300mm f-4.5-5.6-7301.jpg AF Zoom-Nikkor 75-300mm f-4.5-5.6-7303.jpg Nikkor AF 80-200 f 2.8 ED.jpg|Nikkor AF 80-200 mm f/2,8 ED Nikkor AF 80-400mm f-4.5-5.6 ED VR D lens 01.jpg|[[/Nikon Nikkor AF 80-400 mm f/4,5-5,6 ED VR D/]] (février 2000) Nikon 105mm f2.8 AF Micro-Nikkor, 2013 November.jpg|Nikon AF Micro-Nikkor 105 mm f/2,8 </gallery> === Série AF-D === <gallery> Nikon lenses.jpg Nikkor 24-2 8d hg.jpg|[[/Nikon AF Nikkor 24 mm f/2,8 D|Nikon AF Nikkor 24 mm f/2,8 D]] Lens aperture side.jpg|AF 35 mm Lens aperture top.jpg Nikon AF Nikkor 50mm f1.4D.png|50 mm f/1,4 Nikon AF NIKKOR 50 mm 1,4D.jpg|50 mm f/1,4 AF-D Nikkor 50mm f 1.4 front.jpg AF-D Nikkor 50mm F 1.4D pic2.jpg Lens Nikkor 50mm.jpg|[[/Nikon Nikkor AF 50 mm f/1,8 D|Nikon Nikkor AF 50 mm f/1,8 D]] (2002) {{100}} Nikon 60mm Macro F 2.8 AF D on Sony NEX-5C.jpg|[[/Nikon AF-D Micro-Nikkor 60 mm f/2,8|Nikon AF-D Micro-Nikkor 60 mm f/2,8]] {{75}} IMG.svg|[[/Nikon AF-D Micro-Nikkor 70-180 mm f/4,5-5,6|Nikon AF-D Micro-Nikkor 70-180 mm f/4,5-5,6]] {{50}} N80 with Nikkor 80-200mm f2.8 AF-D.jpg|Nikon Nikkor AF-D 80-200 mm f/2,8 Nikkor AF 80-200 mm f 2.8 D.jpg|80-200 Nikkor AF-D 85mm F1.8 b.jpg|[[/Nikon Nikkor AF-D 85 mm f/1,8|Nikon Nikkor AF-D 85 mm f/1,8]] Nikkor AF-D 85mm F1.8 a.jpg 85mm-1.8-AF-D.jpg Nikon-85mm-AF-D-1.4.jpg|[[/Nikon Nikkor AF-D 85 mm f/1,4|Nikon Nikkor AF-D 85 mm f/1,4]] Nikon-HN-21.jpg Prime number 2 (498858586).jpg IMG.svg|[[/Nikon AF-D Micro-Nikkor 105 mm f/2,8|Nikon AF-D Micro-Nikkor 105 mm f/2,8]] {{50}} Micro-Nikkor 200mm f-4D - New Gear Acquired! (8688218719).jpg|[[/Nikon AF-D Micro-Nikkor 200 mm f/4 IF-ED|Nikon AF-D Micro-Nikkor 200 mm f/4 IF-ED]] {{75}} </gallery> === Série AF-G === <gallery> Nikon 70-300mm f4-5.6G AF Zoom-Nikkor, 2013 November.jpg|Nikon AF 70-300 mm f/4-5,6 G Nikon 70-300mm f4-5.6G AF Zoom-Nikkor with lens hood, 2013 November.jpg AF Nikkor 70-300mm G.jpg AF Nikkor 70-300mm G zoom lens.jpg </gallery> === Série AF-S === <gallery> AF-S Contacts.jpeg|Contacts de la monture Nikkor 18-55 16-85 comparison.jpg </gallery> ==== Focales fixes ==== <gallery> Nikkor Fisheye 001.jpg|[[/Nikon Fisheye-Nikkor AF DX 10,5 mm f/2,8 G ED|Nikon Fisheye-Nikkor AF DX 10,5 mm f/2,8 G ED]] Nikkor Fisheye 002.jpg Nikkor Fisheye 003.jpg Nikkor Fisheye 004.jpg Nikon DX fisheye DSC7315EC.jpg Nikon Fisheye 2,8 10,5 DSC7316EC.jpg IMG.svg|[[/Nikon Nikkor AF-S 24 mm f/1,4 G ED|Nikon Nikkor AF-S 24 mm f/1,4 G ED]] (9&nbsp;février&nbsp;2010) {{75}} Nikon 28mm f1.8G.jpg|Nikon Nikkor AF-S 28 mm f/1,8 IMG.svg|[[/Nikon AF-S 35 mm f/1,4 G ED|Nikon AF-S 35 mm f/1,4 G ED]] (juillet 2011) {{25}} Nikkor 35mm 1.8G.jpg|[[/Nikon Nikkor AF-S 35 mm f/1,8 G|Nikon Nikkor AF-S 35 mm f/1,8 G]] (9 février 2009) {{100}} Nikon DX AF-S Micro Nikkor 40mm f2,8G.jpg|[[/Nikon Micro Nikkor AF-S DX 40 mm ƒ/2,8 G|Nikon Micro Nikkor AF-S DX 40 mm ƒ/2,8 G]] (13&nbsp;juillet&nbsp;2011) 11-09-04-nikon-d300s-by-RalfR-DSC 5402.jpg|[[/Nikon Nikkor AF-S 50 mm f/1,4 G|Nikon Nikkor AF-S 50 mm f/1,4 G]] (22&nbsp;septembre&nbsp;2008) {{100}} AF-S Nikkor 50mm f1.8 G with hood.JPG|[[/Nikon AF-S Nikkor 50 mm f/1,8 G|Nikon AF-S Nikkor 50 mm f/1,8 G]] (27&nbsp;avril&nbsp;2011) {{100}} IMG.svg|[[/Nikon AF-S Nikkor 50 mm f/1,8 G special edition|Nikon AF-S Nikkor 50 mm f/1,8 G special edition]] (5&nbsp;novembre&nbsp;2013) {{75}} Nikon 60mm f2.8 AF-S Micro-Nikkor.jpg|[[/Nikon Micro-Nikkor AF-S 60 mm f/2,8 G ED|Nikon Micro-Nikkor AF-S 60 mm f/2,8 G ED]] (2008) {{25}} 13-01-02-nikond300s-14-85-nr06.jpg|[[/Nikon AF-S Nikkor 85 mm f/1,4 G|Nikon AF-S Nikkor 85 mm f/1,4 G]] (19&nbsp;août&nbsp;2010) {{75}} Nikon-AF-S-85mm-1.8-01.jpg|[[/Nikon Nikkor AF-S 85 mm f/1,8 G|Nikon Nikkor AF-S 85 mm f/1,8 G]] Nikon-AF-S-85mm-1.8-02.jpg Nikon 85mm f1.8G lens.jpg Nikon AF-S 105mm F1.4.jpg|Nikon AF-S Nikkor 105 mm f/1,4 E ED Micro-Nikkor AFS VR 105 mm f2.8 IF-ED.jpg|[[/Nikon AF-S VR Micro-Nikkor 105 mm f/2,8 G IF ED|Nikon AF-S VR Micro-Nikkor 105 mm f/2,8 G IF ED]] (2006) {{75}} AF-S Nikkor 200mm F2G ED VR II 01.jpg|[[/Nikon AF-S Nikkor 200 mm f/2 G ED VR II|Nikon AF-S Nikkor 200&nbsp;mm f/2 G ED VR&nbsp;II]] (2010) {{75}} IMG.svg|[[/Nikon AF-S VR Nikkor 300 mm f/2,8 EC VR II|Nikon AF-S VR Nikkor 300 mm f/2,8 EC VR II]] (10 décembre 2009) {{75}} IMG.svg|[[/Nikon AF-S VR Nikkor 400 mm f/2,8 G IF-ED|Nikon AF-S VR Nikkor 400 mm f/2,8 G IF-ED]] (28 août 2007) {{00}} AF-S Nikkor 400mm F2.8E FL ED VR 01.jpg|[[/Nikon AF-S Nikkor 400 mm f/2,8 E FL ED VR|Nikon AF-S Nikkor 400 mm f/2,8 E FL ED VR]] IMG.svg|[[/Nikon AF-S 500 mm f/4 G ED VR|Nikon AF-S 500 mm f/4 G ED VR]] (28 août 2007) {{25}} IMG.svg|[[/Nikon AF-S Nikkor 500 mm f/4 E FL ED VR|Nikon AF-S Nikkor 500 mm f/4 E FL ED VR]] (2&nbsp;juillet&nbsp;2015) {{75}} IMG.svg|[[/Nikon AF-S 600 mm f/4 G IF-ED|Nikon AF-S 600 mm f/4 G IF-ED]] (28 août 2007) {{25}} </gallery> <gallery> Canon 15 85 DSCF1009EC.jpg Nikkor.png </gallery> ==== Focales variables ==== <gallery> IMG.svg|[[/Nikon Nikkor AF-S 14-24 mm f/2,8 G ED]](28 août 2007) {{00}} AF-S Nikkor 16-35mm f 4G ED VR, -1 Jul. 2013 a.jpg|[[/Nikon Nikkor AF-S 16-35 mm f/4 G ED VR/]] (20 février 2010) 2015 Obiektyw Nikkor AF-S DX 16-85 mm.jpg|[[/Nikon Nikkor AF-S DX 16/85 mm f/3,5-5,6 G ED VR/]] Lens Nikkor 18-70mm.jpg|18-70 Nikon 18-70mm f3.5-4.5.jpg|18-70 Nikon Nikkor 18-70 mm lens.jpg|18-70 AF-S DX NIKKOR 18-105mm f3.5-5.6G ED VR 30062014.jpg|[[/Nikon Nikkor AF-S DX 18-105 mm f/3,5-5,6 G ED VR/]] Nikon Nikkor 18-140 lens.jpg|[[/Nikon Nikkor AF-S DX 18-140 mm f/3,5-5,6 G ED VR/]] AF-S DX Nikkor 18-140 f 3.5-5.6G ED VR.jpg AF-S DX Nikkor 18-140 f 3.5-5.6G ED VR LENS.jpg Nikon 18-300 DSC7340EC.jpg|[[/Nikon Nikkor AF-S DX 18-300 mm f/3,5-5,6 G ED VR/]] (2012) {{100}} IMG.svg|[[/Nikon Nikkor AF-S DX 18–300 mm f/3,5–6,3 G ED VR/]] (10&nbsp;avril&nbsp2014) {{75}} Nikon AF-S 24-70mm f-2.8G ED.jpg|[[/Nikon AF-S 24-70 mm f/2,8 G ED/]] (28 août 2007) {{00}} AF-S Zoom-Nikkor 24-70mm f2,8G ED.jpg AF-S Zoom-Nikkor 24-70mm 2.8E ED VR-107.jpg|[[/Nikon Nikkor AF-S 24-70 mm f/2,8 E ED VR/]] (4&nbsp;août&nbsp;2015) {{75}} IMG.svg|[[/Nikon Nikkor AF-S 24-85 mm f/3,5-4,5 G ED VR/]] (14&nbsp;juin&nbsp;2012) {{75}} Nikkor Lens 24-120mm - 8184.jpg|[[/Nikon Nikkor 24-120 mm f/3,5-5,6 D/]] IMG.svg|[[/Nikon Nikkor 24-120 mm f/3,5-5,6 G IF-ED/]] Vr-fx-lens.jpg|[[/Nikon Nikkor 24-120 mm f/3,5-5,6 G VR ED/]] AF-S Nikkor 24-120mm f 4G ED VR, -8 Jun. 2012 a.jpg|[[/Nikon Nikkor AF-S 24-120 mm f/4 G ED VR/]] Nikon DX AF-S NIKKOR 55-200mm 4-5.6 ED VR.png|55-200 mm 4.5-5.6G lens 2.jpg|Nikon AF-S 55-300 4.5-5.6G lens.jpg IMG.svg|[[/Nikon AF-S VR 70–200 mm f/2,8 G/]] (2009) {{50}} AF-S VR Nikkor 70-210mm-2.8 IF-ED (3120834325).jpg|[[/Nikon AF-S Nikkor 70-210 mm f/2,8 IF ED/]] AF-S VR Zoom-NIKKOR 70-200mm f2.8G IF-ED.jpg|[[/Nikon AF-S Nikkor 70-210&nbsp;mm f/2,8 G IF ED VR/]] Nikon ED AF-S Nikkor 70-200mm F2.8G VR lens.jpg|Nikon AF-S Nikkor 70-200 mm f/2,8 G ED VR IMG.svg|[[/Nikon Nikkor AF-S 70-200 mm f/2,8 G VR II/]] (juillet&nbsp;2009) {{75}} Nikkor AF 70-200 2.8G AF-S ED VR II, Wikimedia Sverige.png|[[/Nikon Nikkor AF-S 70-200 mm f/2,8 G ED VR II/]] Nikon AF-S Nikkor 70-200mm F2.8G ED VR II lens with Nikon HB-48 Bayonet Lens Hood and Nikon AF-S Nikkor 85mm F1.4G lens with Nikon HB-55 Bayonet Lens Hood.jpg Nikon AF-S Zoom-Nikkor 70-200-2.8G ED VR II 140216 1.jpg Nikon D7100 & AF-S Nikkor 70-200mm 1-2,8G ED VR II 01.jpg Nikon D7100 & AF-S Nikkor 70-200mm 1-2,8G ED VR II 02.jpg Nikon D3100 & AF-S Nikkor 70-200mm 1-2,8G ED VR II 01.jpg Nikonnikkor70300vrlens.JPG Nikkor Objektiv.jpg|[[/Nikon Nikkor AF-S VR 70-300 mm f/4,5-5,6 G IF-ED/]] Nikkor 70-300mm Zoom.jpg|70-300 Nikon D90 with Nikon AF-S VR Zoom-Nikkor 70-300mm F4.5-5.6G IF-ED lens - (detail).jpg Nikon D90 with Nikon AF-S VR Zoom-Nikkor 70-300mm F4.5-5.6G IF-ED lens - (1).jpg Nikon D90 with Nikon AF-S VR Zoom-Nikkor 70-300mm F4.5-5.6G IF-ED lens.jpg Nikon AF Zoom-Nikkor 80-200mm f2.8D ED lens.jpg|[[/Nikon AF-S Nikkor 80-200 mm f/2,8 D ED/]] Nikon D800 with Nikon AF-S Nikkor 80–400 mm F4.5–5.6G ED VR lens.jpg|[[/Nikon AF-S Nikkor 80–400 mm f/4,5–5,6 G ED VR/]] (5&nbsp;mars&nbsp;2013) {{100}} IMG.svg|[[/Nikon Nikkor AF-S VR 200-400 mm f/4 G IF-ED D/]] (vers 2004) {{75}} IMG.svg|[[/Nikon AF-S Nikkor 200-500 mm f/5,6 E ED VR/]] (4&nbsp;août&nbsp;2015) {{75}} </gallery> === Série DX === <gallery> Nikon10-24mm.jpg|[[/Nikon Nikkor AF-S DX 10-24 mm f/3,5-4,5 G ED|Nikon Nikkor AF-S DX 10-24 mm f/3,5-4,5 G ED]] (14&nbsp;avril&nbsp;2009) {{100}} AF DX Fisheye-Nikkor ED 10.5mm F2.8G.jpg|Nikon Nikkor AF Fisheye DX ED 10,5 mm f/2,8 Nikon 12 24 DSC7381WP.jpg|[[/Nikon Nikkor AF-S DX 12-24 mm f/4 G ED-IF|Nikon Nikkor AF-S DX 12-24 mm f/4 G ED-IF]] Nikkor DX 12-24 mm.JPG Nikon 16-85 f-3.5-5.6G.jpg|[[/Nikon Nikkor AF-S DX 16-85 mm f/3,5-5,6 G ED VR|Nikon Nikkor AF-S DX 16-85 mm f/3,5-5,6 G ED VR]] AF-S Nikkor 16-85mm f 3.5-5.6G ED VR, -28 Dec. 2009 a.jpg|id Nikkor 17-55 f2844464.jpg|[[/Nikon Nikkor AF-S DX 17-55 mm f/2,8 G ED-IF|Nikon Nikkor AF-S DX 17-55 mm f/2,8 G ED-IF]] AF-S DX Zoom-Nikkor 18-55mm f-3.5-5.6G ED II.jpg|id Nikon 18-55mm f3.5-5.6G ED II.jpg|id Nikon1855vslens.JPG AF-S DX Nikkor 18-55mm f 3.5-5.6G VR lens, -11 Dec. 2011 a.jpg|Nikon Nikkor AF-S DX 18-55 mm f /3,5-5,6 G VR Nikon DX AF-S 18-55mm G II ED (2).jpg|id Nikon DX AF-S 18-55mm G II ED.jpg|id IMG.svg|[[/Nikon Nikkor AF-S VR DX 18-55 mm f/3,5-5,6 G|Nikon Nikkor AF-S VR DX 18-55 mm f/3,5-5,6 G]] AF-S DX Nikkor 18-55mm f 3.5-5.6G VR.jpg|Nikon Nikkor 18-55 Nikon DX AF-S NIKKOR 18-55mm 3.5-5.6 G II ED.png|[[Photographie/Fabricants/Nikon/Nikon AF-S DX Zoom-Nikkor 18-55mm f/3,5-5,6 G ED II|Nikon AF-S DX Zoom-Nikkor 18-55 mm f/3,5-5,6 G II ED]] (2006) {{50}} Nikon AF-S DX 18-70mm f3.5-4.5G ED-IF.jpg|18-70 Nikon AF-S DX 18-70mm f3.5-4.5G ED-IF with HB-32.jpg Nikon AF-S DX NIKKOR 18-105mm f3,5-5,6G ED VR.jpg|[[/Nikon Nikkor AF-S DX 18-105 mm f/3,5-5,6 G ED VR|Nikon Nikkor AF-S DX 18-105 mm f/3,5-5,6 G ED VR]] (27&nbsp;août&nbsp;2008) {{100}} AF-S DX NIKKOR 18-135mm.jpg|Nikon Nikkor AF-S DX 18-135 mm f/3,5-5,6 G ED IMG.svg|AF-S DX 18-135 mm f/3,5-5,6 ED-IF Nikkor AF-S VR DX 18-200mm f3.5-5.6 with HB-35.jpg|18-200 Nikkor AF-S VR DX 18-200mm f3.5-5.6.jpg Nikon 18-200mm DX partially extended barrel 3..jpg Nikon mount on lens with mekanical and electrical contacts.jpg|18-200 AF-S DX Nikkor 18-200mm f 3.5-5.6G ED VR II Lens, -21 Mar. 2011 a.jpg The big daddy (424591218).jpg IMG.svg|[[/Nikon AF-S DX 18-200 mm f/3,5-5,6 G ED VR II|Nikon AF-S DX 18-200 mm f/3,5-5,6 G ED VR II]] (30 juillet 2009) {{75}} AF-S DX Nikkor 35mm f 1.8G, -5 Feb. 2011 a.jpg|[[/Nikon Nikkor AF-S DX 35 mm f/35 mm f/1,8 G|Nikon Nikkor AF-S DX 35 mm f/35 mm f/1,8 G]] AF-S DX Nikkor 35mm f 1.8G.upright 2.ajb.jpg AF-S DX Nikkor 35mm f 1.8G.upright 1.ajb.jpg AF-S DX Nikkor 35mm f 1.8G.frontal.ajb.jpg AF-S DX Nikkor 35mm f 1.8G.HB 46.ajb.jpg Nikon DX AF-S 55-200mm VR.jpg|[[/Nikon AF-S DX VR 55-200 mm f/4,0-5,6 G IF-ED|Nikon AF-S DX VR 55-200 mm f/4,0-5,6 G IF-ED]] (6&nbsp;mars&nbsp;2007) {{50}} AF-S DX Nikkor 55-300mm f 4.5-5.6G ED VR.upright.HB 57.ajb.jpg|[[/Nikon Nikkor AF-S DX 55-300 mm f/4,5-5,6 G ED VR AS-S|Nikon Nikkor AF-S DX 55-300 mm f/4,5-5,6 G ED VR]] (mai 2011) {{75}} </gallery> === Série 1 pour format CX === <gallery> 1 Nikkor VR 10-30mm f 3.5-5.6, -22 Sep. 2012 a.jpg|[[/Nikon 1 Nikkor VR 10-30 mm f/3,8-5,6|Nikon 1 Nikkor VR 10-30&nbsp;mm f/3,8-5,6]] IMG.svg|[[/Nikon 1 Nikkor AW 11-27,5 mm f/3,5-5,6|Nikon 1 Nikkor AW 11-27,5 mm f/3,5-5,6]] (29&nbsp;septembre&nbsp;2013) {{75}} 1 Nikkor VR 30-110mm f 3.8-5.6, -Jul. 2011 a.jpg|[[/Nikon 1 Nikkor VR 30-110 mm f/3,8-5,6|Nikon 1 Nikkor VR 30-110&nbsp;mm f/3,8-5,6]] (21&nbsp;septembre&nbsp;2011) {{100}} </gallery> === Objectifs spéciaux === Les objectifs PC-Nikkor permettent le décentrement (PC = ''Perspective Control''). ==== année 1968 ==== <gallery> IMG.svg|[[/Nikon Nikkor-Q 450 mm f/9|Nikon Nikkor-Q 450 mm f/9]] (1968) pour prises de vues dans l'UV {{25}} IMG.svg|[[/Nikon Ultra Micro Nikkor 250 mm f/1/]] (1968) pouvoir séparateur 400 lignes/mm </gallery> ==== année 2008 ==== <gallery> Nikon 45mm pc-e.jpg|[[/Nikon PC-E Micro-Nikkor 45 mm f/2,8 D ED/]] (2008) {{75}} </gallery> '''à classer''' <gallery> MN150and70.jpg Nikkor PC-E 1-3.5 D ED.jpg|[[/Nikon Nikkor PC-E 24 mm f/3,5 D ED/]] Nikkor-PC-E.jpg|Nikon PC-E 24 mm 28mm f4 PC-Nikkor lens.jpg|28 mm f/4 Nikon FTN with Nikkor lens.jpg|35 mm PC Nikkor, front (3651192187).jpg Nikon-35mm-left.jpg D700-35pc.jpg|35 mm 35pc-ftn.jpg|35 mm </gallery> ==== Objectifs d'agrandissement ==== <gallery> ELnikkorASML.jpg ELnikkorA.jpg Enlarger lens board.jpg|EL-Nikkor AEN105.jpg EL6835740350.jpg|Nikon EL-Nikkor 68 mm f/3,5 My enlarging lens (medium format) (3891071532).jpg|Nikon EL-Nikkor 80 mm f/5,6 Esclo apo el nikkor 170.jpg|[[/Nikon Apo-EL-Nikkor 170 mm f/5,6/]] </gallery> ==== à classer ==== <gallery> IMG.svg|Nikon Medical-Nikkor Nikkor PC-E 1-3.5 D ED.jpg ProcN180.jpg UMN135.jpg|Nikon Ultra-Micro-Nikkor 135 mm f/4 Nikkor Fisheye f2827616.jpg|fisheye 10,5 mm Nikon 16 fisheye.jpg|Fisheye 16 mm 28mm-PC.jpg|PC 28 mm MacroNikkor35.jpg|Macro-Nikkor 35 0555 Nikkor SW 65mm f4 (9121968965).jpg|Nikkor SW 65 mm f/4 IMG.svg|[[/Nikon PC Micro-Nikkor 85 mm f/2,8 D/]] {{50}} PN9528A.jpg|Printing Nikkor 95 mm f/2,8 WA-Apo-150mm-F8.jpg|WA Apo 150 mm Nikon D700 with Nikon Medical-Nikkor C Auto 200mm f5.6 -140817- macro lens.jpg|Medical-Nikkor C auto 200 mm f/5,6 ApoNIKKOR240.jpg|Apo-Nikkor 240 mm f/9 IMG.svg|[[/Nikon Reflex-Nikkor 2000 mm f/11/]] (vers 1970) </gallery> == Compléments optiques == * '''Nikon WC-E68 Wide Angle Converter Lens''' pour Coolpix 4300, 4500, 5000, 700, 800, 880, 885, 900, 950, 990 et 995. Selon les appareils, on obtient un agrandissement de l'angle de champ plus ou moins important qui peut atteindre de 80 à 99°, ce qui correspondrait en 24 x 36 à des distances focales variant de 24 à 19 mm. Dimensions 66 x 33 mm, poids environ 190 g. [[File:Fce9.jpg|200px]] <gallery> Nikon TC17 DSC7368EC.jpg|Nikon TC17 Nikon TC17 DSC7366EC.jpg Nikon Tele Converter TC-E2 et Nikon Wide Converter WC-E63.jpg|Tele Converter TC-E2 et Wide Converter WC-E63 Nikon Tele Converter TC-E2.jpg|Tele Converter TC-E2 Nikon Wide Converter WC-E63.jpg|Wide Converter WC-E63 Coolpix Fish-Eye Converter Lens FC-E8, FC-E9.jpg|Converter Lens FC-E8, FC-E9 </gallery> == Batteries == <gallery> Nikon EN-EL18a-101.jpg|Nikon EN-EL18a </gallery> == Chargeurs de batteries == <gallery> Nikon MH-26a & EN-EL18a-101.jpg|Chargeur Nikon MH-26a avec batterie EN-EL18a Nikon MH-26a & EN-EL18a-102.jpg|Chargeur Nikon MH-26a avec batterie EN-EL18a </gallery> == Grips d'alimentation == <gallery> Nikon MB-D10 Multi Power Battery Pack.jpg|Nikon MB-D10 Multi Power Battery Pack pour les reflex Nikon D300 et D700 Nikon MB-D12 Multi-Power Battery Pack-102.jpg|Nikon MB-D12 Multi-Power Battery Pack Nikon MB-D12 Multi-Power Battery Pack-101.jpg|Nikon MB-D12 Multi-Power Battery Pack Nikon MB-D12 battery rack-101.jpg|Nikon MB-D12 battery rack Nikon MB-D12 battery racks-102.jpg|Nikon MB-D12 battery racks Nikon MB-D12 Multi-Power Battery Pack with BL-5 & EN-EL18a-101.jpg|Nikon MB-D12 Multi-Power Battery Pack avec adapteur BL-5 et EN-EL18a Nikon MB-D12 Multi-Power Battery Pack-103.jpg|Nikon MB-D12 Multi-Power Battery Pack et deux battery racks Nikon BL-5 for EN-EL18-102.jpg|adaptateur Nikon BL-5 pour EN-EL18 Nikon BL-5 for EN-EL18-101.jpg|adaptateur Nikon BL-5 pour EN-EL18 Nikon BL-5 & EN-EL18a-102.jpg|adaptateur Nikon BL-5 avec EN-EL18 Nikon BL-5 & EN-EL18a-101.jpg|adaptateur Nikon BL-5 avec EN-EL18 </gallery> == Flashes == <gallery> Nikon SP Nikon BC-5 flash unit 2015 Nikon Museum.jpg|Nikon SP avec flash Nikon BC-5 (1957) Nikon S2 flash.png|Nikon S2 IMG.svg|Nikon SB-7E IMG.svg|Nikon Medical-Nikkor SB-10 (avant 1979) IMG.svg|Nikon SB-14 (1982) Nikon SpeedLight SB-15.jpg|SB-15 Nikon SB-23 speedlight flash.JPG|Nikon Speedlight SB-23 Nikon SB-400 Flash.JPG|Nikon SB-400 Nikon SB-400 front.JPG|SB-400 SB-400.jpg SB-400 2.jpg SB-400 3.jpg Nikon Speedlight SB-400 05.jpg Nikon Speedlight SB-400 03.jpg Nikon Speedlight SB-400 04.jpg Nikon Speedlight SB-400 02.jpg Nikon Speedlight SB-400 01.jpg Nikon SB-50DX lever.JPG Nikon SB-50DX Sideview.JPG Nikon SB-600 (1 of 2).jpg|[[Nikon SB-600]] Nikon SB-600 (2 of 2).jpg|SB-600 Nikon-sb-600-back.jpg|SB-600 Nikon-sb-600-front.jpg|SB-600 Nikon Speedlight SB-600.jpg Nikon Speedlight SB-700 Flash shoe contacts.JPG|Nikon Speedlight SB-700 Nikon SB-800 Flash.JPG|[[/Nikon Speedlight SB-800|Nikon Speedlight SB-800]] Nikon SB-800 Flash Shoe Macro.JPG|SB 800 Nikon Speedlight SB-800.jpg Flash - Speedlight - SLR Flash - Studio picture 2011.jpg|SB 900 Nikon SB-900 back.JPG Nikon SB-900 Power Socket.JPG Nikon SB-900 P7000.JPG Nikon SB-900 top.JPG Nikon SB-900 right.JPG Nikon SB-900-pjt.JPG Nikon Speedlight SB 910 Blixt bild 1.JPG|Nikon Speedlight SB-910 Nikon Speedlight SB 910 Blixt.JPG Nikon SU-800 back.JPG|SU 800 Nikon SU-800 front.JPG Nikon SB-R200 front.JPG|SB R200 Nikon SB-R200 right difusor.JPG Nikon SB-R200 top.JPG Nikon SB-26.jpg|SB-26 Nikon flash Speedlight SB-28.jpg|SB-28 Nikon Remote Kit R1.jpg|SB Nikon R1C1.JPG Nikon R1 front.JPG Nikon SG-3IR.JPG|SG-3IR IMG.svg|Nikon SR2 Nikon ring light SR2.png </gallery> == Moteurs == <gallery> Nikon MD12.jpg|Nikon MD12 pour FE, FM, FA </gallery> == Bonnettes == * '''bonnettes simples''' : les références N°0, N°1 et N°2 correspondent respectivement à des lentilles minces de 0,7, 1,5 et 3 <math>\delta</math>. Elles sont disponibles au diamètre de 52 mm pour environ 70&nbsp;€. * '''doublets achromatiques''' : les références N°3T et N°4T correspondent respectivement à 1,5 et 2,9 <math>\delta</math>, disponibles en 52 mm pour environ 70&nbsp;€ ; les références N°5T et N°6T correspondent respectivement à 1,5 et 2,9 <math>\delta</math>, disponibles en 62 mm pour environ 100 €. == Bagues-allonges == Elles sont utilisées pour la [[Photographie/Techniques scientifiques/Photographie rapprochée|photographie rapprochée]] (proxiphotographie et macrophotographie). <gallery> * '''Nikon PK-11A''' : longueur 8 mm, 120 € * '''Nikon PK-12''' : longueur 14 mm, 130 € * '''Nikon PK-13''' : longueur 27,5 mm, 145 € * '''Nikon PN-11''' : longueur 52,5 mm, 275 € Nikon M2 extension tube-4630.jpg Nikon PK-11 8 extension tube-4629.jpg </gallery> == Soufflets == <gallery> Nikon Bellows II with 13.5cm f-4 lens (4202257932).jpg|Nikon Bellows II Nikon-Soufflet-Bellows-PB4.jpg|Nikon PB-4 </gallery> * '''Nikon PB-6''' : monture Nikon, augmentation de tirage de 48 à 208 mm, pas de [[Photographie/Techniques particulières/Bascule et décentrement|bascule ni de décentrement]], environ 550 €. == Commandes à distance == <gallery> NIKON AC-2E 1993.jpg|Télécommande AC-2E pour F90X/N90s (1993) Nikon Remote Release ML-L3.jpg|Télécommande ML-L3 </gallery> == Scanners == <gallery> IMage:IMG.svg|[[/Nikon Coolscan ED IV|Nikon Coolscan ED IV]] Nikon DSC 1483EC.jpg|[[/Nikon Super Coolscan ED 4000|Nikon Super Coolscan ED 4000]] IMage:IMG.svg|[[/Nikon Coolscan ED V|Nikon Coolscan ED V]] (Automne 2003) (25) IMage:IMG.svg|[[/Nikon Super Coolscan ED 5000|Nikon Super Coolscan ED 5000]] (Automne 2003) (25) </gallery> == Matériels divers == <gallery> IMG.svg|Nikon MF-14 (1982) dos dateur pour le [[Photographie/Fabricants/Nikon/Nikon F3|Nikon F3]] Nikon AM-1.jpg|Cartouches Nikon AM-1 pour Nikon F2 Nikon LA-1 AC Power Unit.jpg|Nikon LA-1, alimentation pour les objectif Medical Nikkor Nikon GPS DSC7322EC.jpg|Nikon GPS GP-1 rote LED mk.jpg|Nikon GP-1 Nikon GPS GP-1 & D90 22.jpg Nikon GP-1.jpg GP-1 Ansicht 1 mk.jpg Wikimedia Sverige camera battery charger.jpg|Chargeur MH-25 Nikon Laddare bild 1.JPG|Chargeur MH-25 Nikon MH-18a battery charger.jpg|Chargeur MH-18a IMG.svg|batterie EN-EL15 Nikon EN-EL15.JPG Nikon AS-21 Blixtställ.JPG|Nikon AS-21 </gallery> {{Ph Fabricants}} mw4e3508q0a62wexposr3rtmzi6p660 Grec ancien/Dieux 0 29805 768165 767614 2026-06-19T07:10:43Z ~2026-34862-02 124042 L'époux de Rhéa est Cronos et non pas Chronos. 768165 wikitext text/x-wiki {{Grec ancien}} Il existe un très grand nombre de dieux grecs. ([[w:Généalogie de la mythologie grecque|les listes]] en font état de plus de 200) Ceux-ci sont tous classés selon leur famille : *Les Ancêtres (Chaos, Gaïa, Ouranos) *Descendants d'Ouranos et de Gaïa (Aphrodite, Molios, Théomisès) *Géants (Cerbère, Chimère, Sphinx, Orthos) *Descendance des Titans et des Titanides (Thémis, Pirène, Batia) *Descendants des monstres (Cyclope) *Descendants de Pontos (Amphitrite, Achille, Néréïdes) *Descendants d'Éros *Descendants d'Erèbe *Descendants de Nyx *Descendants de Tartare *Descendants de Python *Descendants d'Amythaon *Descendants d'Idmon *Descendants de Strophios *Descendants de Plégias *Nymphes ''Il existe de nombreuses sous-familles. En raison de leur nombre, nous n'en ferons pas état ici.'' == Les divinités Olympiennes == [[Fichier:Mytikas summit PJS.jpg|left|thumb|Le mont Olympe.]] [[Fichier:Sarcophagus Prometheus Louvre Ma339.jpg|thumb|center|370px|Le cortège des dieux de l'Olympe. Sarcophage romain, vers 240 ap. J.-C., Musée du Louvre, Paris, France.]] Les divinités Olympiennes, au nombre de 12, sont les dieux grecs qui vivent sur le mont Olympe. Ce nombre varie selon les siècles ; on y retrouve toujours Zeus, Héra, Poséidon, Arès, Hermès, Héphaïstos, Athéna, Apollon et Artémis qui sont complétés par Hestia, Déméter, Aphrodite, Dionysos et Hadès en fonction des époques. == Liste détaillée == ** [[/Aidos/]] ** [[/Aléthée/|Althée]] ** [[/Ananké/]] ** [[/Antéros/]] ** [[/Apaté/]] ** [[/Apollon/]] ** [[/Aphrodite/]] ** [[/Arès/]] ** [[/Arété/]] ** [[/Artémis/]] ** [[/Asclépios/]] ** [[/Até/]] ** [[/Athéna/]] ** [[/Cronos/]] ** [[/Coros/]] ** [[/Cybèle/]] ** [[/Déimos/]] ** [[/Déméter/]] ** [[/Dicé/]] ** [[/Dionysos/]] ** [[/Dolos/]] ** [[/Dysnomie/]] ** [[/Dyssebeia/]] ** [[/Dyssébie/]] ** [[/Eiréné/]] ** [[/Eunomie/]] ** [[/Eusébie/]] ** [[/Éléos/]] ** [[/Elpis/]] ** [[/Éole/]] ** [[/Éos/]] ** [[/Érèbe/]] ** [[/Éris/]] ** [[/Éros/]] ** [[/Ésa/]] ** [[/Gaïa/]] ** [[/Géras/]] ** [[/Harmonie/]] ** [[/Hadès/]] ** [[/Hébé/]] ** [[/Hédoné/]] ** [[/Hédylogos/]] ** [[/Héphaïstos/]] ** [[/Héra/]] ** [[/Hermès/]] ** [[/Hestia/]] ** [[/Himéros/]] ** [[/Horkos/]] ** [[/Hybris/]] ** [[/Hygie/]] ** [[/Hypnos/]] ** [[/Hébé/]] ** [[/Hécate/]] ** [[/Hélios/]] ** [[/Héméra/]] ** [[/Hypnos/]] ** [[/Ilithyie/]] ** [[/Limos/]] ** [[/Lyssa/]] ** [[/Mania/]] ** [[/Momos/]] ** [[/Moros/]] ** [[/Métis/]] ** [[/Némésis/]] ** [[/Niké/]] ** [[/Nyx/]] ** [[/Oizys/]] ** [[/Ouranos/]] ** [[/Panacée/]] ** [[/Pan/]] ** [[/Péitho/]] ** [[/Pénia/]] ** [[/Perséphone/]] ** [[/Philotès/]] ** [[/Phobos/]] ** [[/Pistis/]] ** [[/Poséidon/]] ** [[/Pothos/]] ** [[/Rhéa/]] ** [[/Séléné/]] ** [[/Sophrosyne/]] ** [[/Thanatos/]] ** [[/Thémis/]] ** [[/Tyché/]] ** [[/Zélos/]] ** [[/Zeus/]] ** [[/Épiphron/]] * [[../Texte : Odyssée|Texte : L'Odyssée, Livre 7]] * [[../Exercices chapitre 4|Exercices]] == Généalogie == {{Grec ancien/Arbre généalogique dieux}} == Questions == {{Avertissement exercice}} #Quelles divinités pouvez-vous reconnaître sur la fresque représentant le cortège des Dieux (§ « ''Les divinités Olymipiennes'' ») ? {{boîte déroulante|titre=afficher les réponses|contenu= On peut voir sur cette fresque (de gauche à droite) : *Athéna, *Hermès et son pétase ailé, *Poséidon, *Artémis. }} na0expi1417ymjb4zui02j071qkic5d 768166 768165 2026-06-19T07:14:01Z ~2026-34862-02 124042 768166 wikitext text/x-wiki {{Grec ancien}} Il existe un très grand nombre de dieux grecs. ([[w:Généalogie de la mythologie grecque|les listes]] en font état de plus de 200) Ceux-ci sont tous classés selon leur famille : *Les Ancêtres (Chaos, Gaïa, Ouranos) *Descendants d'Ouranos et de Gaïa (Aphrodite, Molios, Théomisès) *Géants (Cerbère, Chimère, Sphinx, Orthos) *Descendance des Titans et des Titanides (Thémis, Pirène, Batia) *Descendants des monstres (Cyclope) *Descendants de Pontos (Amphitrite, Achille, Néréïdes) *Descendants d'Éros *Descendants d'Erèbe *Descendants de Nyx *Descendants de Tartare *Descendants de Python *Descendants d'Amythaon *Descendants d'Idmon *Descendants de Strophios *Descendants de Plégias *Nymphes ''Il existe de nombreuses sous-familles. En raison de leur nombre, nous n'en ferons pas état ici.'' == Les divinités Olympiennes == [[Fichier:Mytikas summit PJS.jpg|left|thumb|Le mont Olympe.]] [[Fichier:Sarcophagus Prometheus Louvre Ma339.jpg|thumb|center|370px|Le cortège des dieux de l'Olympe. Sarcophage romain, vers 240 ap. J.-C., Musée du Louvre, Paris, France.]] Les divinités Olympiennes, au nombre de 12, sont les dieux grecs qui vivent sur le mont Olympe. Ce nombre varie selon les siècles ; on y retrouve toujours Zeus, Héra, Poséidon, Arès, Hermès, Héphaïstos, Athéna, Apollon et Artémis qui sont complétés par Hestia, Déméter, Aphrodite, Dionysos et Hadès en fonction des époques. == Liste détaillée == ** [[/Aidos/]] ** [[/Aléthée/|Althée]] ** [[/Ananké/]] ** [[/Antéros/]] ** [[/Apaté/]] ** [[/Apollon/]] ** [[/Aphrodite/]] ** [[/Arès/]] ** [[/Arété/]] ** [[/Artémis/]] ** [[/Asclépios/]] ** [[/Até/]] ** [[/Athéna/]] ** [[/Cronos/]] ** [[/Chronos/]] ** [[/Coros/]] ** [[/Cybèle/]] ** [[/Déimos/]] ** [[/Déméter/]] ** [[/Dicé/]] ** [[/Dionysos/]] ** [[/Dolos/]] ** [[/Dysnomie/]] ** [[/Dyssebeia/]] ** [[/Dyssébie/]] ** [[/Eiréné/]] ** [[/Eunomie/]] ** [[/Eusébie/]] ** [[/Éléos/]] ** [[/Elpis/]] ** [[/Éole/]] ** [[/Éos/]] ** [[/Érèbe/]] ** [[/Éris/]] ** [[/Éros/]] ** [[/Ésa/]] ** [[/Gaïa/]] ** [[/Géras/]] ** [[/Harmonie/]] ** [[/Hadès/]] ** [[/Hébé/]] ** [[/Hédoné/]] ** [[/Hédylogos/]] ** [[/Héphaïstos/]] ** [[/Héra/]] ** [[/Hermès/]] ** [[/Hestia/]] ** [[/Himéros/]] ** [[/Horkos/]] ** [[/Hybris/]] ** [[/Hygie/]] ** [[/Hypnos/]] ** [[/Hébé/]] ** [[/Hécate/]] ** [[/Hélios/]] ** [[/Héméra/]] ** [[/Hypnos/]] ** [[/Ilithyie/]] ** [[/Limos/]] ** [[/Lyssa/]] ** [[/Mania/]] ** [[/Momos/]] ** [[/Moros/]] ** [[/Métis/]] ** [[/Némésis/]] ** [[/Niké/]] ** [[/Nyx/]] ** [[/Oizys/]] ** [[/Ouranos/]] ** [[/Panacée/]] ** [[/Pan/]] ** [[/Péitho/]] ** [[/Pénia/]] ** [[/Perséphone/]] ** [[/Philotès/]] ** [[/Phobos/]] ** [[/Pistis/]] ** [[/Poséidon/]] ** [[/Pothos/]] ** [[/Rhéa/]] ** [[/Séléné/]] ** [[/Sophrosyne/]] ** [[/Thanatos/]] ** [[/Thémis/]] ** [[/Tyché/]] ** [[/Zélos/]] ** [[/Zeus/]] ** [[/Épiphron/]] * [[../Texte : Odyssée|Texte : L'Odyssée, Livre 7]] * [[../Exercices chapitre 4|Exercices]] == Généalogie == {{Grec ancien/Arbre généalogique dieux}} == Questions == {{Avertissement exercice}} #Quelles divinités pouvez-vous reconnaître sur la fresque représentant le cortège des Dieux (§ « ''Les divinités Olymipiennes'' ») ? {{boîte déroulante|titre=afficher les réponses|contenu= On peut voir sur cette fresque (de gauche à droite) : *Athéna, *Hermès et son pétase ailé, *Poséidon, *Artémis. }} n0gjtkg8795fc5ujf2fo56ajet6tq39 768170 768166 2026-06-19T07:34:49Z ~2026-34862-02 124042 /* Liste détaillée */ 768170 wikitext text/x-wiki {{Grec ancien}} Il existe un très grand nombre de dieux grecs. ([[w:Généalogie de la mythologie grecque|les listes]] en font état de plus de 200) Ceux-ci sont tous classés selon leur famille : *Les Ancêtres (Chaos, Gaïa, Ouranos) *Descendants d'Ouranos et de Gaïa (Aphrodite, Molios, Théomisès) *Géants (Cerbère, Chimère, Sphinx, Orthos) *Descendance des Titans et des Titanides (Thémis, Pirène, Batia) *Descendants des monstres (Cyclope) *Descendants de Pontos (Amphitrite, Achille, Néréïdes) *Descendants d'Éros *Descendants d'Erèbe *Descendants de Nyx *Descendants de Tartare *Descendants de Python *Descendants d'Amythaon *Descendants d'Idmon *Descendants de Strophios *Descendants de Plégias *Nymphes ''Il existe de nombreuses sous-familles. En raison de leur nombre, nous n'en ferons pas état ici.'' == Les divinités Olympiennes == [[Fichier:Mytikas summit PJS.jpg|left|thumb|Le mont Olympe.]] [[Fichier:Sarcophagus Prometheus Louvre Ma339.jpg|thumb|center|370px|Le cortège des dieux de l'Olympe. Sarcophage romain, vers 240 ap. J.-C., Musée du Louvre, Paris, France.]] Les divinités Olympiennes, au nombre de 12, sont les dieux grecs qui vivent sur le mont Olympe. Ce nombre varie selon les siècles ; on y retrouve toujours Zeus, Héra, Poséidon, Arès, Hermès, Héphaïstos, Athéna, Apollon et Artémis qui sont complétés par Hestia, Déméter, Aphrodite, Dionysos et Hadès en fonction des époques. == Liste détaillée == ** [[/Aidos/]] ** [[/Aléthée/|Althée]] ** [[/Ananké/]] ** [[/Antéros/]] ** [[/Apaté/]] ** [[/Apollon/]] ** [[/Aphrodite/]] ** [[/Arès/]] ** [[/Arété/]] ** [[/Artémis/]] ** [[/Asclépios/]] ** [[/Até/]] ** [[/Athéna/]] ** [[/Chronos/]] ** [[/Cronos/]] ** [[/Coros/]] ** [[/Cybèle/]] ** [[/Déimos/]] ** [[/Déméter/]] ** [[/Dicé/]] ** [[/Dionysos/]] ** [[/Dolos/]] ** [[/Dysnomie/]] ** [[/Dyssebeia/]] ** [[/Dyssébie/]] ** [[/Eiréné/]] ** [[/Eunomie/]] ** [[/Eusébie/]] ** [[/Éléos/]] ** [[/Elpis/]] ** [[/Éole/]] ** [[/Éos/]] ** [[/Érèbe/]] ** [[/Éris/]] ** [[/Éros/]] ** [[/Ésa/]] ** [[/Gaïa/]] ** [[/Géras/]] ** [[/Harmonie/]] ** [[/Hadès/]] ** [[/Hébé/]] ** [[/Hédoné/]] ** [[/Hédylogos/]] ** [[/Héphaïstos/]] ** [[/Héra/]] ** [[/Hermès/]] ** [[/Hestia/]] ** [[/Himéros/]] ** [[/Horkos/]] ** [[/Hybris/]] ** [[/Hygie/]] ** [[/Hypnos/]] ** [[/Hébé/]] ** [[/Hécate/]] ** [[/Hélios/]] ** [[/Héméra/]] ** [[/Hypnos/]] ** [[/Ilithyie/]] ** [[/Limos/]] ** [[/Lyssa/]] ** [[/Mania/]] ** [[/Momos/]] ** [[/Moros/]] ** [[/Métis/]] ** [[/Némésis/]] ** [[/Niké/]] ** [[/Nyx/]] ** [[/Oizys/]] ** [[/Ouranos/]] ** [[/Panacée/]] ** [[/Pan/]] ** [[/Péitho/]] ** [[/Pénia/]] ** [[/Perséphone/]] ** [[/Philotès/]] ** [[/Phobos/]] ** [[/Pistis/]] ** [[/Poséidon/]] ** [[/Pothos/]] ** [[/Rhéa/]] ** [[/Séléné/]] ** [[/Sophrosyne/]] ** [[/Thanatos/]] ** [[/Thémis/]] ** [[/Tyché/]] ** [[/Zélos/]] ** [[/Zeus/]] ** [[/Épiphron/]] * [[../Texte : Odyssée|Texte : L'Odyssée, Livre 7]] * [[../Exercices chapitre 4|Exercices]] == Généalogie == {{Grec ancien/Arbre généalogique dieux}} == Questions == {{Avertissement exercice}} #Quelles divinités pouvez-vous reconnaître sur la fresque représentant le cortège des Dieux (§ « ''Les divinités Olymipiennes'' ») ? {{boîte déroulante|titre=afficher les réponses|contenu= On peut voir sur cette fresque (de gauche à droite) : *Athéna, *Hermès et son pétase ailé, *Poséidon, *Artémis. }} c75it1aedntxr3mtjn1izbj0wmxqte4 Dictionnaire de philosophie 0 30495 768160 767404 2026-06-19T04:29:08Z PandaMystique 119061 768160 wikitext text/x-wiki {{Page de garde|image=Dictionnaire de philosophie.png|imagedesc=|titre=Index|description= <!-- Index alphabétique : tuiles inline-block, réagencement automatique --> <div style="text-align:center;"> [[Dictionnaire de philosophie/A|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">A</span>]] [[Dictionnaire de philosophie/B|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">B</span>]] [[Dictionnaire de philosophie/C|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">C</span>]] [[Dictionnaire de philosophie/D|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">D</span>]] [[Dictionnaire de philosophie/E|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">E</span>]] [[Dictionnaire de philosophie/F|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">F</span>]] [[Dictionnaire de philosophie/G|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">G</span>]] [[Dictionnaire de philosophie/H|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">H</span>]] [[Dictionnaire de philosophie/I|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">I</span>]] [[Dictionnaire de philosophie/J|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">J</span>]] [[Dictionnaire de philosophie/K|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">K</span>]] [[Dictionnaire de philosophie/L|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">L</span>]] [[Dictionnaire de philosophie/M|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">M</span>]] [[Dictionnaire de philosophie/N|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">N</span>]] [[Dictionnaire de philosophie/O|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">O</span>]] [[Dictionnaire de philosophie/P|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">P</span>]] [[Dictionnaire de philosophie/Q|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">Q</span>]] [[Dictionnaire de philosophie/R|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">R</span>]] [[Dictionnaire de philosophie/S|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">S</span>]] [[Dictionnaire de philosophie/T|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">T</span>]] [[Dictionnaire de philosophie/U|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">U</span>]] [[Dictionnaire de philosophie/V|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">V</span>]] [[Dictionnaire de philosophie/W|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">W</span>]] [[Dictionnaire de philosophie/X|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">X</span>]] [[Dictionnaire de philosophie/Y|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">Y</span>]] [[Dictionnaire de philosophie/Z|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">Z</span>]] </div> |avancement=Ébauche |cdu= * {{CDU item|1/10}} |versions= {{PhiloRecherche}} {{version imprimable}} }} <!-- ═══════════════════════════════════════════════════════════════════ ENTRÉES THÉMATIQUES ═══════════════════════════════════════════════════════════════════ --> <div style="margin: 30px 0 12px 0; padding-bottom: 6px; border-bottom: 2px solid #8b7355;"> <span style="font-size: 1.1em; font-weight: 700; color: #5a4a3a; letter-spacing: 0.02em;">ENTRÉES PAR THÈME</span> <span style="font-size: 0.85em; color: #999; margin-left: 12px;">Parcourir par domaine</span> </div> <table style="width:100%; border-collapse:separate; border-spacing:12px;"> <tr> <!-- MÉTAPHYSIQUE --> <td style="width:33%; vertical-align:top; position:relative; background:linear-gradient(180deg, #f3eef4, #e9e1ec); border:1px solid #8a6f96; border-radius:8px; padding:14px 16px; overflow:hidden;"> <div style="font-weight:600; font-size:1em; color:#473a52; margin-bottom:6px;">🔮 Métaphysique</div> <div style="font-size:0.85em; color:#555; line-height:1.6;">Être, substance, existence, essence, néant, possible, nécessaire…</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Dictionnaire de philosophie/Métaphysique|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;">&nbsp;</span>]]</div> </td> <!-- ÉPISTÉMOLOGIE --> <td style="width:33%; vertical-align:top; position:relative; background:linear-gradient(180deg, #eef2f7, #e2e9f1); border:1px solid #6a86a8; border-radius:8px; padding:14px 16px; overflow:hidden;"> <div style="font-weight:600; font-size:1em; color:#2c456b; margin-bottom:6px;">🔬 Épistémologie</div> <div style="font-size:0.85em; color:#555; line-height:1.6;">Connaissance, vérité, science, méthode, preuve, certitude…</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Dictionnaire de philosophie/Épistémologie|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;">&nbsp;</span>]]</div> </td> <!-- ÉTHIQUE --> <td style="width:33%; vertical-align:top; position:relative; background:linear-gradient(180deg, #f6f1e6, #ece3d0); border:1px solid #b39a5e; border-radius:8px; padding:14px 16px; overflow:hidden;"> <div style="font-weight:600; font-size:1em; color:#5f4a1c; margin-bottom:6px;">⚖️ Éthique</div> <div style="font-size:0.85em; color:#555; line-height:1.6;">Bien, mal, vertu, devoir, justice, bonheur, liberté…</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Dictionnaire de philosophie/Éthique|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;">&nbsp;</span>]]</div> </td> </tr> <tr> <!-- LOGIQUE --> <td style="width:33%; vertical-align:top; position:relative; background:linear-gradient(180deg, #f1f1f3, #e6e6ea); border:1px solid #8a8a94; border-radius:8px; padding:14px 16px; overflow:hidden;"> <div style="font-weight:600; font-size:1em; color:#3a3a46; margin-bottom:6px;">🧮 Logique</div> <div style="font-size:0.85em; color:#555; line-height:1.6;">Raisonnement, proposition, déduction, induction, syllogisme…</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Dictionnaire de philosophie/Logique|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;">&nbsp;</span>]]</div> </td> <!-- ESTHÉTIQUE --> <td style="width:33%; vertical-align:top; position:relative; background:linear-gradient(180deg, #f6efe8, #ecdfd2); border:1px solid #b8845c; border-radius:8px; padding:14px 16px; overflow:hidden;"> <div style="font-weight:600; font-size:1em; color:#6a4326; margin-bottom:6px;">🎨 Esthétique</div> <div style="font-size:0.85em; color:#555; line-height:1.6;">Beau, sublime, art, goût, imagination, création…</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Dictionnaire de philosophie/Esthétique|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;">&nbsp;</span>]]</div> </td> <!-- POLITIQUE --> <td style="width:33%; vertical-align:top; position:relative; background:linear-gradient(180deg, #eef3ea, #e2ebdc); border:1px solid #7d9a6c; border-radius:8px; padding:14px 16px; overflow:hidden;"> <div style="font-weight:600; font-size:1em; color:#3a5230; margin-bottom:6px;">🏛️ Politique</div> <div style="font-size:0.85em; color:#555; line-height:1.6;">État, pouvoir, droit, contrat, souveraineté, citoyenneté…</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Dictionnaire de philosophie/Politique|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;">&nbsp;</span>]]</div> </td> </tr> </table> <!-- ═══════════════════════════════════════════════════════════════════ RESSOURCES : Dernières mises à jour + Voir aussi (même ligne) ═══════════════════════════════════════════════════════════════════ --> <table style="width:100%; border-collapse:separate; border-spacing:12px; margin-top:18px;"> <tr> <td class="noprint" style="width:50%; vertical-align:top; background:linear-gradient(180deg, #f7f4ee, #efe9df); border:1px solid #d3c8b3; border-radius:8px; padding:0;"> <div style="background:linear-gradient(180deg, #4a4238, #38322a); padding:6px 15px; text-align:center; border-radius:8px 8px 0 0;"> <span style="font-size:0.9em; font-weight:600; color:#ffffff; letter-spacing:0.05em;">📝 Dernières mises à jour</span> </div> <div style="padding:12px 16px; font-size:0.92em; line-height:1.8; color:#444;"> <DynamicPageList> category = Dictionnaire de philosophie (livre) count = 5 order = lastedit </DynamicPageList> </div> </td> <td style="width:50%; vertical-align:top; background:linear-gradient(180deg, #f7f4ee, #efe9df); border:1px solid #d3c8b3; border-radius:8px; padding:0;"> <div style="background:linear-gradient(180deg, #4a4238, #38322a); padding:6px 15px; text-align:center; border-radius:8px 8px 0 0;"> <span style="font-size:0.9em; font-weight:600; color:#ffffff; letter-spacing:0.05em;">Voir aussi</span> </div> <div style="padding:12px 16px; font-size:0.92em; line-height:1.9; color:#444;"> → [[Philosophie|Portail Philosophie]]<br> → [[Manuel de terminale de philosophie|Manuel de Terminale]]<br> → [[Philosophie/Histoire de la philosophie|Histoire de la philosophie]]<br> → [[w:Portail:Philosophie|Wikipédia]]<br> → [https://github.com/PandaMystique/Dictionnaire Application libre sur GitHub] </div> </td> </tr> </table> {{CDU multiple| * {{CDU item|0|}} * {{CDU item|1|10}}}} [[Catégorie:Dictionnaire de philosophie (livre)]] [[Catégorie:Philosophie]] {{DEFAULTSORT:*}} [[Catégorie:Classe 1 - Philosophie et psychologie]] [[la:Lexicon philosophicum]] a94xa6fhhxw2pw6twmk80i2qqnk4isc Dictionnaire de philosophie/Agnosticisme 0 37439 768147 767672 2026-06-19T04:13:43Z PandaMystique 119061 Bot : ajout du paramètre lecture=oui au modèle {{DicoPhilo}} 768147 wikitext text/x-wiki {{DicoPhilo|Agnosticisme|lecture=oui}} L'agnosticisme désigne une position philosophique relative à la connaissance du divin qui affirme l'impossibilité, pour l'esprit humain, de déterminer avec certitude l'existence ou l'inexistence de Dieu ou des dieux. Cette position épistémologique se distingue à la fois du théisme, qui affirme l'existence de Dieu, et de l'athéisme, qui la nie. Au cœur de l'agnosticisme se trouve une interrogation fondamentale sur les limites de la connaissance humaine face aux questions métaphysiques ultimes. == Origines historiques et étymologie == Le terme « agnosticisme » est forgé en 1869 par le biologiste britannique Thomas Henry Huxley<ref>Thomas Henry Huxley, lettre du 23 septembre 1860 à Charles Kingsley, in Leonard Huxley, Life and Letters of Thomas Henry Huxley, vol. I, Londres, Macmillan, 1900, p. 217-219. Le terme « agnostic » lui-même apparaît pour la première fois dans l'essai « Agnosticism » (1889), in Collected Essays, vol. V, Londres, Macmillan, 1894, p. 209-262.</ref>, à partir du grec « a- » (privatif) et « gnôsis » (connaissance). Huxley cherchait à nommer sa position face aux débats religieux de son époque victorienne : ni croyant ni athée militant, il se disait incapable de connaître la vérité sur l'existence divine. Cette invention répondait à un besoin conceptuel précis : distinguer le scepticisme épistémologique de la négation dogmatique. Bien avant Huxley, la pensée agnostique a des racines anciennes. Dès l'Antiquité grecque, le sophiste Protagoras avait exprimé une position proto-agnostique dans son traité ''Sur les dieux''. Sa formule célèbre : « Pour ce qui est des dieux, je ne peux savoir ni qu'ils sont ni qu'ils ne sont pas, ni quel est leur aspect. Beaucoup de choses empêchent de le savoir : d'abord l'absence d'indications à ce propos, ensuite la brièveté de la vie humaine »<ref>Protagoras, fragment DK 80 B4 = Diels-Kranz, Die Fragmente der Vorsokratiker, 6e éd., Berlin, Weidmann, 1951-1952, vol. II, p. 265 ; trad. Jean-Paul Dumont, Les Présocratiques, Paris, Gallimard, coll. « Bibliothèque de la Pléiade », 1988, p. 991.</ref>. On y voit déjà les deux arguments majeurs de l'agnosticisme : absence de preuves empiriques et limitations cognitives humaines. == Les précurseurs philosophiques == === Le scepticisme pyrrhonien === Le scepticisme antique, notamment celui de Pyrrhon d'Élis (vers 360-275 avant J.-C.) et de Sextus Empiricus (IIe-IIIe siècles), préfigure l'agnosticisme par sa méthode de suspension du jugement (''épochè''). Pour les sceptiques pyrrhoniens, face à l'impossibilité de trancher entre des thèses opposées de poids égal, la seule attitude raisonnable consiste à suspendre son assentiment. Cette suspension ne vise pas seulement les questions théologiques, mais toute assertion sur « les choses obscures », c'est-à-dire ce qui échappe à l'expérience directe. ==== Pyrrhon et son héritage ==== Pyrrhon lui-même n'a rien écrit, mais nous connaissons sa pensée par son disciple Timon de Phlionte. Selon le témoignage d'Aristoclès de Messine transmis par Eusèbe de Césarée, celui qui veut être heureux doit considérer trois questions : quelle est la nature des choses, quelle disposition nous devons avoir envers elles, et ce qui résultera de cette disposition. À la première question, Pyrrhon répondait que les choses sont « également indifférentes, indéterminées et indécises », et que par conséquent nos sensations et nos opinions ne sont ni vraies ni fausses. Sur la disposition à adopter, il recommandait de ne se fier à rien, de rester sans opinions, sans inclinations, en s'appuyant sur la formule : « Nulle chose n'est plutôt qu'elle n'est pas ; elle est et elle n'est pas ; ni elle n'est ni elle n'est pas. » De cette disposition résulte d'abord ''l'aphasie'' (le silence), ensuite ''l'ataraxie'' (l'absence de trouble). ==== Sextus Empiricus et la systématisation ==== Sextus Empiricus, médecin et philosophe, fut le dernier grand représentant du scepticisme pyrrhonien. Son œuvre, notamment les ''Esquisses pyrrhoniennes'' (''Hypotyposes pyrrhoniennes'')<ref>Sextus Empiricus, Esquisses pyrrhoniennes, trad. Pierre Pellegrin, Paris, Seuil, coll. « Points Essais », 1997, 415 p.</ref> et ''Contre les mathématiciens'' (''Adversus mathematicos''), propose une systématisation complète de l'argumentation sceptique. Le sceptique pyrrhonien, selon Sextus, s'oppose tant aux dogmatiques qui prétendent avoir trouvé la vérité qu'aux académiciens qui affirment qu'elle est insaisissable. Le sceptique, lui, « continue la recherche », refusant de s'arrêter à une conclusion définitive. Cette attitude interrogative permanente anticipe la posture agnostique moderne. ==== La méthode sceptique : les tropes ==== Pour parvenir à la suspension du jugement (''épochè''), les sceptiques ont développé des procédés argumentatifs appelés ''tropes'' ou modes. Le scepticisme pyrrhonien utilise principalement trois séries de tropes : - Les dix tropes d'Énésidème : ils montrent comment toute assertion sur la nature des choses est relative aux circonstances. Ces dix modes sont fondés sur les différences entre les animaux, entre les hommes, entre nos sens, sur les circonstances, les distances et positions, les mélanges, la composition, la relation, la fréquence et la rareté, enfin les coutumes et les lois. - Les cinq tropes d'Agrippa : plus tardifs et plus abstraits, ils constituent une véritable « machine dialectique » contre toute prétention à la vérité absolue. Il s'agit de la ''régression à l'infini'' (toute démonstration repose sur des prémisses qui demandent elles-mêmes à être démontrées), du ''désaccord'' ou ''diaphonie'' (les opinions divergent sur toutes choses), de la ''relativité'' (tout apparaît différemment selon les circonstances), de ''l'hypothèse'' (poser quelque chose sans démonstration), et du ''diallèle'' ou ''cercle vicieux'' (prouver une chose par une autre qui a elle-même besoin d'être prouvée par la première). - Les deux tropes contre les causes : ils visent à montrer que toute explication causale repose sur des présupposés indémontrables<ref>Sextus Empiricus, Hypotyposes pyrrhoniennes, I, 164-169, trad. P. Pellegrin, Paris, Seuil, 1997, p. 130-135.</ref>. ==== Le but du scepticisme : l'ataraxie ==== Contrairement à ce que l'on pourrait croire, le scepticisme pyrrhonien n'est pas une philosophie du doute paralysant. Son but est pratique et thérapeutique : parvenir à la tranquillité de l'âme (''ataraxie'') par la suspension du jugement. Le sceptique observe que celui qui cherche obstinément la vérité sur les choses obscures se trouve dans un état de trouble permanent, écartelé entre des opinions contradictoires également convaincantes. En suspendant son jugement, le sceptique découvre, de manière quasi fortuite, la paix intérieure. Sextus Empiricus compare cet événement à l'anecdote du peintre Apelle qui, désespérant de représenter l'écume d'un cheval, jeta son éponge sur la toile et obtint ainsi par hasard l'effet recherché. De même, le sceptique, renonçant à trancher entre les opinions contradictoires, trouve la sérénité qu'il cherchait<ref>Sextus Empiricus, Esquisses pyrrhoniennes, I, 28-29, trad. P. Pellegrin, Paris, Seuil, 1997, p. 80-81.</ref>. ==== Scepticisme et vie pratique ==== Une objection courante contre le scepticisme est l'accusation dapraxie'' : comment peut-on agir si l'on suspend tout jugement ? Les sceptiques pyrrhoniens répondent en distinguant plusieurs niveaux. Dans la vie quotidienne, le sceptique se laisse guider par : - Les ''affections'' naturelles (faim, soif, sensations)<ref>Eusèbe de Césarée, Préparation évangélique, XIV, 18, 1-5, citant Aristoclès de Messine ; voir Jean-Paul Dumont, Les Sceptiques grecs, Paris, PUF, coll. « Quadrige », 2001, p. 50-53.</ref> - Les ''lois et coutumes'' de sa cité - Lenseignement des arts'' (techniques) - Lapparence'' (''phantasia'') des choses Le sceptique ne nie pas les ''phénomènes'' (ce qui apparaît), il suspend seulement son jugement sur les affirmations dogmatiques concernant la ''nature cachée'' des choses. Il peut donc vivre normalement, suivant les apparences sans affirmer qu'elles correspondent à une réalité absolue. ==== L'influence du scepticisme pyrrhonien sur l'agnosticisme ==== Le scepticisme pyrrhonien préfigure l'agnosticisme moderne sur plusieurs points essentiels : 1. La suspension du jugement : là où les pyrrhoniens suspendaient leur jugement sur toutes les questions obscures, les agnostiques suspendent spécifiquement leur jugement sur l'existence de Dieu. 2. L'absence de dogmatisme négatif : comme les pyrrhoniens refusaient d'affirmer que la vérité est introuvable (contrairement aux Académiciens), les agnostiques refusent généralement d'affirmer que Dieu n'existe pas (ce qui les distingue des athées). 3. L'argument de l'équipollence : les pyrrhoniens montraient que pour toute thèse, on peut trouver une thèse contraire d'égale force argumentative. De même, les agnostiques observent que les arguments pour et contre l'existence de Dieu semblent s'équilibrer. 4. La recherche de la tranquillité : si les pyrrhoniens cherchaient lataraxie'' par la suspension du jugement, certains agnostiques trouvent également une forme de paix intellectuelle dans le refus des certitudes dogmatiques en matière religieuse. Toutefois, il existe des différences notables. Les pyrrhoniens visaient une suspension généralisée du jugement, tandis que l'agnosticisme se limite généralement à la question de Dieu. De plus, la motivation n'est pas identique : les pyrrhoniens cherchaient avant tout la tranquillité d'esprit, tandis que l'agnosticisme moderne se fonde davantage sur une analyse épistémologique des limites de notre connaissance. En résumé, le scepticisme pyrrhonien offre à l'agnosticisme une méthode et un précédent historique : l'idée qu'il est possible, voire souhaitable, de suspendre son jugement sur des questions qui dépassent notre capacité de connaissance certaine, sans pour autant tomber dans un dogmatisme négatif qui affirmerait l'impossibilité absolue de connaître. === David Hume et la critique de la métaphysique === Le philosophe écossais David Hume (1711-1776) exerce une influence déterminante sur la pensée agnostique, bien qu'il n'ait jamais utilisé ce terme. Sa critique radicale de la métaphysique et de la théologie naturelle constitue l'un des fondements intellectuels de l'agnosticisme moderne. Hume soumet la religion à l'examen impitoyable de la raison empiriste et démontre l'impossibilité de fonder rationnellement la croyance en Dieu. ==== L'empirisme humien : impressions et idées ==== Le projet philosophique de Hume consiste à appliquer la méthode expérimentale de Newton à la science de la nature humaine. Dans son ''Traité de la nature humaine'' (1739-1740)<ref>David Hume, A Treatise of Human Nature, Londres, John Noon, 1739-1740 ; trad. Philippe Saltel, Traité de la nature humaine, Paris, Flammarion, coll. « GF », 1995, 2 vol.</ref>, Hume établit un principe épistémologique fondamental : toute connaissance dérive de l'expérience sensible. Hume distingue deux types de perceptions de l'esprit : les impressions (sensations, émotions, perceptions vives et immédiates) et les idées (copies affaiblies des impressions dans la pensée et la mémoire). Le principe de base de l'empirisme humien affirme que « toutes nos idées simples, à leur première apparition, dérivent d'impressions simples, qui leur correspondent et qu'elles représentent exactement »<ref>David Hume, Traité de la nature humaine, Livre I, partie I, section 1, « De l'origine de nos idées », trad. Ph. Saltel, Paris, Flammarion, 1995, vol. I, p. 79-82.</ref>. Cette thèse a une conséquence décisive pour la théologie : si toute idée doit provenir d'une impression sensible antérieure, d'où vient l'idée de Dieu ? Nous n'avons jamais eu d'impression directe de la divinité. L'idée de Dieu apparaît donc comme une construction intellectuelle complexe, formée par combinaison et amplification d'idées simples (intelligence, bonté, puissance) tirées de notre expérience humaine. Mais cette construction ne garantit en rien que son objet existe réellement dans la nature. ==== La critique de la causalité et du principe de raison suffisante ==== Hume s'attaque ensuite à la notion de causalité, pilier de toute démonstration métaphysique. Les preuves traditionnelles de l'existence de Dieu reposent sur le principe de raison suffisante : toute chose a une cause, donc le monde doit avoir une cause première, que nous appelons Dieu. Or, Hume démontre que la relation causale n'est pas un fait observable, mais une habitude mentale. Quand nous disons que A cause B, nous observons seulement trois choses : la contiguïté spatiale de A et B, leur succession temporelle (A précède B), et leur conjonction constante (chaque fois que A se produit, B suit). Mais nous n'observons jamais la « connexion nécessaire » elle-même. L'idée de causalité provient de l'habitude de l'esprit qui, après avoir observé la répétition régulière de la succession A-B, s'attend à ce que B suive A et interprète cette attente comme une nécessité objective.<ref>David Hume, Traité de la nature humaine, Livre I, partie III, sections 2-6 et 14, trad. Ph. Saltel, Paris, Flammarion, 1995, vol. I, p. 116-148 et 204-223 ; Enquête sur l'entendement humain, section VII, « De l'idée de connexion nécessaire », trad. A. Leroy, Paris, Flammarion, 1983, p. 109-134.</ref> Cette analyse ruine les fondements du principe de causalité appliqué à Dieu. Pourquoi le monde aurait-il besoin d'une cause ? Notre expérience de la causalité se limite aux objets observables dans le monde. Étendre ce principe à l'univers entier constitue un saut injustifiable. De plus, si tout a une cause, pourquoi Dieu ferait-il exception ? Et si Dieu peut exister sans cause, pourquoi pas l'univers lui-même ? ==== Les ''Dialogues sur la religion naturelle'' : l'impossibilité de connaître Dieu ==== L'œuvre posthume de Hume, les ''Dialogues sur la religion naturelle'' (1779)<ref>David Hume, Dialogues Concerning Natural Religion, Londres, posthume, 1779 ; trad. Michel Malherbe, Dialogues sur la religion naturelle, Paris, Vrin, coll. « Bibliothèque des textes philosophiques », 1997, 262 p.</ref>, constitue son testament philosophique en matière religieuse. Dans cette œuvre dialoguée inspirée du ''De Natura Deorum'' de Cicéron, trois personnages débattent de l'existence et de la nature de Dieu : - Déméa représente l'orthodoxie religieuse et la théologie négative : Dieu existe, mais sa nature dépasse infiniment l'entendement humain. Il convient de l'adorer dans le silence du mystère. - Cléanthe défend la théologie naturelle et la preuve physico-théologique (ou téléologique) : l'ordre et la finalité observables dans la nature attestent l'existence d'un Dieu intelligent et provident, à la manière dont une montre suppose un horloger. - Philon incarne le scepticisme humien : il soumet les arguments de Cléanthe à une critique dévastatrice, tout en maintenant une position ambiguë qui laisse planer le doute sur ses véritables convictions. La plupart des commentateurs s'accordent aujourd'hui pour identifier Hume au personnage de Philon, dont le scepticisme épistémologique préfigure directement l'agnosticisme moderne. ==== La critique de la preuve téléologique ==== Cléanthe présente l'argument du dessein intelligent (''design argument'') : de même que l'ordre d'une maison ou d'une machine suppose un architecte ou un ingénieur, l'ordre admirable de l'univers (la structure des organismes vivants, les mouvements réguliers des astres) implique nécessairement un créateur intelligent. Philon multiplie les objections dévastatrices : 1. L'analogie est faible : l'univers ressemble peu à une machine. Il ressemble davantage à un organisme vivant. Pourquoi ne pas en conclure qu'il est né et croît par génération, comme les plantes et les animaux ? L'hypothèse d'un univers engendré par un dieu végétal serait alors aussi légitime que celle d'un dieu architecte. 2. Le polythéisme serait plus cohérent : si l'on raisonne par analogie avec les productions humaines, on devrait conclure à l'existence de plusieurs dieux, puisque nos maisons et nos navires sont construits par de nombreux artisans coopérant. 3. Dieu serait imparfait : tout ouvrage révèle la compétence de son créateur. Or, l'univers est imparfait : il contient le mal, la souffrance, le désordre. Si l'on raisonne strictement d'après les effets observés, on ne peut conclure qu'à un dieu limité, apprenti maladroit ou vieillard sénile ayant abandonné son œuvre après l'avoir ratée. 4. L'expérience unique ne permet aucune inférence : toute inférence causale repose sur l'observation répétée de conjonctions régulières. Mais l'univers est unique ; nous n'avons jamais observé la création d'un monde. Comment alors inférer de l'effet (le monde) à sa cause (un créateur) ? 5. Le principe d'économie ontologique : pourquoi supposer une cause extérieure au monde ? Le principe d'ordre pourrait être immanent à la matière elle-même. Poser un dieu transcendant multiplie les entités sans nécessité. ==== Le problème du mal ==== Dans les parties X et XI des ''Dialogues'', Hume aborde le problème de la théodicée : comment concilier l'existence du mal avec celle d'un Dieu tout-puissant et infiniment bon ? Philon formule le dilemme classique : « Les maux que nous voyons dans le monde sont-ils compatibles avec une bonté infinie ? Sont-ils compatibles avec une puissance infinie ? Ne montrent-ils pas plutôt l'incompétence ou la malveillance du créateur ? » Si Dieu est tout-puissant et parfaitement bon, le mal ne devrait pas exister. S'il existe, c'est que Dieu est soit impuissant (il voudrait supprimer le mal mais ne le peut pas), soit malveillant (il pourrait supprimer le mal mais ne le veut pas), soit inexistant. Aucune théodicée ne résout ce problème de manière satisfaisante. L'observation impartiale du monde ne permet donc pas de conclure à l'existence d'un Dieu infiniment bon et puissant. Au mieux, elle suggère une divinité aux capacités et aux intentions limitées. ==== La critique des miracles ==== Dans lEnquête sur l'entendement humain'' (1748), section X<ref>David Hume, An Enquiry Concerning Human Understanding, Londres, A. Millar, 1748 ; trad. André Leroy, Enquête sur l'entendement humain, Paris, Flammarion, coll. « GF », 1983, section X « Des miracles », p. 163-193.</ref>, Hume formule une critique décisive des miracles qui sape les fondements de la foi révélée. Un miracle est défini comme « une violation des lois de la nature ». Or, notre croyance aux lois de la nature repose sur l'expérience uniforme et répétée : l'eau bout à cent degrés, les corps lourds tombent, les morts ne ressuscitent pas. Lorsqu'un témoignage nous rapporte un miracle, deux expériences s'affrontent : 1. L'expérience uniforme de l'ordre naturel, qui rend le miracle extrêmement improbable. 2. L'expérience de la fiabilité des témoins humains, qui nous incline à les croire. Hume énonce alors sa maxime célèbre : « Aucun témoignage n'est suffisant pour établir un miracle à moins que le témoignage soit d'un genre tel que sa fausseté serait plus miraculeuse que le fait qu'il veut établir. » En d'autres termes, le principe de parcimonie rationnelle commande de préférer l'explication la plus probable. Qu'est-ce qui est le plus vraisemblable : qu'un mort soit réellement ressuscité, ou que le témoin se trompe, exagère, ou mente ? L'erreur ou le mensonge étant des phénomènes courants, attestés par une expérience abondante, tandis que les violations des lois naturelles ne le sont pas, la raison commande de rejeter le témoignage miraculeux. Hume ajoute des considérations psychologiques et sociologiques : les témoignages de miracles proviennent généralement de peuples ignorants et barbares, à des époques reculées ; ils servent des intérêts religieux ou politiques ; ils se contredisent d'une religion à l'autre. Tous ces facteurs diminuent encore leur crédibilité. ==== Conséquences pour l'agnosticisme ==== La philosophie religieuse de Hume aboutit à un constat agnostique : 1. L'idée de Dieu n'a pas de fondement empirique solide : elle ne dérive d'aucune impression directe et apparaît comme une construction mentale dont la validité objective est douteuse. 2. Les preuves rationnelles de l'existence de Dieu sont invalides : ni l'argument cosmologique (fondé sur la causalité), ni l'argument téléologique (fondé sur l'ordre du monde) ne résistent à l'examen critique. 3. L'expérience du monde ne confirme pas l'hypothèse théiste : l'existence du mal, l'imperfection de la création suggèrent au mieux un dieu limité, au pire l'absence de toute providence. 4. Les miracles ne peuvent fonder rationnellement la foi : les témoignages surnaturels sont toujours moins crédibles que les lois naturelles qu'ils prétendent violer. Hume ne nie pas catégoriquement l'existence de Dieu. À la fin des ''Dialogues'', Philon admet que « les causes ou les causes de l'ordre dans l'univers portent probablement quelque analogie lointaine avec l'intelligence humaine ». Mais cette concession minimale, qui ressemble davantage à une précaution rhétorique qu'à une conviction sincère, ne change rien au fond : nous ne pouvons ''connaître'' Dieu, nous ne pouvons prouver rationnellement son existence ni déterminer sa nature. Cette position sceptique, qui suspend le jugement sur les questions théologiques faute de preuves suffisantes, constitue précisément ce que le XIXe siècle nommera « agnosticisme ». En ce sens, David Hume peut être considéré comme le premier grand philosophe agnostique de la modernité, même s'il n'emploie pas encore le terme. ==== La religion comme phénomène naturel ==== Dans son ''Histoire naturelle de la religion'' (1757)<ref>David Hume, The Natural History of Religion, Londres, A. Millar, 1757 ; trad. Michel Malherbe, Histoire naturelle de la religion, Paris, Vrin, coll. « Bibliothèque des textes philosophiques », 1980, 158 p.</ref>, Hume complète sa critique par une explication génétique de la croyance religieuse. Plutôt que de chercher des preuves rationnelles de l'existence de Dieu, il examine les causes psychologiques et sociales qui ont produit les religions dans l'histoire humaine. Selon Hume, les religions ne naissent pas de la contemplation rationnelle de l'ordre cosmique, mais de la peur et de l'espoir face aux événements imprévisibles de la vie. Les hommes primitifs, ignorants des causes naturelles, attribuent les phénomènes incompréhensibles (orage, maladie, guerre) à des agents invisibles dotés d'intentions. Le polythéisme primitif cède progressivement la place au monothéisme, non par progrès rationnel, mais par concentration progressive du pouvoir divin. Cette naturalisation de la religion délégitime les prétentions de la théologie rationnelle : si la croyance religieuse s'explique entièrement par des causes psychologiques et historiques, elle ne requiert aucune référence à une transcendance réelle. La religion est un phénomène humain, trop humain, qui révèle davantage la nature de l'esprit humain que la nature de Dieu. === Emmanuel Kant et les limites de la raison === La philosophie critique d'Emmanuel Kant (1724-1804) représente une étape décisive dans la genèse conceptuelle de l'agnosticisme. Dans la ''Critique de la raison pure'' (1781, seconde édition 1787)<ref>Emmanuel Kant, Kritik der reinen Vernunft, Riga, Johann Friedrich Hartknoch, 1re éd. 1781 (A), 2e éd. 1787 (B) ; trad. Alain Renaut, Critique de la raison pure, Paris, Aubier, coll. « Bibliothèque philosophique », 1997, 749 p. ; trad. A. Tremesaygues et B. Pacaud, Paris, PUF, coll. « Quadrige », 1944, réimpr. 2012.</ref>, Kant entreprend une analyse systématique des pouvoirs et des limites de la raison humaine. Son projet consiste à déterminer avec précision ce que nous pouvons connaître et ce qui échappe définitivement à notre connaissance. Cette « critique » (du grec ''krinein'' : séparer, distinguer) établit les frontières légitimes de la science et révèle l'impossibilité de toute métaphysique spéculative, y compris la théologie rationnelle. ==== La révolution copernicienne en philosophie ==== Kant opère ce qu'il nomme lui-même une « révolution copernicienne » dans la théorie de la connaissance. Traditionnellement, on pensait que notre connaissance devait se conformer aux objets. Kant renverse cette perspective : ce sont les objets qui doivent se conformer à notre mode de connaissance. Notre esprit n'est pas une cire molle recevant passivement les impressions du monde extérieur ; il impose activement ses propres formes ''a priori'' (antérieures à l'expérience) à tout ce qu'il connaît. Cette révolution a des conséquences immédiates pour la théologie. Si nous ne connaissons les objets que tels qu'ils nous apparaissent, structurés par les formes de notre sensibilité (espace et temps) et de notre entendement (catégories), alors nous ne pouvons jamais atteindre les choses « en soi », indépendamment de notre mode de représentation. Or, Dieu, s'il existe, appartient précisément à ce domaine des choses en soi, hors de portée de notre connaissance possible. ==== Phénomènes et noumènes : la distinction fondamentale ==== Au cœur de la philosophie kantienne se trouve la distinction entre phénomènes et noumènes. Les phénomènes désignent les choses telles qu'elles nous apparaissent, structurées par les formes ''a priori'' de notre sensibilité (l'espace et le temps) et organisées par les catégories de notre entendement (substance, causalité, unité, pluralité, etc.). Les phénomènes constituent le domaine légitime de notre connaissance scientifique.<ref>Emmanuel Kant, Critique de la raison pure, « Analytique transcendantale », Livre II, chap. III, « Du principe de la distinction de tous les objets en général en phénomènes et en noumènes », trad. A. Tremesaygues et B. Pacaud, Paris, PUF, 1944, p. 225-259.</ref> Les noumènes, ou « choses en soi » (''Ding an sich''), désignent ce qui existe indépendamment de notre perception et de nos structures cognitives. Pour Kant, le noumène est un « concept limitatif » à valeur purement négative : il marque la frontière de notre connaissance possible sans nous donner accès à ce qui se trouve au-delà. Nous pouvons ''penser'' le noumène, mais nous ne pouvons le ''connaître'', car toute connaissance requiert que l'objet soit donné dans l'intuition sensible et subsumé sous les catégories de l'entendement. Cette distinction ruine les prétentions de la métaphysique traditionnelle. Dieu, l'âme immortelle, la liberté absolue sont des idées qui prétendent se rapporter à des réalités nouménales. Mais aucune intuition sensible ne nous donne accès à ces objets, et nos catégories (qui ne s'appliquent légitimement qu'aux phénomènes) ne peuvent s'étendre jusqu'à eux. La théologie rationnelle repose donc sur une extension illégitime de notre pouvoir de connaître au-delà des limites de l'expérience possible. ==== La réfutation des preuves de l'existence de Dieu ==== Dans la section de la ''Critique de la raison pure'' intitulée « Dialectique transcendantale », Kant soumet à un examen critique les trois preuves traditionnelles de l'existence de Dieu : la preuve ontologique, la preuve cosmologique et la preuve physico-théologique (ou téléologique). La preuve ontologique prétend déduire l'existence de Dieu de son seul concept. Elle remonte à Anselme de Cantorbéry et a été reformulée par Descartes : Dieu est l'être absolument parfait ; or l'existence est une perfection ; donc Dieu existe nécessairement. Kant démontre que cet argument repose sur une confusion fondamentale : l'existence n'est pas un prédicat réel, c'est-à-dire une propriété qui s'ajoute au concept d'une chose. Kant illustre cette critique par un exemple célèbre : « Cent thalers réels ne contiennent rien de plus que cent thalers possibles. » Le concept de cent thalers possibles contient exactement les mêmes déterminations que celui de cent thalers réels. La différence entre les deux ne réside pas dans le concept, mais dans le fait que les uns existent et les autres non. L'existence n'ajoute rien au contenu conceptuel ; elle pose simplement l'objet comme réel. On ne peut donc pas déduire l'existence d'un être de son seul concept, fût-il celui de l'être le plus parfait<ref>Emmanuel Kant, Critique de la raison pure, « Dialectique transcendantale », Livre II, chap. III, section IV, « De l'impossibilité d'une preuve ontologique de l'existence de Dieu », trad. A. Tremesaygues et B. Pacaud, Paris, PUF, 1944, p. 429-434 (A592-602/B620-630).</ref>. La preuve cosmologique (ou preuve par la contingence) argumente ainsi : tout ce qui existe de manière contingente (qui aurait pu ne pas exister) requiert une cause ; or le monde existe de manière contingente ; il faut donc une cause première, nécessaire et existant par elle-même, que nous appelons Dieu. Kant montre que cette preuve repose en réalité sur la preuve ontologique. En effet, comment savons-nous que la cause première doit être Dieu (être parfait) plutôt qu'une simple nécessité aveugle ? Uniquement parce qu'on suppose qu'un être nécessaire doit posséder toutes les perfections, c'est-à-dire qu'on réintroduit subrepticement l'argument ontologique. De plus, la preuve cosmologique applique la catégorie de causalité au-delà de son domaine légitime d'application. La causalité est une catégorie de l'entendement qui ne s'applique légitimement qu'aux phénomènes, dans le cadre de l'expérience possible. L'étendre à la totalité du monde (qui n'est pas un objet d'expérience possible) ou à un être transcendant constitue un usage illégitime. La preuve physico-théologique part de l'ordre, de la beauté et de la finalité observables dans la nature pour conclure à l'existence d'un créateur intelligent. Kant reconnaît que cet argument est « le plus ancien, le plus clair et le plus conforme à la raison humaine commune ». Pourtant, il souffre de failles décisives. D'abord, il prouve au mieux l'existence d'un architecte du monde, travaillant sur une matière préexistante, mais non d'un créateur omnipotent créant la matière elle-même ''ex nihilo''. Ensuite, cet architecte serait limité par les imperfections observables dans son œuvre. Enfin, pour passer de cet architecte limité au Dieu parfait de la théologie, on doit à nouveau recourir à la preuve ontologique. Ainsi, les trois preuves s'effondrent. Kant conclut que « l'existence de Dieu ne peut être démontrée par aucune voie spéculative de la raison ». ==== Les antinomies de la raison pure ==== Kant ne se contente pas de réfuter les preuves de l'existence de Dieu. Il montre que lorsque la raison s'aventure au-delà des limites de l'expérience possible, elle tombe inévitablement dans des contradictions insolubles, qu'il nomme les antinomies de la raison pure. Une antinomie oppose une thèse et une antithèse également démontrables, créant un conflit de la raison avec elle-même. Kant présente quatre antinomies, dont voici les deux premières : Première antinomie (sur la finitude du monde) : - Thèse : Le monde a un commencement dans le temps et est limité dans l'espace. - Antithèse : Le monde n'a ni commencement temporel ni limite spatiale ; il est infini. Deuxième antinomie (sur la simplicité) : - Thèse : Toute substance composée est constituée de parties simples (atomes indivisibles). - Antithèse : Rien de composé n'est constitué de parties simples ; il n'existe nulle part rien de simple. Pour chacune de ces antinomies, Kant démontre que la thèse et l'antithèse sont également soutenables si l'on admet que le monde est une chose en soi connaissable. Mais précisément parce qu'elles conduisent à des contradictions, ces antinomies prouvent ''par l'absurde'' que le monde n'est pas une chose en soi, mais seulement un phénomène, c'est-à-dire une représentation structurée par nos formes ''a priori''. La solution kantienne consiste à montrer que la thèse et l'antithèse sont toutes deux fausses si l'on prétend connaître le monde en soi, mais qu'elles peuvent être réconciliées si l'on distingue le point de vue phénoménal (où s'applique l'antithèse empiriste) et le point de vue nouménal (inaccessible à la connaissance, où pourrait se situer la thèse métaphysique). Ces antinomies illustrent le destin tragique de la raison lorsqu'elle prétend dépasser l'expérience : elle s'égare dans des contradictions qui révèlent son impuissance à connaître l'absolu.<ref>Emmanuel Kant, Critique de la raison pure, « Dialectique transcendantale », Livre II, chap. II, « L'antinomie de la raison pure », sections I-IX, trad. A. Renaut, Paris, Aubier, 1997, p. 555-625.</ref> ==== Les idées transcendantales : Dieu, l'âme, le monde ==== La raison humaine produit spontanément trois idées transcendantales qui prétendent unifier l'ensemble de nos connaissances : l'idée de l'âme (unité absolue du sujet pensant), l'idée du monde (unité absolue de la série des conditions des phénomènes) et l'idée de Dieu (unité absolue de la condition de tous les objets de la pensée en général). Ces idées ont une fonction régulatrice légitime : elles orientent la recherche scientifique vers une unification toujours plus grande des connaissances. Mais elles deviennent illusoires lorsqu'on leur attribue une valeur constitutive, c'est-à-dire lorsqu'on prétend qu'elles correspondent à des objets réels connaissables. L'idée de Dieu, en particulier, ne nous donne aucune connaissance d'un être divin existant réellement ; elle représente seulement un idéal de la raison, un principe d'unification systématique de nos connaissances. Kant appelle « idéal transcendantal » cette idée de Dieu conçue comme ''ens realissimum'' (l'être le plus réel), principe de toute réalité. Mais cet idéal, bien qu'utile pour penser l'unité systématique de nos connaissances, ne prouve en rien l'existence objective de Dieu. Confondre une idée régulatrice avec un objet constitutif de connaissance, c'est tomber dans l'« illusion transcendantale », source de toutes les erreurs de la métaphysique dogmatique. ==== L'agnosticisme théorique et le primat de la raison pratique ==== La conclusion de la ''Critique de la raison pure'' est claire : Dieu, en tant qu'être transcendant, échappe définitivement au domaine de la connaissance théorique. Nous ne pouvons ni prouver ni réfuter son existence par la raison spéculative. Cette position est exactement celle que le XIXe siècle nommera « agnosticisme » : la suspension du jugement sur l'existence de Dieu fondée sur l'impossibilité de principe d'une connaissance métaphysique. Kant lui-même résume sa position dans une formule célèbre : « J'ai dû abolir le savoir pour faire place à la foi. » Cette formule ne signifie pas qu'il faut renoncer à toute rationalité en matière religieuse, mais qu'il faut distinguer rigoureusement deux domaines : celui de la connaissance théorique (où Dieu est inconnaissable) et celui de la raison pratique (où Dieu devient un postulat nécessaire). Dans la ''Critique de la raison pratique'' (1788)<ref>Emmanuel Kant, Kritik der praktischen Vernunft, Riga, Johann Friedrich Hartknoch, 1788 ; trad. Jean-Pierre Fussler, Critique de la raison pratique, Paris, Flammarion, coll. « GF », 2003, 286 p.</ref>, Kant réintroduit Dieu, non plus comme objet de connaissance, mais comme postulat de la raison pratique. Un postulat n'est pas une vérité démontrable, mais une hypothèse nécessaire pour donner sens à notre vie morale. La loi morale commande inconditionnellement : « Tu dois. » Or, ce commandement implique que la vertu doit conduire au bonheur (ce que Kant nomme le « souverain bien »). Mais dans le monde sensible, vertu et bonheur ne coïncident pas toujours. Il faut donc postuler l'existence de Dieu comme garant de l'harmonie finale entre vertu et bonheur, et l'immortalité de l'âme pour permettre le progrès moral infini. Ces postulats ne constituent pas une connaissance. Ils relèvent de la foi rationnelle (''Vernunftglaube''), c'est-à-dire d'une croyance fondée en raison, mais non démontrable théoriquement. Kant distingue trois modalités de l'assentiment : le savoir (connaissance théorique justifiée), la croyance (''Glauben'') et l'opinion. Concernant Dieu, nous ne pouvons avoir ni savoir ni simple opinion ; nous avons une croyance pratique rationnellement fondée. ==== La religion dans les limites de la simple raison ==== Dans ''La Religion dans les limites de la simple raison'' (1793)<ref>Emmanuel Kant, Die Religion innerhalb der Grenzen der bloßen Vernunft, Königsberg, Friedrich Nicolovius, 1793 ; trad. Jean Gibelin, La Religion dans les limites de la simple raison, Paris, Vrin, coll. « Bibliothèque des textes philosophiques », 1943, réimpr. 2018, 288 p.</ref>, Kant développe sa conception d'une religion morale épurée de tout élément dogmatique ou superstitieux. La religion authentique ne repose pas sur la connaissance théorique de Dieu, mais sur la reconnaissance de nos devoirs moraux comme commandements divins. L'essence de la religion consiste à « considérer tous nos devoirs comme des commandements divins ». Cette conception religieuse est compatible avec l'agnosticisme théorique. Nous ne connaissons pas Dieu, nous ne savons pas s'il existe ni quelle est sa nature, mais nous pouvons néanmoins orienter notre vie morale ''comme si'' nos devoirs émanaient d'une volonté divine. Le « comme si » (''als ob'') kantien permet de maintenir une attitude religieuse sans prétendre à une connaissance métaphysique impossible. Kant critique sévèrement les « religions statutaires » fondées sur des révélations particulières, des dogmes arbitraires et des pratiques rituelles. Ces religions historiques peuvent certes servir de « véhicule » à la religion morale rationnelle, mais elles ne constituent pas l'essence de la religiosité authentique. La véritable religion est universelle et rationnelle ; elle ne dépend d'aucune révélation historique particulière. ==== Les limites de la critique kantienne ==== Plusieurs objections ont été adressées à la philosophie religieuse de Kant. D'abord, la distinction entre phénomènes et noumènes pose problème : si la chose en soi est absolument inconnaissable, comment pouvons-nous même affirmer son existence ? Comment savons-nous qu'il y a quelque chose au-delà des phénomènes ? Les post-kantiens (Fichte, Hegel) reprochent à Kant d'avoir laissé subsister un résidu de « réalisme dogmatique » avec son noumène. Ensuite, la solution pratique que Kant propose (les postulats de la raison pratique) peut sembler insatisfaisante. N'est-ce pas une manière détournée de réintroduire ce que la critique théorique a exclu ? Si Dieu n'est qu'un postulat pratique, n'est-il pas réduit à une fiction utile, vidée de toute réalité objective ? La distinction entre « croyance pratique » et « connaissance théorique » paraît trop subtile pour être convaincante. Enfin, certains critiquent le rigorisme moral kantien qui semble faire de Dieu un simple auxiliaire de la morale. La religion ne se réduit-elle pas ainsi à la moralité ? N'y a-t-il pas dans l'expérience religieuse authentique (le sentiment du sacré, l'expérience mystique, la prière) des dimensions irréductibles à la raison pratique ? ==== L'héritage kantien pour l'agnosticisme ==== Malgré ces objections, l'apport de Kant à la pensée agnostique est considérable. Il a démontré de manière rigoureuse et systématique que : 1. La connaissance humaine est structurellement limitée : nous ne connaissons que les phénomènes, jamais les choses en soi. Dieu, s'il existe, appartient à l'ordre nouménal inaccessible. 2. Les preuves rationnelles de l'existence de Dieu sont invalides : la critique kantienne des trois preuves classiques n'a jamais été véritablement réfutée. 3. La métaphysique dogmatique est impossible : toute prétention à connaître l'absolu conduit à des antinomies insolubles. 4. L'agnosticisme théorique n'exclut pas une attitude pratique : on peut suspendre son jugement sur l'existence de Dieu tout en vivant ''comme si'' certaines vérités religieuses étaient fondées. L'idéalisme transcendantal kantien a parfois été qualifié d'« idéalisme agnosticiste », précisément parce qu'il affirme l'inconnaissabilité de la réalité en soi. Thomas Henry Huxley, lorsqu'il forgera le terme « agnosticisme » en 1869, se référera explicitement à la tradition kantienne. Le philosophe néo-kantien Friedrich Albert Lange (1828-1875) développera même un « matérialisme agnostique » qui combine l'empirisme scientifique avec l'agnosticisme kantien concernant les questions métaphysiques ultimes. En ce sens, Kant peut être considéré comme le philosophe qui a donné ses lettres de noblesse à l'agnosticisme, en montrant qu'il ne s'agit pas d'une simple position de facilité ou d'indifférence, mais de la conclusion rigoureuse d'une analyse critique des pouvoirs et des limites de la raison humaine. == Les arguments fondamentaux de l'agnosticisme == === L'argument épistémologique : les limites de la connaissance === L'argument central de l'agnosticisme repose sur une analyse rigoureuse des conditions de possibilité de la connaissance humaine. Cette analyse épistémologique constitue le fondement philosophique le plus solide de la position agnostique : elle ne se contente pas d'affirmer que nous ne savons pas si Dieu existe, mais démontre pourquoi, structurellement, nous ne pouvons pas le savoir. Cette argumentation a été développée sous différentes formes par les grandes traditions philosophiques, de l'empirisme à l'idéalisme transcendantal, en passant par le positivisme. ==== Les conditions de possibilité de la connaissance ==== Toute théorie de la connaissance doit répondre à une question fondamentale : à quelles conditions un énoncé peut-il être considéré comme une connaissance authentique plutôt qu'une simple opinion, une croyance arbitraire ou une illusion ? La tradition philosophique moderne, depuis Descartes et Locke, a établi plusieurs critères qui définissent ce qu'est une véritable connaissance. Premièrement, une connaissance doit porter sur un objet déterminé, c'est-à-dire quelque chose qui peut être identifié, distingué d'autres objets, et possédant des propriétés définies. Deuxièmement, cet objet doit être accessible à l'expérience, directement (par les sens) ou indirectement (par ses effets observables). Troisièmement, les affirmations concernant cet objet doivent être justifiables, c'est-à-dire susceptibles d'être vérifiées, confirmées ou réfutées par des procédures publiques et reproductibles. Or, Dieu, tel que le conçoivent les religions monothéistes, ne satisfait aucun de ces critères. Défini comme un être transcendant – c'est-à-dire situé au-delà du monde sensible, hors de l'espace et du temps – il échappe par essence à toute expérience possible. Nous ne pouvons le voir, le toucher, l'entendre. Nous ne pouvons mesurer ses effets de manière non ambiguë, car tout événement dans le monde admet en principe une explication naturelle. L'hypothèse divine n'est ni vérifiable ni réfutable empiriquement : aucune observation concevable ne pourrait trancher définitivement la question de son existence. ==== La critique empiriste : l'origine des idées ==== L'empirisme, courant philosophique inauguré par John Locke (1632-1704) et radicalisé par David Hume (1711-1776), soutient que toute connaissance dérive de l'expérience sensible. Locke rejette la théorie cartésienne des idées innées et affirme que l'esprit à la naissance est une « table rase » (''tabula rasa'') sur laquelle l'expérience inscrit progressivement ses contenus. Pour Locke, toutes nos idées proviennent soit de la sensation (expérience externe des qualités des objets), soit de la réflexion (expérience interne de nos propres opérations mentales). Hume radicalise cette thèse empiriste en distinguant rigoureusement les impressions (perceptions vives et immédiates) et les idées (copies affaiblies des impressions dans la pensée). Son principe fondamental énonce que « toutes nos idées simples, à leur première apparition, dérivent d'impressions simples qui leur correspondent ». Si une prétendue idée ne peut être ramenée à aucune impression antérieure, elle est vide, dénuée de contenu cognitif réel. Appliqué à l'idée de Dieu, ce principe a des conséquences décisives. D'où provient notre idée de Dieu ? Nous n'avons jamais eu d'impression directe de la divinité. Personne n'a vu Dieu, n'a perçu sa présence par les sens. L'idée de Dieu apparaît donc comme une construction mentale complexe, formée par combinaison et amplification d'idées simples tirées de notre expérience humaine : nous prenons les notions d'intelligence, de puissance et de bonté, que nous connaissons à l'échelle humaine, et nous les portons à l'infini. Mais cette opération mentale ne garantit en rien que l'objet ainsi construit existe réellement dans la nature. Hume compare cette construction à celle d'une « montagne d'or » : nous pouvons former l'idée d'une montagne d'or en combinant deux idées simples (montagne et or), mais cela ne prouve nullement l'existence d'une telle montagne. De même, nous pouvons former l'idée d'un être infiniment intelligent, puissant et bon, sans que cette capacité conceptuelle n'implique l'existence réelle d'un tel être. L'empirisme conduit ainsi à un agnosticisme épistémologique : si toute connaissance légitime provient de l'expérience sensible, et si Dieu échappe par principe à toute expérience sensible, alors nous ne pouvons avoir aucune connaissance de Dieu. Nous pouvons penser le mot « Dieu », manipuler ce concept dans nos raisonnements, mais ce mot ne renvoie à aucun contenu cognitif authentique. ==== Le problème de la transcendance : au-delà de l'expérience possible ==== La notion de transcendance pose un problème épistémologique fondamental pour toute prétention à connaître Dieu. La transcendance désigne ce qui dépasse radicalement les limites d'un certain être ou ordre d'être, ce qui lui est à la fois séparé et supérieur. En théologie, Dieu est dit transcendant parce qu'il n'appartient pas au monde créé, qu'il existe indépendamment de l'univers et le dépasse infiniment. Cette transcendance se distingue de l'immanence, qui désigne ce qui a son principe en soi-même, ce qui est intérieur à un être ou un ordre de réalité. Un principe immanent agit de l'intérieur, un principe transcendant agit de l'extérieur et d'en haut. Les religions monothéistes (judaïsme, christianisme, islam) affirment généralement la transcendance divine, tandis que certaines philosophies (spinozisme, panthéisme) privilégient l'immanence, identifiant Dieu à la Nature elle-même. Or, la transcendance divine rend par principe impossible toute connaissance de Dieu. En effet, notre connaissance est structurellement limitée au domaine de l'expérience possible. Nous ne connaissons que ce qui peut nous être donné dans l'intuition sensible (chez Kant) ou ce qui peut être vérifié empiriquement (chez les positivistes). Un être transcendant, situé au-delà du monde sensible, échappe définitivement à ce domaine. Il n'est pas simplement difficile à connaître ; il est, par essence, inconnaissable. Cette inconnaissabilité de principe ne résulte pas d'une limitation accidentelle de nos facultés cognitives (comme notre incapacité à voir les infrarouges ou à entendre les ultrasons). Elle découle de la nature même de ce que signifie « connaître » et de ce qu'est Dieu selon la théologie classique. Vouloir connaître un Dieu transcendant, c'est prétendre connaître ce qui, par définition, échappe aux conditions de la connaissance. C'est une contradiction dans les termes, comparable à celle qui consisterait à vouloir voir un son ou entendre une couleur. ==== L'argument kantien : les limites de la raison théorique ==== Emmanuel Kant (1724-1804) a fourni l'analyse la plus systématique et la plus influente des limites structurelles de la connaissance humaine. Dans la ''Critique de la raison pure'', il montre que toute connaissance requiert deux éléments : des intuitions (données sensibles) et des concepts (catégories de l'entendement qui organisent ces données). Sa formule célèbre résume cette thèse : « Des pensées sans contenu sont vides, des intuitions sans concepts sont aveugles. » Kant établit que nous ne connaissons jamais les choses telles qu'elles sont « en soi » (''Ding an sich''), mais seulement telles qu'elles nous apparaissent (phénomènes), structurées par les formes ''a priori'' de notre sensibilité (espace et temps) et de notre entendement (catégories comme substance, causalité, unité, pluralité). Cette distinction entre le phénoménal (accessible à la connaissance) et le nouménal (inaccessible) est décisive pour la question de Dieu. Dieu, en tant qu'être transcendant, appartient à l'ordre nouménal. Il n'est pas un objet d'expérience possible, car il n'est ni dans l'espace ni dans le temps. Or, selon Kant, les catégories de l'entendement (comme la causalité) ne s'appliquent légitimement qu'aux phénomènes, c'est-à-dire aux objets donnés dans l'expérience spatiotemporelle. Étendre ces catégories au-delà de ce domaine constitue un usage illégitime qui conduit inévitablement à des erreurs et des contradictions. Lorsque la métaphysique traditionnelle prétend prouver l'existence de Dieu par le principe de causalité (tout effet a une cause, donc le monde a une cause première), elle commet précisément cette erreur : elle applique une catégorie (la causalité) hors de son domaine légitime d'application (les phénomènes). Cette extension illégitime ne produit pas de connaissance, mais seulement l'illusion transcendantale – une apparence de connaissance qui se dissipe dès qu'on l'examine rigoureusement. Kant conclut que Dieu, l'âme immortelle et la liberté absolue sont des idées de la raison qui ont une fonction régulatrice légitime (elles orientent notre recherche vers l'unité systématique des connaissances), mais aucune valeur constitutive (elles ne nous donnent aucune connaissance d'objets réels). L'agnosticisme théorique s'impose donc : nous ne pouvons ni prouver ni réfuter l'existence de Dieu par la raison théorique. ==== Le positivisme : la science comme limite de la connaissance ==== Au XIXe siècle, Auguste Comte (1798-1857) développe une philosophie positiviste qui radicalise encore la critique des prétentions métaphysiques à connaître Dieu. Selon sa célèbre loi des trois états, l'humanité traverse successivement trois stades intellectuels : l'état théologique (où l'on explique les phénomènes par des agents surnaturels), l'état métaphysique (où l'on invoque des entités abstraites comme des essences ou des forces), et l'état positif ou scientifique (où l'on se limite à établir les lois empiriques régissant les phénomènes observables)<ref>Auguste Comte, Cours de philosophie positive, Paris, Rouen frères, 1830-1842, 6 vol. ; réimpr. Paris, Hermann, 1975 ; leçon 1, « Loi des trois états », vol. I, p. 20-25.</ref>. Pour Comte, les questions théologiques et métaphysiques ne sont pas simplement sans réponse ; elles sont mal posées. La science positive ne cherche pas à connaître les causes premières, les essences cachées ou les finalités ultimes. Elle se contente d'établir des relations constantes entre phénomènes observables, exprimées sous forme de lois mathématiques. Demander pourquoi l'univers existe, quelle est sa cause ultime, quel est son but, ce sont des pseudo-questions héritées d'un stade infantile de l'évolution intellectuelle. Cette position positiviste conduit à un agnosticisme méthodologique radical : la science doit procéder ''comme si'' les questions métaphysiques n'avaient pas d'objet. Non pas parce que nous ne connaissons pas encore les réponses, mais parce que ces questions elles-mêmes reposent sur une confusion conceptuelle. Elles mélangent indûment le registre de la connaissance (qui porte sur les phénomènes observables et leurs relations) et le registre de la spéculation métaphysique (qui prétend atteindre des réalités transcendantes). ==== L'empirisme logique et le critère de vérifiabilité ==== Au XXe siècle, le Cercle de Vienne et l'empirisme logique poussent à l'extrême la critique positiviste de la métaphysique. Inspirés par le ''Tractatus logico-philosophicus'' de Ludwig Wittgenstein, les membres du Cercle (Rudolf Carnap, Moritz Schlick, Otto Neurath) élaborent une théorie vérificationniste de la signification. Selon ce critère, un énoncé n'a de signification cognitive (c'est-à-dire n'est susceptible d'être vrai ou faux) que s'il est soit analytique (vrai par définition, comme les propositions logiques et mathématiques), soit synthétique et vérifiable empiriquement. Un énoncé synthétique qui ne peut être vérifié par aucune expérience observable n'est pas seulement invérifiable ; il est littéralement dénué de sens (''sinnlos'' ou ''unsinnig''). Appliqué à la théologie, ce critère est dévastateur. L'énoncé « Dieu existe » n'est ni analytique (car l'existence, comme l'a montré Kant, n'est pas un prédicat réel contenu dans le concept de Dieu), ni vérifiable empiriquement (aucune observation concevable ne peut le confirmer ou l'infirmer de manière décisive). Par conséquent, cet énoncé est littéralement dépourvu de signification cognitive. Il n'est ni vrai ni faux ; il n'appartient pas au domaine des propositions ayant un contenu informatif sur la réalité. Cette position dépasse l'agnosticisme classique. Là où l'agnostique suspend son jugement sur une question qu'il considère comme significative mais indécidable, l'empiriste logique rejette la question elle-même comme mal formée. La question « Dieu existe-t-il ? » n'appelle pas de réponse ; elle appelle une dissolution par clarification conceptuelle. Elle appartient au domaine de la « métaphysique », entendue péjorativement comme un ensemble de pseudo-énoncés grammaticalement corrects mais sémantiquement vides. Toutefois, cette position extrême s'est heurtée à de nombreuses objections. Karl Popper a montré que le critère de vérifiabilité est auto-réfutant : l'énoncé « seuls les énoncés vérifiables ont un sens » n'est lui-même ni analytique ni vérifiable empiriquement ; il est donc dénué de sens selon ses propres critères. De plus, de nombreux énoncés scientifiques théoriques (concernant des entités non observables comme les quarks ou les trous noirs) ne sont pas strictement vérifiables, sans pour autant être dénués de sens. ==== L'impossibilité de l'expérience religieuse comme preuve ==== Certains théologiens et philosophes religieux ont objecté que l'expérience religieuse ou mystique fournit une voie d'accès privilégiée à Dieu, rendant caduque la critique épistémologique agnostique. Rudolf Otto (1869-1937), dans son ouvrage ''Le Sacré'' (1917), décrit l'expérience du numineux – ce sentiment de présence d'un « tout autre » transcendant, à la fois terrifiant (''mysterium tremendum'') et fascinant (''mysterium fascinans''). Pour Otto, cette expérience du sacré constitue une catégorie sui generis, irréductible à toute autre forme d'expérience (esthétique, morale, rationnelle). Elle révèle immédiatement la présence du divin, de manière non conceptuelle et non rationnelle. Les grandes figures mystiques (Thérèse d'Avila, Jean de la Croix, al-Hallaj, Maître Eckhart) témoignent d'expériences de communion ou d'union avec Dieu qui semblent, pour eux, plus certaines et plus réelles que toute connaissance ordinaire. Cependant, l'agnostique peut répondre que l'expérience subjective, aussi intense et convaincante soit-elle pour celui qui l'éprouve, ne constitue pas une preuve objective de l'existence de son objet. De nombreux phénomènes psychologiques (hallucinations, états modifiés de conscience, pathologies mentales) produisent des expériences subjectives extrêmement vives sans correspondre à aucune réalité extérieure. Le fait qu'un individu éprouve un sentiment intense de présence divine ne prouve pas plus l'existence de Dieu que le fait qu'un schizophrène entende des voix ne prouve l'existence réelle de ces voix. De plus, les expériences religieuses varient considérablement d'une tradition à l'autre. Les chrétiens rencontrent le Christ, les musulmans Allah, les hindous Krishna ou Shiva, les bouddhistes atteignent le nirvana. Ces expériences se contredisent mutuellement dans leurs contenus doctrinaux. Elles semblent donc davantage refléter les structures culturelles et psychologiques des croyants que révéler une réalité transcendante objective. ==== L'argument du désaccord : la diversité des conceptions de Dieu ==== Un argument épistémologique supplémentaire en faveur de l'agnosticisme réside dans la diversité radicale des conceptions de Dieu à travers les cultures et les époques. Si Dieu existait réellement et se révélait aux humains, on s'attendrait à un certain consensus sur sa nature et ses attributs. Or, c'est précisément le contraire qui se produit. Les religions monothéistes affirment l'existence d'un Dieu personnel, créateur, omniscient et omnipotent. Les religions polythéistes postulent une pluralité de dieux aux pouvoirs limités et aux caractères distincts. Certaines traditions (bouddhisme théravada, jaïnisme) sont athées ou agnostiques. Les conceptions philosophiques de Dieu varient du Dieu personnel et provident du théisme classique au Dieu immanent et impersonnel de Spinoza, en passant par le Dieu-horloger du déisme ou le Dieu-processus de Whitehead. Cette diversité suggère que les conceptions de Dieu reflètent davantage les cultures, les psychologies et les besoins humains qu'une réalité objective indépendante. Comme le note Hume dans son ''Histoire naturelle de la religion'', les dieux ressemblent étrangement aux peuples qui les adorent : guerriers pour les peuples guerriers, paisibles pour les peuples pacifiques, jaloux et exclusifs pour les monothéistes, tolérants et pluralistes pour les polythéistes. ==== Conclusion : l'humilité épistémique ==== L'argument épistémologique aboutit à une conclusion d'humilité intellectuelle : les limites structurelles de notre connaissance nous interdisent de nous prononcer sur l'existence ou l'inexistence de Dieu. Cette limitation ne résulte pas d'une faiblesse accidentelle de nos facultés, mais de la nature même de ce qu'est la connaissance et de ce qu'est Dieu selon la théologie classique. Reconnaître ces limites n'est pas un aveu de faiblesse, mais une marque de rigueur intellectuelle. L'agnosticisme épistémologique nous invite à distinguer soigneusement ce que nous savons de ce que nous croyons, ce qui peut être démontré de ce qui relève de la foi. Il nous met en garde contre la tentation de transformer nos espoirs, nos peurs ou nos intuitions subjectives en prétendues connaissances objectives. Cette humilité épistémique n'interdit pas la recherche, la réflexion ou l'engagement existentiel. Elle circonscrit simplement le domaine légitime de la connaissance et nous rappelle que certaines questions, peut-être les plus importantes, dépassent définitivement nos capacités cognitives. === La charge de la preuve et l'analogie de la théière de Russell === L'un des arguments les plus célèbres et les plus influents en faveur de l'agnosticisme est l'analogie de la « théière céleste » formulée par le philosophe et mathématicien britannique Bertrand Russell (1872-1970). Cette analogie, simple en apparence mais profonde dans ses implications, illustre un principe épistémologique fondamental : celui de la charge de la preuve (''onus probandi''). Elle démontre qu'il n'appartient pas aux sceptiques de réfuter l'existence de Dieu, mais aux croyants de la prouver. ==== L'origine de l'analogie : l'article de 1952 ==== Russell formule son analogie dans un article intitulé « Is There a God? » (Y a-t-il un Dieu ?), commandé en 1952 par le magazine londonien ''Illustrated''. L'article, bien que payé, ne fut jamais publié du vivant de Russell – probablement en raison de son contenu jugé trop provocateur pour l'époque. Il ne parut qu'en 1997, dans un recueil posthume de ses écrits. Voici le passage célèbre où Russell présente son analogie : « Bien des orthodoxes parlent comme si c'était l'affaire des sceptiques de réfuter les dogmes reçus plutôt que celle des dogmatiques de les prouver. Ceci est, bien entendu, une erreur. Si je suggérais qu'entre la Terre et Mars se trouve une théière de porcelaine en orbite elliptique autour du Soleil, personne ne serait capable de réfuter mon affirmation, à condition que j'aie pris soin d'ajouter que la théière est trop petite pour être révélée même par nos télescopes les plus puissants. Mais si je poursuivais en disant que, puisque mon affirmation ne peut être réfutée, il serait d'une intolérable présomption de la part de la raison humaine d'en douter, on me prendrait à juste titre pour un fou. Si toutefois l'existence d'une telle théière était affirmée dans des livres anciens, enseignée comme vérité sacrée tous les dimanches, et inculquée dans l'esprit des enfants à l'école, l'hésitation à croire en son existence deviendrait une marque d'excentricité et vaudrait au sceptique les soins d'un psychiatre à une époque éclairée, ou ceux de l'Inquisiteur à une époque antérieure. »<ref>Bertrand Russell, "Is There a God?", article commandé en 1952 par Illustrated Magazine (non publié du vivant de l'auteur), in The Collected Papers of Bertrand Russell, vol. 11: Last Philosophical Testament, 1943-68, éd. John G. Slater et Peter Köllner, Londres, Routledge, 1997, p. 542-548.</ref> En 1958, dans une conférence radiophonique, Russell revient sur cette analogie et précise sa position personnelle : <ref>Bertrand Russell, allocution radiophonique, 1958, citée in Paul Edwards (éd.), Encyclopedia of Philosophy, New York, Macmillan, 1967, vol. 1, p. 178.</ref> « Je devrais me dire agnostique ; mais, à toutes fins pratiques, je suis athée. Je ne pense pas que l'existence du Dieu chrétien soit plus probable que celle des dieux de l'Olympe ou du Valhalla. Pour prendre une autre illustration : personne ne peut prouver qu'il n'existe pas entre la Terre et Mars une théière de porcelaine en orbite elliptique, mais personne ne pense que cette hypothèse soit suffisamment vraisemblable pour être prise en compte dans la pratique. Je pense que le Dieu chrétien est tout aussi improbable. » ==== Le principe de la charge de la preuve ==== L'analogie de Russell illustre un principe logique et épistémologique fondamental : la charge de la preuve (''onus probandi'') incombe à celui qui affirme l'existence d'une entité, non à celui qui en doute ou la nie. Ce principe, hérité du droit romain (« ''Onus probandi incumbit ei qui dicit, non ei qui negat'' » – la charge de la preuve incombe à celui qui affirme, non à celui qui nie), s'applique également à la démarche scientifique et philosophique. Pourquoi ce principe est-il rationnel ? Pour plusieurs raisons convergentes : Premièrement, l'argument de l'économie ontologique ou rasoir d'Occam : face à plusieurs hypothèses explicatives, il convient de privilégier la plus simple, celle qui fait le moins d'hypothèses non nécessaires. L'hypothèse « il n'y a pas de théière en orbite » est plus simple que l'hypothèse « il y a une théière en orbite », puisque la première ne postule rien de nouveau tandis que la seconde ajoute une entité supplémentaire à notre inventaire du monde. De même, l'hypothèse « Dieu n'existe pas » (ou plus précisément « l'univers existe sans qu'un créateur soit nécessaire ») est plus parcimonieuse que l'hypothèse « Dieu existe », qui ajoute un être aux propriétés extraordinaires. Deuxièmement, l'argument de la prolifération des hypothèses invérifiables : si nous acceptions le principe inverse (celui qui nie doit prouver), nous devrions admettre l'existence de toute entité arbitrairement imaginée tant que personne n'a prouvé son inexistence. Or, il est infiniment plus facile d'inventer des hypothèses invérifiables que de les réfuter toutes. On pourrait postuler l'existence de licornes invisibles, de fées au fond du jardin, de dragons microscopiques, de démons malicieux manipulant nos pensées, de civilisations extraterrestres cachées dans des dimensions parallèles, et ainsi de suite à l'infini. Exiger que les sceptiques réfutent chacune de ces hypothèses serait un fardeau épistémologique insupportable et improductif. Troisièmement, l'asymétrie logique entre affirmation et négation : une affirmation d'existence (« X existe ») peut en principe être vérifiée par un seul cas positif (il suffit de trouver un exemplaire de X), tandis qu'une négation d'existence (« X n'existe pas ») exigerait une recherche exhaustive de tout l'univers pour être définitivement établie. Il est donc raisonnable d'exiger de celui qui affirme qu'il fournisse l'exemplaire positif, plutôt que d'exiger de celui qui nie qu'il prouve l'absence universelle. ==== L'impossibilité de prouver un négatif universel ==== Russell met en lumière un problème logique fondamental : on ne peut généralement pas prouver une proposition négative universelle du type « X n'existe nulle part ». Comment prouver qu'il n'y a pas de théière dans l'espace entre la Terre et Mars ? Il faudrait inspecter chaque centimètre cube de cet immense volume spatial, tenir compte de la possibilité que la théière soit en mouvement, ou qu'elle se cache derrière un astéroïde, ou qu'elle soit temporairement invisible pour une raison quelconque. Cette tâche est pratiquement impossible. De même, comment prouver que Dieu n'existe pas ? S'il est défini comme transcendant (hors de l'espace et du temps), omnipotent (capable de se dissimuler à volonté), et spirituel (immatériel), alors par définition aucune investigation empirique ne peut démontrer son inexistence. Tout effort pour le détecter peut être contré par l'affirmation qu'il choisit de ne pas se manifester, ou que nos instruments sont inadéquats, ou que sa nature échappe à toute détection physique. Cette impossibilité structurelle de prouver un négatif universel signifie que si la charge de la preuve pesait sur les athées ou les agnostiques, ceux-ci se trouveraient dans une position logiquement intenable. Ils devraient accomplir l'impossible : démontrer l'absence d'une entité qui, par définition théologique, échappe à toute vérification empirique. Le croyant, en revanche, pourrait toujours se retrancher derrière l'invérifiabilité de sa thèse pour la maintenir, quels que soient les contre-arguments. ==== Le renversement de la charge de la preuve : une erreur logique ==== Russell dénonce ce qu'il appelle une « erreur » commise par « bien des orthodoxes » : celle de renverser la charge de la preuve en exigeant des sceptiques qu'ils réfutent l'existence de Dieu. Cette erreur prend souvent la forme d'arguments du type : « Vous ne pouvez pas prouver que Dieu n'existe pas, donc il est raisonnable de croire qu'il existe. » Ce renversement constitue une pétition de principe (ou ''petitio principii''), un type de raisonnement fallacieux où l'on présuppose ce qu'il faudrait démontrer. En plaçant la charge de la preuve sur les sceptiques, on présuppose implicitement que l'hypothèse théiste est la position par défaut, celle qu'il convient d'adopter tant qu'elle n'a pas été réfutée. Mais pourquoi le théisme serait-il la position par défaut plutôt que l'athéisme, l'agnosticisme ou toute autre position religieuse (polythéisme, panthéisme, déisme) ? Ce sophisme, que les logiciens nomment argument d'ignorance (''argumentum ad ignorantiam''), consiste à conclure qu'une proposition est vraie du seul fait qu'elle n'a pas été prouvée fausse, ou inversement qu'elle est fausse du seul fait qu'elle n'a pas été prouvée vraie. L'ignorance (l'absence de connaissance) ne peut servir de preuve pour aucune conclusion positive. Comme le formule le « rasoir de Hitchens » (du nom du journaliste Christopher Hitchens) : « Ce qui est affirmé sans preuve peut être rejeté sans preuve. » ==== Le rôle de la tradition et de l'éducation religieuse ==== Russell souligne un aspect sociologique crucial de l'analogie. Si la théière céleste était « affirmée dans des livres anciens, enseignée comme vérité sacrée tous les dimanches, et inculquée dans l'esprit des enfants à l'école », alors le doute à son égard passerait pour de l'excentricité et exposerait le sceptique à la réprobation sociale, voire à la persécution. Ce passage révèle la dimension idéologique et culturelle de la croyance religieuse. L'hypothèse de Dieu bénéficie d'un privilège épistémologique immérité : elle est considérée comme respectable, digne de considération sérieuse, exemptée du même niveau de scepticisme que nous appliquons spontanément à d'autres affirmations extraordinaires. Pourquoi cette asymétrie ? Uniquement en raison de l'ancienneté de la croyance, de son enracinement dans la tradition, et de son enseignement systématique aux enfants. Russell suggère ainsi que la respectabilité sociale de la croyance en Dieu ne découle pas de sa plausibilité rationnelle, mais de facteurs historiques et sociologiques contingents. Si une théière céleste avait été vénérée pendant des millénaires, enseignée aux enfants comme une vérité sacrée, célébrée dans des rituels et des institutions, elle bénéficierait du même prestige culturel que Dieu. Mais cela ne la rendrait pas plus réelle pour autant. Cette observation anticipe la critique sociologique de la religion développée par des penseurs comme Émile Durkheim, selon laquelle les croyances religieuses reflètent avant tout des structures sociales et des besoins collectifs, plutôt que des vérités objectives sur la nature de la réalité. ==== Les variantes contemporaines : licornes invisibles et monstres en spaghettis ==== L'analogie de Russell a inspiré de nombreuses variations contemporaines qui poursuivent le même objectif satirique et pédagogique. Parmi les plus célèbres figurent : La Licorne Rose Invisible (''Invisible Pink Unicorn'', IPU), créée en 1990 sur le groupe de discussion Usenet alt.atheism, est une divinité parodique qui possède deux attributs contradictoires : elle est à la fois invisible et rose. Cette contradiction intentionnelle parodie les attributs théologiques incompatibles ou mystérieux souvent attribués à Dieu (comme l'omnipotence combinée à l'omnibenevolence face à l'existence du mal, ou la trinité chrétienne affirmant que trois personnes sont un seul Dieu). Le slogan des « fidèles » de la Licorne Rose Invisible est : « Bénis soient ses saints sabots. » Le Monstre en Spaghettis Volant (''Flying Spaghetti Monster'', FSM), créé en 2005 par Bobby Henderson dans une lettre ouverte parodique au conseil d'éducation du Kansas, est devenu le symbole du pastafarianisme, une « religion » satirique. Henderson protestait contre l'enseignement du « dessein intelligent » (une forme déguisée de créationnisme) dans les écoles publiques américaines. Il demandait que si le créationnisme était enseigné, le pastafarianisme le soit également, puisque les deux manquent également de fondement scientifique. Le FSM aurait créé l'univers « après avoir bu beaucoup », ce qui expliquerait ses imperfections. Le Dragon invisible dans le garage de Carl Sagan, présenté dans son ouvrage ''The Demon-Haunted World'' (1995), illustre le même principe. Sagan imagine quelqu'un affirmant qu'un dragon vit dans son garage. À chaque tentative de vérification (regarder, utiliser une caméra infrarouge, répandre de la farine pour révéler ses empreintes), l'affirmant ajoute une clause ad hoc : le dragon est invisible, il ne dégage pas de chaleur, il flotte dans les airs sans toucher le sol. Sagan demande alors : « Quelle est la différence entre un dragon invisible, incorporel, flottant, qui crache un feu sans chaleur, et aucun dragon du tout ? » Ces variations modernes de la théière de Russell remplissent la même fonction philosophique : elles exposent l'arbitraire des affirmations métaphysiques invérifiables et démontrent que l'incapacité à réfuter une hypothèse ne constitue pas une raison de la considérer comme vraie ou même probable. ==== Les objections philosophiques à l'analogie de Russell ==== Malgré sa popularité, l'analogie de la théière a suscité des objections de la part de philosophes religieux. Trois critiques principales méritent d'être examinées. L'objection de la dissymétrie : Le philosophe catholique Peter van Inwagen et le philosophe réformé Alvin Plantinga ont argué que l'analogie échoue parce qu'il existe une dissymétrie importante entre la théière et Dieu. L'existence d'une théière en orbite serait un fait totalement arbitraire, sans justification théorique ni motivation rationnelle. En revanche, l'hypothèse de Dieu répond à des questions métaphysiques profondes : pourquoi y a-t-il quelque chose plutôt que rien ? Comment expliquer l'ordre et la régularité de l'univers ? D'où vient la conscience humaine ? Pour ces philosophes, l'hypothèse théiste possède une force explicative que la théière n'a pas. Toutefois, cette objection ne réfute pas le point central de Russell. Même si l'hypothèse théiste possède une force explicative (ce qui est contestable), cela ne dispense pas ses défenseurs de fournir des preuves positives de l'existence de Dieu. Une hypothèse peut être explicativement féconde tout en étant fausse. L'hypothèse du phlogistique expliquait jadis la combustion, mais le phlogistique n'existe pas. De plus, si l'on admet que toute hypothèse explicativement utile mérite d'être crue sans preuve, alors nous devrions également croire aux nombreuses autres hypothèses métaphysiques qui « expliquent » l'univers : le panthéisme spinoziste, le dualisme matière-esprit, l'idéalisme berkeleyien, le bouddhisme (qui nie un créateur), etc. L'objection du témoignage et de l'expérience : Certains théologiens objectent que l'existence de Dieu bénéficie du témoignage de milliards de croyants à travers l'histoire, ainsi que d'expériences religieuses mystiques relatées dans toutes les cultures. La théière, en revanche, ne bénéficie d'aucun témoignage. L'analogie serait donc trompeuse car elle ignorerait la dimension testimoniale et expérientielle de la croyance religieuse. Cette objection soulève la question complexe de la valeur probante du témoignage et de l'expérience subjective. Comme nous l'avons vu dans le chapitre sur Hume, le simple fait que de nombreuses personnes croient en X ou affirment avoir expérimenté X ne prouve pas que X existe objectivement. Des millions de personnes ont cru en Zeus, Odin, Vishnou, Quetzalcoatl – ces témoignages convergents ne rendent pas ces dieux également réels. Les expériences mystiques, aussi sincères soient-elles, peuvent s'expliquer par la psychologie, la neurologie ou l'anthropologie culturelle sans requérir l'existence objective de leur objet prétendu. L'objection de Paul Chamberlain : Le philosophe Paul Chamberlain soutient que l'analogie de Russell repose sur une distinction erronée entre affirmations positives et négatives. Selon lui, toute affirmation – qu'elle soit positive (« Dieu existe ») ou négative (« Dieu n'existe pas ») – porte une charge de preuve. Il serait donc aussi fallacieux pour l'athée d'affirmer l'inexistence de Dieu sans preuve que pour le théiste d'affirmer son existence. Cette objection méconnaît la position agnostique, qui se distingue précisément de l'athéisme dogmatique. L'agnostique ne prétend pas prouver que Dieu n'existe pas ; il se contente de suspendre son jugement faute de preuves suffisantes. La charge de la preuve pèse sur celui qui fait une affirmation d'existence (''claim''), non sur celui qui suspend son jugement (''withholding belief''). L'agnosticisme ne constitue pas une affirmation négative (« je sais que Dieu n'existe pas »), mais une position épistémique neutre (« je ne sais pas si Dieu existe »). ==== L'usage de la théière par Richard Dawkins contre l'agnosticisme « conciliant » ==== Dans ''The God Delusion'' (2006)<ref>Richard Dawkins, The God Delusion, Londres, Bantam Press, 2006 ; trad. Marie-France Desjeux, Pour en finir avec Dieu, Paris, Robert Laffont, 2008, 432 p.</ref>, le biologiste Richard Dawkins utilise l'analogie de Russell dans un contexte légèrement différent : non plus pour critiquer le théisme, mais pour critiquer ce qu'il nomme l'« agnosticisme de conciliation ». Certains agnostiques affirment que, puisque nous ne pouvons ni prouver ni réfuter l'existence de Dieu, nous devrions adopter une position d'indifférence parfaite, accordant 50% de probabilité à l'existence de Dieu et 50% à son inexistence. Dawkins objecte que cette position est absurde. Si nous l'adoptions de manière cohérente, nous devrions aussi attribuer 50% de probabilité à l'existence de la théière de Russell, 50% aux licornes roses invisibles, 50% au Monstre en Spaghettis Volant, etc. Or, personne ne se dit « agnostique » au sujet de la théière : tout le monde reconnaît qu'elle est hautement improbable, même si son inexistence ne peut être rigoureusement prouvée. Dawkins propose alors un « spectre de probabilité théiste » en sept positions : 1. Théisme fort : « Je sais avec certitude que Dieu existe. » 2. Théisme de fait : « Je ne peux le prouver, mais je crois fortement en Dieu et je vis ma vie sur cette supposition. » 3. Théisme faible : « La probabilité de Dieu est supérieure à 50%, mais bien inférieure à la certitude. » 4. Agnosticisme pur : « La probabilité de Dieu est exactement de 50%. » 5. Agnosticisme incliné vers l'athéisme : « Je ne sais pas si Dieu existe, mais je penche vers le scepticisme. » 6. Athéisme de fait : « Je ne peux pas le savoir avec certitude, mais je pense que Dieu est très improbable et je vis ma vie en supposant qu'il n'existe pas. » 7. Athéisme fort : « Je sais avec certitude que Dieu n'existe pas. » Dawkins lui-même se situe à la position 6, en soulignant que la position 4 (agnosticisme pur) est déraisonnable. De même que nous ne sommes pas « agnostiques » concernant les fées ou les lutins, nous ne devrions pas l'être concernant Dieu. L'absence de preuve définitive d'inexistence ne justifie pas une probabilité de 50%. Elle justifie au mieux une très faible probabilité – peut-être comparable à celle que nous attribuons à la théière céleste. ==== La théière de Russell et l'agnosticisme philosophique ==== Il convient de noter que l'analogie de Russell soutient parfaitement l'agnosticisme au sens strict, c'est-à-dire la suspension du jugement face à l'absence de preuves suffisantes. Russell lui-même se disait « agnostique en théorie, mais athée en pratique », reconnaissant ainsi qu'une position théorique de suspension du jugement (je ne ''sais'' pas) est compatible avec une attitude pratique de rejet (je ne ''crois'' pas). L'agnosticisme ne prétend pas que l'existence et l'inexistence de Dieu sont également probables. Il affirme simplement que nous manquons de preuves suffisantes pour trancher la question de manière définitive. Cette position est parfaitement cohérente avec l'attribution d'une très faible probabilité à l'existence de Dieu (comme Russell le fait avec sa théière), tout en reconnaissant honnêtement que cette probabilité n'est pas rigoureusement nulle. ==== Conclusion : la leçon épistémologique de la théière ==== L'analogie de la théière de Russell demeure l'un des arguments les plus percutants en faveur de l'agnosticisme et contre le théisme dogmatique. Sa force réside dans sa simplicité : en remplaçant Dieu par une théière, elle démasque l'arbitraire de la croyance religieuse et révèle que celle-ci bénéficie d'un traitement de faveur immérité. La leçon épistémologique est claire : l'incapacité à réfuter une hypothèse ne constitue pas une raison de la croire. Si nous acceptions ce principe, nous serions submergés par une infinité d'hypothèses invérifiables et contradictoires. La rationalité exige que nous placions la charge de la preuve sur celui qui affirme l'existence d'une entité extraordinaire, et que nous suspendions notre croyance tant que cette preuve n'est pas fournie. Cette exigence ne relève pas d'un scepticisme excessif ou d'une fermeture d'esprit. Elle découle simplement de l'application cohérente des standards épistémologiques que nous utilisons spontanément dans tous les autres domaines de la vie. Nous ne croyons pas aux licornes, aux fantômes, aux extraterrestres visitant la Terre, ou aux complots illuminati mondiaux sans preuves solides. Pourquoi ferions-nous exception pour Dieu ? La théière de Russell nous invite à l'humilité intellectuelle : reconnaître que l'absence de réfutation n'équivaut pas à une confirmation, et que la suspension du jugement face à l'inconnaissable est une position philosophique respectable – peut-être même la seule véritablement rationnelle. === L'éthique de la croyance selon Clifford === Le mathématicien et philosophe britannique William Kingdon Clifford (1845-1879) a développé l'une des défenses les plus influentes de l'agnosticisme, non pas sur le terrain épistémologique, mais sur le terrain éthique. Dans son célèbre essai « The Ethics of Belief » (L'éthique de la croyance), publié en 1877<ref>William Kingdon Clifford, "The Ethics of Belief", Contemporary Review, vol. 29, janvier 1877, p. 289-309 ; repris in Lectures and Essays, éd. Leslie Stephen et Frederick Pollock, Londres, Macmillan, 1879, vol. II, p. 163-205.</ref>, Clifford transforme la question de la croyance religieuse d'un problème de connaissance en un problème de responsabilité morale. Son argumentation soutient que croire sans preuves suffisantes ne constitue pas seulement une erreur intellectuelle, mais une faute morale qui compromet le bien commun et l'intégrité personnelle. ==== La maxime de Clifford : l'impératif d'évidence ==== Clifford ouvre son essai par une maxime devenue célèbre, qui résume sa position de manière tranchante et sans compromis : « Il est mauvais, toujours, partout et pour quiconque, de croire quoi que ce soit sur la base d'une évidence insuffisante. » (''It is wrong always, everywhere, and for anyone, to believe anything upon insufficient evidence.'') Cette maxime possède plusieurs caractéristiques remarquables. Premièrement, elle est universelle : elle s'applique « toujours, partout et pour quiconque », sans exception ni circonstance atténuante. Deuxièmement, elle est catégorique : elle n'admet aucun degré – croire sans évidence suffisante n'est pas simplement imprudent ou peu recommandable, c'est « mauvais » (''wrong''), terme qui possède une connotation morale forte. Troisièmement, elle ne se limite pas à certains domaines de la croyance : elle concerne « quoi que ce soit », incluant donc les croyances religieuses. Cette maxime établit ce que les philosophes contemporains nomment un évidentialisme strict : la justification épistémique d'une croyance dépend exclusivement de l'évidence disponible qui la soutient, et croire en l'absence d'une telle évidence viole un devoir moral fondamental. L'évidentialisme de Clifford contraste radicalement avec le fidéisme religieux, qui valorise la foi acceptée sans preuves, voire malgré les preuves contraires. ==== L'argument de l'armateur : responsabilité et croyance ==== Pour illustrer sa thèse, Clifford propose une parabole devenue célèbre : celle de l'armateur négligent. Cette illustration révèle pourquoi la formation de nos croyances engage notre responsabilité morale. Un armateur possède un vieux navire en mauvais état. Des doutes surgissent concernant sa sécurité : il a subi de nombreuses réparations, il a mal résisté aux tempêtes précédentes, sa structure pourrait être compromise. L'armateur s'inquiète : devrait-il procéder à des inspections coûteuses ? Faire réparer le navire ? Renoncer au voyage prévu ? Cependant, poursuit Clifford, l'armateur parvient à surmonter ces doutes « par un effort sincère et sérieux ». Il se dit qu'après tout, le navire a survécu à tant de voyages auparavant. Il se persuade que la Providence veille sur ceux qui naviguent. Il écarte ses inquiétudes comme des scrupules excessifs et acquiert ainsi « une croyance sincère et confortable que son navire était parfaitement sûr et bon pour le voyage ». Le navire part en mer avec des émigrants à son bord. Il coule au milieu de l'océan, et tous périssent. Clifford pose alors la question décisive : « Que devons-nous dire de [l'armateur] ? Assurément, qu'il était véritablement coupable de la mort de ces hommes. » Pourquoi est-il coupable ? « Il croyait sincèrement en la solidité de son navire » – sa croyance était authentique, non feinte. Mais « cette sincérité de sa conviction ne peut en aucun cas aider à l'excuser, parce qu'il n'avait aucun droit de croire sur l'évidence qu'il avait devant lui ». L'armateur a acquis sa croyance de manière irresponsable. Au lieu d'examiner soigneusement les faits, de consulter des experts, d'inspecter le navire, il a supprimé ses doutes par un effort de volonté et d'auto-persuasion. Il a préféré une croyance confortable à une enquête rigoureuse. Cette négligence épistémique constitue une faute morale, car elle a conduit à des conséquences désastreuses pour autrui. ==== Le cas où le navire ne coule pas : l'importance du processus ==== Clifford anticipe une objection naturelle : et si le navire n'avait pas coulé ? L'armateur ne serait-il pas alors innocent ? Clifford répond de manière tranchante : « Non, pas même dans ce cas ; car, bien que sa croyance ait été vraie, il n'avait aucun droit à celle-ci, et il avait atteint cette croyance non par un processus patient et honnête d'enquête, mais en étouffant ses doutes. » Cette réponse révèle un aspect crucial de l'éthique de la croyance : la valeur morale d'une croyance ne dépend pas de sa vérité fortuite, mais du processus par lequel elle a été acquise. Même si le navire avait survécu au voyage, l'armateur aurait été moralement coupable d'avoir cru de manière irresponsable. La chance qui fait que sa croyance s'est avérée vraie ne le disculpe pas de sa négligence initiale. Cette insistance sur le processus plutôt que sur le résultat distingue l'éthique de la croyance de l'éthique conséquentialiste ordinaire. Nous avons le devoir de former nos croyances de manière responsable, par un « processus patient et honnête d'enquête », indépendamment de la question de savoir si ces croyances se révéleront vraies ou fausses. Le devoir porte sur la méthode d'acquisition de la croyance, non sur son contenu final. ==== L'extension à la croyance religieuse ==== Bien que Clifford ne mentionne pas explicitement la religion dans sa parabole initiale, l'application à la croyance religieuse est évidente et intentionnelle. De nombreux croyants forment leur foi sans enquête sérieuse, par habitude culturelle, conformisme social, espoir émotionnel ou crainte du châtiment. Ils « étouffent leurs doutes » lorsque des questions surgissent, se contentant d'autorités traditionnelles plutôt que d'examiner les preuves de manière critique. Selon Clifford, une telle foi constitue une faute morale. Le croyant qui accepte les dogmes religieux sans les soumettre à un examen critique se rend coupable de la même négligence que l'armateur. Il n'a « aucun droit de croire » en Dieu, aux miracles, à l'immortalité de l'âme ou au salut éternel, s'il n'a pas fondé ces croyances sur une enquête rigoureuse et une évidence suffisante. Cette position implique directement l'agnosticisme concernant Dieu. Puisque, comme nous l'avons vu dans les sections précédentes, l'évidence en faveur de l'existence de Dieu est au mieux ambiguë et insuffisante, le devoir moral commande de suspendre notre jugement. L'agnosticisme ne représente pas simplement une position épistémique prudente ; c'est une obligation morale découlant de notre responsabilité envers la vérité. ==== Les conséquences sociales de la croyance irresponsable ==== Clifford ne se contente pas d'un argument individualiste. Il soutient que nos croyances ont des conséquences sociales qui dépassent largement notre sphère privée. Chaque croyance acceptée sans critique contribue à façonner le climat intellectuel et moral de la société : « Aucune croyance tenue par un homme, quelque forte et sincère qu'elle soit, qui ne touche pas à ses actions, n'est une chose parfaitement sans conséquence pour ses semblables. [...] Nos mots, nos expressions, nos formes et nos procédures, et nos actions, même au cœur du plus pur désir, viennent tous du fond de nos croyances. » Nos croyances informent nos actions, mais aussi nos attitudes, nos jugements et nos décisions quotidiennes. Elles influencent la manière dont nous élevons nos enfants, dont nous traitons autrui, dont nous participons à la vie civique. Une société où les individus adoptent des croyances sans examen critique devient une société intellectuellement irresponsable, vulnérable au fanatisme, à la superstition et à la manipulation. Clifford va plus loin : « Les croyances, qui nous ont été transmises par nos ancêtres, ne sont pas des choses privées et isolées, mais ont leur source dans un patrimoine commun, dans l'opinion générale, dans la croyance collective de l'humanité, sont augmentées et influencent les croyances des autres. » Nos croyances personnelles contribuent au stock commun de croyances de l'humanité. En acceptant une croyance sans justification, nous ne corrompons pas seulement notre propre intégrité intellectuelle ; nous empoisonnons le puits commun dont boivent tous les membres de la société. Cette dimension sociale transforme la croyance en question de responsabilité collective. Nous avons des obligations non seulement envers nous-mêmes, mais envers autrui et envers les générations futures. Accepter la croyance religieuse sans critique, même si elle nous apporte personnellement du réconfort, constitue une trahison de cette responsabilité collective. ==== La crédulité comme habitude vicieuse ==== Clifford analyse la crédulité non comme un défaut intellectuel isolé, mais comme une habitude vicieuse qui corrompt progressivement le caractère. Celui qui cède une fois à la tentation de croire sans preuve s'affaiblit pour les occasions futures : « Si je laisse passer une croyance sans l'avoir soumise à l'enquête, parce qu'elle est confortable et agréable [...], je ne peux éviter de le faire à nouveau une autre occasion ; et comme je le répète encore et encore, je finis par perdre complètement la faculté de discriminer le vrai du faux [...]. L'habitude de croire par désir plutôt que par évidence s'installera si profondément et si largement dans mon esprit que je ne pourrai plus me fier à mes jugements sur toute matière. » Cette analyse psychologique révèle un danger méconnu de la foi religieuse non critique : elle ne corrompt pas seulement cette croyance particulière, mais érode notre capacité générale de jugement critique. Celui qui accepte les dogmes religieux parce qu'ils sont réconfortants ou traditionnels, sans exiger de preuves, développe un vice épistémique qui s'étendra à d'autres domaines. Ce vice épistémique se manifeste par une crédulité généralisée : la disposition à accepter les affirmations sur leur seule autorité, tradition ou convenance, plutôt que sur leur mérite rationnel. Une personne habituée à suspendre son esprit critique en matière religieuse le suspendra plus facilement en matière politique, sociale ou commerciale. Elle deviendra vulnérable aux propagandes, aux pseudo-sciences, aux théories du complot et aux charlataneries de toutes sortes. Clifford conclut de manière sévère : « Celui qui croit vraiment qu'il peut se dire une chose parce qu'elle le réconforte, sans se soucier de savoir si elle est vraie ou non [...] détruit dans sa propre personne le modèle sur lequel la société devrait être construite. » ==== La vertu de l'enquête rigoureuse ==== Face au vice de la crédulité, Clifford oppose la vertu de l'enquête rigoureuse (''honest inquiry''). Cette vertu se caractérise par plusieurs dispositions intellectuelles : 1. La patience : l'enquêteur vertueux ne se précipite pas vers une conclusion, mais examine patiemment les preuves disponibles. 2. L'honnêteté : il ne dissimule ni ne minimise les preuves contraires à ses préférences ou intérêts. 3. Le courage intellectuel : il accepte les conclusions de son enquête, même si elles contredisent ses espoirs ou ses croyances antérieures. 4. L'humilité épistémique : il reconnaît les limites de son savoir et suspend son jugement lorsque l'évidence est insuffisante. Cette vertu d'enquête ne garantit pas la vérité – nous pouvons enquêter honnêtement et néanmoins nous tromper. Mais elle garantit l'intégrité intellectuelle, la préservation de notre faculté de jugement, et la contribution responsable au patrimoine commun de connaissances de l'humanité. L'agnosticisme, de ce point de vue, représente l'expression paradigmatique de cette vertu intellectuelle appliquée aux questions métaphysiques. L'agnostique reconnaît honnêtement que l'évidence concernant Dieu est insuffisante pour justifier une croyance ferme dans un sens ou dans l'autre. Cette reconnaissance n'est pas un aveu de faiblesse, mais une manifestation de force morale et d'intégrité intellectuelle. ==== Les objections à l'éthique cliffordienne de la croyance ==== L'éthique rigoriste de Clifford a suscité de nombreuses critiques, dont la plus célèbre provient de William James dans son essai « La volonté de croire » (1896). L'objection de l'impossibilité pratique : Les critiques soutiennent que la maxime de Clifford est impossible à satisfaire dans la pratique. Nous formons constamment des croyances sur la base d'évidences insuffisantes, simplement parce que la vie quotidienne l'exige. Lorsque je décide de traverser un pont, de manger au restaurant, de faire confiance à un ami, je ne procède pas à une enquête exhaustive – je crois sur la base d'indices limités et d'habitudes. Si nous appliquions rigoureusement la maxime de Clifford, nous serions paralysés par l'indécision. Clifford peut répondre qu'il existe une différence entre les croyances pratiques ordinaires (où un degré raisonnable de confiance suffit) et les croyances métaphysiques extraordinaires (comme l'existence de Dieu), qui requièrent des standards de preuve plus élevés. De plus, dans les cas pratiques, nous acceptons un certain risque d'erreur comme inévitable, tandis que dans les questions religieuses, nous prétendons souvent à une certitude absolue injustifiable. L'objection du volontarisme doxastique : Certains philosophes objectent que nous ne contrôlons pas volontairement nos croyances. Je ne peux pas décider de croire que 2+2=5 ou que je peux voler en battant des bras. Les croyances s'imposent à nous en fonction de notre constitution psychologique et de nos expériences. Si nous ne pouvons pas contrôler nos croyances, comment pourrions-nous être tenus moralement responsables de les avoir ? Cette objection soulève le problème complexe du volontarisme doxastique : pouvons-nous choisir nos croyances ? Clifford semble présupposer que oui, au moins indirectement. Même si nous ne pouvons pas croire par simple décision, nous pouvons contrôler le processus par lequel nous formons nos croyances : chercher activement l'information, examiner les preuves contraires, soumettre nos intuitions à l'examen critique, etc. La responsabilité porte sur ces actions indirectes qui influencent nos croyances. L'objection des « options vivantes » de William James : William James argumente que certaines questions pratiques et existentielles – notamment religieuses – constituent des « options vivantes, forcées et momentanées » où nous devons choisir même en l'absence d'évidence suffisante. Attendre des preuves définitives pourrait nous faire perdre un bien important (le salut, la relation avec Dieu, la vie spirituelle enrichie). Dans ces cas, affirme James, nous avons le droit de « vouloir croire », c'est-à-dire de laisser nos passions et nos espoirs influencer nos croyances. Clifford peut répondre que James confond croyance et action. Nous pouvons agir ''comme si'' Dieu existait (vivre moralement, participer à une communauté religieuse, cultiver la spiritualité) sans nécessairement ''croire'' que Dieu existe. L'agnosticisme pratique permet cette attitude : suspension du jugement théorique combinée à un engagement pratique. <ref>William James, "The Will to Believe", in The Will to Believe and Other Essays in Popular Philosophy, New York, Longmans, Green & Co., 1897, p. 1-31 ; trad. Loÿs Moulin, La Volonté de croire, Paris, Flammarion, coll. « Champs », 2005.</ref> ==== L'influence de Clifford sur l'agnosticisme contemporain ==== L'éthique de la croyance de Clifford a profondément influencé la pensée agnostique contemporaine en déplaçant le débat du terrain purement épistémologique au terrain éthique. L'agnosticisme n'est plus seulement une conclusion raisonnable face à l'insuffisance des preuves ; c'est une position moralement supérieure qui manifeste l'intégrité intellectuelle, le courage de douter et la responsabilité sociale. Cette dimension éthique renforce considérablement l'agnosticisme. Face aux croyants qui accusent les agnostiques de pusillanimité ou d'indifférence spirituelle, l'éthique cliffordienne retourne l'accusation : c'est le croyant sans preuves qui manque de courage intellectuel, qui préfère le confort de la certitude à la difficile honnêteté du doute. L'agnostique, loin d'être tiède ou lâche, manifeste une vertu épistémique exemplaire. De plus, la critique sociale de Clifford résonne fortement à notre époque de désinformation, de « fake news » et de crédulité généralisée. Son avertissement sur les dangers de la croyance sans critique apparaît prophétique : des sociétés où les individus acceptent les affirmations sans examen critique deviennent vulnérables au fanatisme, au populisme et à la manipulation. L'agnosticisme représente ainsi une forme de résistance intellectuelle contre la dégradation du discours public. ==== Clifford et l'agnosticisme comme position par défaut ==== L'éthique de Clifford suggère que l'agnosticisme devrait être la position par défaut concernant toute question pour laquelle l'évidence est insuffisante. Plutôt que de demander « Pourquoi es-tu agnostique concernant Dieu ? », nous devrions demander « Pourquoi crois-tu en Dieu malgré l'insuffisance des preuves ? ». Le fardeau de la justification ne pèse pas sur celui qui doute, mais sur celui qui affirme. Cette inversion correspond exactement au principe de la charge de la preuve que nous avons vu avec la théière de Russell. Mais Clifford ajoute une dimension éthique : non seulement l'affirmant doit fournir des preuves (argument logique), mais il ''devrait'' le faire (impératif moral). Croire sans preuves ne viole pas simplement les normes de rationalité ; cela viole un devoir moral envers soi-même et autrui. ==== Conclusion : l'agnosticisme comme vertu intellectuelle ==== L'éthique de la croyance de William Kingdon Clifford transforme l'agnosticisme d'une position épistémologique prudente en une vertu intellectuelle et morale. Selon Clifford, nous avons le devoir de former nos croyances de manière responsable, par un processus patient et honnête d'enquête. Croire en Dieu sans preuves suffisantes constitue non seulement une erreur intellectuelle, mais une faute morale qui corrompt notre intégrité, affaiblit notre jugement critique, et empoisonne le patrimoine commun de croyances de l'humanité. L'agnosticisme représente ainsi la réponse moralement appropriée à l'insuffisance des preuves concernant Dieu. Il manifeste le courage intellectuel de résister aux certitudes confortables, l'humilité épistémique de reconnaître les limites de notre savoir, et la responsabilité sociale de ne pas contribuer à la dégradation du discours rationnel. Cette dimension éthique de l'agnosticisme enrichit considérablement la position : il ne s'agit plus simplement de dire « je ne sais pas », mais de dire « je ne peux pas en bonne conscience prétendre savoir ce que je ne sais pas ». L'agnosticisme devient ainsi l'expression d'une conscience épistémique exigeante, d'un engagement envers la vérité et d'un refus de la complaisance intellectuelle. Comme le conclut Clifford dans une formule mémorable : « Le sentiment du devoir envers l'humanité en général me presse de ne pas laisser se propager la peste de la croyance par contagion, mais de m'efforcer de purifier l'air par lequel elle se répand. » L'agnosticisme, de ce point de vue, constitue un acte de salubrité publique intellectuelle, une contribution essentielle à la santé morale et épistémique de la société. == Variétés de l'agnosticisme == L'agnosticisme n'est pas une position monolithique, mais recouvre une famille de positions philosophiques distinctes qui partagent un air de famille : la reconnaissance des limites de notre connaissance concernant l'existence et la nature de Dieu. Ces différentes variétés se distinguent par leur évaluation de la permanence ou de la temporalité de notre ignorance, par leur attitude pratique face à cette ignorance, et par leur degré de confiance dans la possibilité future d'une connaissance. Examiner ces distinctions permet de saisir la richesse et la nuance de la pensée agnostique. === Agnosticisme faible et agnosticisme fort === La distinction la plus fondamentale oppose l'agnosticisme faible (ou temporaire, ou empirique) à l'agnosticisme fort (ou permanent, ou de principe). L'agnosticisme faible soutient que nous ne savons pas actuellement si Dieu existe, mais que cette ignorance est potentiellement provisoire. Il est concevable qu'à l'avenir, de nouvelles preuves, de nouvelles découvertes scientifiques ou de nouveaux arguments philosophiques nous permettent de trancher la question. L'agnostique faible adopte une attitude d'attentisme épistémique : il suspend son jugement en attendant que des éléments décisifs se présentent. Cette position repose sur l'idée que l'existence de Dieu est une question empirique en principe, même si nous manquons actuellement des moyens de la résoudre. Par analogie, avant l'invention du microscope, nous ne savions pas si des micro-organismes existaient ; mais cette ignorance était temporaire, liée à des limitations techniques. De même, selon l'agnostique faible, notre ignorance concernant Dieu pourrait être levée par des progrès futurs de l'investigation. L'agnostique faible peut arguer que certains développements conceptuels ou empiriques pourraient modifier la situation épistémique. Par exemple, si une théorie physique complète expliquait l'origine de l'univers sans recourir à un créateur transcendant, cela renforcerait considérablement la position athée. Inversement, si un événement extraordinaire – une manifestation divine publique, répétée et incontestable – se produisait, cela pourrait constituer une preuve décisive de l'existence de Dieu. L'agnosticisme fort (ou de principe), en revanche, affirme que la question de l'existence de Dieu est inconnaissable par principe, non pas accidentellement ou temporairement, mais structurellement. Les limites de notre connaissance ne sont pas des obstacles techniques provisoires, mais des frontières définitives inscrites dans la nature même de la question et dans nos facultés cognitives. Cette position s'appuie sur l'analyse kantienne des limites de la raison : Dieu, en tant qu'être transcendant, appartient au domaine nouménal inaccessible à la connaissance humaine. Notre appareil cognitif ne peut connaître que les phénomènes, c'est-à-dire ce qui nous est donné dans l'expérience spatio-temporelle. Un être hors de l'espace et du temps échappe définitivement à toute investigation possible. L'agnosticisme fort affirme donc une inconnaissabilité de principe : quels que soient les progrès futurs de la science ou de la philosophie, la question de Dieu restera indécidable. Herbert Spencer (1820-1903), philosophe évolutionniste britannique, a défendu une version de l'agnosticisme fort en affirmant que derrière les phénomènes observables se trouve une réalité ultime (l'« Inconnaissable ») qui dépasse définitivement nos capacités cognitives. Cette réalité peut être désignée comme « Dieu », mais rien de positif ne peut être dit à son sujet. Spencer concluait à une sorte de réconciliation entre religion et science : chacune reconnaît ses limites et laisse place à un mystère commun qu'aucune ne peut pénétrer. === Agnosticisme athée et agnosticisme théiste === Une autre distinction importante porte sur l'attitude pratique adoptée face à l'incertitude théorique. L'agnostique reconnaît qu'il ne ''sait'' pas si Dieu existe ; mais cette reconnaissance théorique laisse ouverte la question de savoir s'il ''croit'' en Dieu et comment il ''vit'' cette incertitude. L'agnosticisme athée (ou agnosticisme incliné vers l'athéisme) combine la suspension du jugement théorique avec une absence de croyance pratique. L'agnostique athée ne prétend pas savoir que Dieu n'existe pas, mais il ne croit pas non plus en Dieu et vit sa vie comme si Dieu n'existait pas. Sa position peut se formuler ainsi : « Je ne peux prouver que Dieu n'existe pas, mais en l'absence de preuves suffisantes de son existence, je n'ai aucune raison de croire en lui. » Bertrand Russell incarnait cette position. Dans sa conférence de 1958, il déclarait : « Je devrais me dire agnostique ; mais, à toutes fins pratiques, je suis athée. Je ne pense pas que l'existence du Dieu chrétien soit plus probable que celle des dieux de l'Olympe ou du Valhalla. » Pour Russell, l'agnosticisme théorique (« je ne peux prouver l'inexistence de Dieu ») se combine avec l'athéisme pratique (« je vis comme si Dieu n'existait pas »). Cette position repose sur le principe que labsence de preuve constitue une raison suffisante pour l'absence de croyance. Face à l'infinité des propositions possibles (la théière de Russell, les licornes invisibles, Zeus, Brahma, etc.), nous ne pouvons adopter une attitude de croyance neutre envers toutes. Nous suspendons par défaut notre croyance jusqu'à ce que des preuves suffisantes se présentent. L'agnostique athée applique ce principe à Dieu. L'agnosticisme théiste (parfois appelé fidéisme agnostique) adopte la position inverse : suspension du jugement théorique combinée avec une croyance pratique en Dieu. L'agnostique théiste reconnaît honnêtement qu'il ne possède pas de preuves rationnelles suffisantes de l'existence de Dieu, mais il choisit néanmoins de ''croire'' en Dieu et d'orienter sa vie selon cette croyance. Cette position trouve son expression philosophique la plus élaborée chez Søren Kierkegaard (1813-1855). Pour Kierkegaard, la foi authentique ne repose jamais sur des preuves rationnelles ou des certitudes objectives. Au contraire, la foi requiert un saut par-delà la raison, une décision existentielle prise dans l'incertitude et le risque. Kierkegaard écrit dans ''Crainte et Tremblement'' : « La foi commence précisément là où la pensée s'arrête. » Dans ses ''Miettes philosophiques'', Kierkegaard développe le concept de paradoxe absolu : l'incarnation de Dieu en Christ représente une contradiction logique pour la raison (l'éternel devenant temporel, l'infini se faisant fini). Face à ce paradoxe, deux attitudes sont possibles : le scandale (le rejet indigné de ce qui offense la raison) ou la foi (l'acceptation par un acte de volonté de ce qui dépasse la raison). La foi n'est pas un savoir, mais un choix existentiel engageant toute la personne. L'agnosticisme théiste affirme donc : « Je ne sais pas si Dieu existe, mais je ''choisis'' de croire et de vivre comme si Dieu existait. » Cette position peut sembler paradoxale – comment croire ce qu'on ne sait pas ? – mais elle repose sur une distinction entre connaissance objective et engagement subjectif. La connaissance objective demeure impossible, mais l'engagement subjectif reste légitime si la question revêt une importance existentielle suffisante. === Agnosticisme apophatique : la théologie négative === L'agnosticisme apophatique représente une variété particulière qui s'enracine dans une longue tradition théologique et mystique : la théologie négative ou théologie apophatique (du grec ''apophasis'', « négation »). Cette tradition, présente dans le christianisme oriental, le judaïsme (notamment chez Maïmonide) et l'islam soufi, soutient que Dieu est absolument transcendant et donc indicible. Toute affirmation positive concernant Dieu (« Dieu est bon », « Dieu est puissant ») déforme nécessairement sa nature, car elle applique des concepts humains finis à une réalité divine infinie. La théologie négative procède donc par négations : nous ne pouvons dire ce que Dieu ''est'', mais seulement ce qu'il ''n'est pas''. Dieu n'est pas un corps, n'est pas dans l'espace, n'est pas dans le temps, n'est pas limité, n'est pas multiple. Cette méthode s'inspire de la philosophie néoplatonicienne (Plotin, Proclus) qui affirmait que l'Un transcende toute détermination et toute conceptualisation. Le Pseudo-Denys l'Aréopagite (Ve-VIe siècle), figure majeure de cette tradition, distingue trois voies théologiques : la voie affirmative ou cataphatique (affirmer des attributs de Dieu), la voie négative ou apophatique (nier les attributs inadéquats), et la voie d'éminence (attribuer à Dieu les qualités en un degré suprême). Mais selon Denys, la voie négative est supérieure aux deux autres, car elle seule respecte la transcendance absolue du divin. Thomas d'Aquin reprend cette idée dans la ''Somme théologique'' (I, q. 3) : « De Dieu, nous ne pouvons savoir ce qu'il est, mais seulement ce qu'il n'est pas. » Cette position thomiste combine théologie négative et analogie : nous ne connaissons Dieu que par analogie avec les créatures, mais toute analogie demeure infiniment inadéquate. L'agnosticisme apophatique se distingue de l'agnosticisme ordinaire par son contexte religieux et mystique. L'agnostique ordinaire suspend son jugement faute de preuves suffisantes et peut vivre cette suspension avec indifférence. L'agnostique apophatique, lui, affirme l'inconnaissabilité de Dieu tout en maintenant une relation religieuse intense avec ce Dieu inconnaissable. Paradoxalement, les plus grands mystiques (Maître Eckhart, Jean de la Croix, Grégoire de Nysse) sont souvent agnostiques au sens précis : ils affirment que Dieu dépasse infiniment tout ce que nous pouvons penser ou dire de lui. Grégoire de Nysse (IVe siècle) écrit : « Ô Toi, l'au-delà de tout, de quel nom pouvons-nous t'invoquer ? Comment l'hymne peut-il te célébrer, toi que nulle parole ne peut exprimer ? Comment l'intelligence peut-elle t'appréhender, toi que nulle pensée ne peut saisir ? » Cette prière exprime la conscience mystique que Dieu échappe radicalement à toute conceptualisation humaine. === Ignosticisme et igthéisme : l'agnosticisme sémantique === L'ignosticisme (également appelé igthéisme) représente une position encore plus radicale. Plutôt que de suspendre le jugement sur l'existence de Dieu, l'ignostique soutient que la question même « Dieu existe-t-il ? » est dénuée de sens tant qu'aucune définition claire et cohérente de « Dieu » n'a été fournie. Cette position s'inspire du critère de signification de l'empirisme logique. Pour qu'une question ait un sens, il faut que les termes qu'elle emploie soient clairement définis. Or, le mot « Dieu » recouvre des significations extrêmement diverses : le Dieu personnel du théisme, le Dieu impersonnel de Spinoza, la Nature déifiée du panthéisme, le Premier Moteur aristotélicien, le Brahman de l'hindouisme, le Tao du taoïsme. Ces conceptions sont parfois mutuellement incompatibles. Tant que l'interlocuteur n'a pas précisé ce qu'il entend par « Dieu », la question de son existence reste indéterminée. L'ignostique demande donc : « Que veux-tu dire par "Dieu" ? » Selon la réponse, sa position changera. Si « Dieu » désigne simplement les lois de la nature, alors « Dieu » existe trivialement, mais ce n'est plus le Dieu des religions. Si « Dieu » désigne un être omnipotent, omniscient et omnibenevolent, alors l'ignostique demandera comment ces attributs peuvent être cohérents entre eux et avec l'expérience du monde (problème du mal). L'ignosticisme se rapproche du non-cognitivisme théologique, position selon laquelle les énoncés religieux n'ont pas de contenu cognitif, mais expriment seulement des attitudes émotives ou des engagements pratiques. Dire « Dieu existe » ne serait pas une affirmation factuelle susceptible d'être vraie ou fausse, mais une expression d'engagement religieux comparable à « Vive la République ! » ou « Hourra pour notre équipe ! ». === Agnosticisme apathique ou apatheïsme === L'agnosticisme apathique (ou apatheïsme, du grec ''apathos'', « sans passion ») désigne l'attitude de ceux qui considèrent que la question de l'existence de Dieu est non seulement indécidable, mais aussi pragmatiquement sans importance. Qu'importe que Dieu existe ou non, cela ne change rien à la manière dont nous devons vivre, aux valeurs morales que nous devons adopter, ou aux questions pratiques qui se posent à nous. Cette position s'énonce ainsi : « Je ne sais pas si Dieu existe, et cela m'est égal. » L'agnostique apathique ne souffre d'aucune angoisse métaphysique concernant les questions ultimes. Il considère que l'éthique, le sens de la vie, le bonheur peuvent être fondés sur des bases purement humaines, sans référence à une transcendance hypothétique. Denis Diderot (1713-1784), dans sa ''Lettre sur les aveugles'', suggère une forme d'agnosticisme apathique : « Il est très important de ne pas prendre de la ciguë pour du persil ; mais nullement de croire ou de ne pas croire en Dieu. » Pour Diderot, les questions théologiques sont des spéculations oiseuses qui détournent l'attention des véritables urgences morales et sociales. L'apatheïsme contemporain reflète souvent une sécularisation avancée où les questions religieuses ont perdu leur centralité culturelle. Dans les sociétés fortement sécularisées (Scandinavie, Japon, Europe occidentale), beaucoup de personnes vivent sans jamais se poser sérieusement la question de Dieu. Ce n'est pas qu'ils ont examiné les arguments et conclu à l'impossibilité de savoir ; c'est que la question ne se pose tout simplement pas à eux comme pertinente. === Agnosticisme modèle et agnosticisme strict === L'épistémologue contemporain distingue parfois l'agnosticisme comme absence de croyance (agnosticisme modèle) et l'agnosticisme comme croyance positive dans l'inconnaissabilité (agnosticisme strict). L'agnosticisme modèle se contente d'une position négative : l'absence de croyance tant en l'existence qu'en l'inexistence de Dieu. Cette position ne requiert aucune justification positive ; elle découle simplement du manque de preuves suffisantes dans les deux directions. L'agnosticisme strict, en revanche, affirme positivement que la connaissance est impossible. Cette affirmation requiert elle-même une justification : pourquoi serait-il impossible de connaître l'existence ou l'inexistence de Dieu ? L'agnostique strict doit fournir des arguments (comme l'analyse kantienne des limites de la raison, ou le principe humien de l'empirisme) pour soutenir sa thèse d'inconnaissabilité. === Tableau récapitulatif des variétés d'agnosticisme === Pour clarifier ces distinctions, voici un tableau synoptique : {| class="wikitable" style="text-align:center; width: 90%; margin: auto; border: 1px solid #aaa; border-collapse: collapse;" |- ! style="background:#ccc; width: 35%;" | Type d'agnosticisme ! style="background:#ccc; width: 35%;" | Affirmation centrale ! style="background:#ccc; width: 30%;" | Attitude pratique |- | Agnosticisme faible | Nous ne savons pas actuellement | Attente de preuves futures |- | Agnosticisme fort | Nous ne pouvons pas savoir par principe | Reconnaissance définitive de l'ignorance |- | Agnosticisme athée | Je ne sais pas, donc je ne crois pas | Vie sans référence à Dieu |- | Agnosticisme théiste | Je ne sais pas, mais je crois | Engagement religieux malgré l'incertitude |- | Agnosticisme apophatique | Dieu est absolument inconnaissable | Spiritualité négative, voie mystique |- | Ignosticisme | La question manque de sens | Demande de clarification conceptuelle |- | Agnosticisme apathique | La question n'a pas d'importance | Indifférence pratique |} === La pertinence contemporaine de ces distinctions === Ces distinctions ne sont pas de simples subtilités académiques. Elles reflètent des attitudes existentielles profondément différentes face à l'incertitude métaphysique. Reconnaître la diversité des agnosticismes permet d'éviter les caricatures simplistes (« l'agnostique est quelqu'un qui ne veut pas se mouiller ») et de saisir la richesse philosophique et spirituelle de ces positions. De plus, ces distinctions ont des implications pratiques significatives pour le dialogue interreligieux et la vie en société pluraliste. Un agnostique apathique et un agnostique théiste kierkegaardien n'auront pas les mêmes attitudes envers les institutions religieuses, l'éducation religieuse des enfants, ou la place de la religion dans l'espace public. Enfin, ces variétés montrent que l'agnosticisme n'est pas une position de facilité, un refuge confortable pour éviter l'engagement. C'est une famille de positions réfléchies, nuancées, qui tentent de répondre honnêtement à la question : comment vivre et penser face à l'incertitude ultime concernant les fondements de la réalité ? Certaines de ces positions (l'agnosticisme fort, l'agnosticisme apophatique) exigent un courage intellectuel considérable : accepter que certaines questions fondamentales resteront à jamais sans réponse, et néanmoins continuer à vivre de manière sensée et engagée. D'autres (l'agnosticisme théiste) requièrent le courage existentiel de s'engager sans garanties rationnelles, de parier sur le sens malgré l'absence de certitude. D'autres encore (l'ignosticisme) demandent la rigueur analytique de déconstruire les présupposés conceptuels cachés dans nos questions les plus familières. Cette diversité témoigne de la vitalité philosophique de l'agnosticisme, qui n'est pas une doctrine figée, mais un questionnement vivant sur les limites de notre connaissance et les possibilités de notre existence face à l'inconnu. == Objections à l'agnosticisme == L'agnosticisme, malgré sa rigueur philosophique apparente, n'est pas à l'abri de critiques. Théologiens, philosophes religieux et même certains athées ont formulé des objections substantielles contre la position agnostique. Ces objections proviennent de perspectives diverses et touchent aux fondements épistémologiques, éthiques et existentiels de l'agnosticisme. Examiner ces critiques permet non seulement de tester la solidité de l'agnosticisme, mais aussi d'en affiner la compréhension. === L'objection pascalienne : l'impossibilité de la neutralité === La critique la plus célèbre et peut-être la plus puissante contre l'agnosticisme provient de Blaise Pascal (1623-1662) et de son fameux « pari », formulé dans les ''Pensées'' (1670). ==== La structure du pari ==== Pascal soutient qu'en matière de croyance religieuse, la neutralité est impossible. « Vous êtes embarqué », déclare-t-il : que nous le voulions ou non, nous vivons d'une manière qui implique un choix pratique concernant Dieu. Même l'agnostique qui suspend théoriquement son jugement vit nécessairement soit ''comme si'' Dieu existait, soit ''comme si'' Dieu n'existait pas. L'abstention théorique ne dispense pas du choix pratique. Pascal formule alors le problème en termes de théorie de la décision, anticipant ainsi le calcul des probabilités qu'il contribua lui-même à fonder. Nous faisons face à une matrice de décision : {| class="wikitable" style="text-align:center; width: 70%; margin: auto;" |- ! ! Dieu existe ! Dieu n'existe pas |- | Parier pour Dieu | Gain infini (salut éternel) | Perte finie (plaisirs terrestres sacrifiés) |- | Parier contre Dieu | Perte infinie (damnation éternelle) | Gain fini (plaisirs terrestres conservés) |} L'analyse rationnelle de cette matrice conduit, selon Pascal, à une conclusion évidente : parier pour Dieu ''domine'' strictement l'alternative. Dans le pire des cas (Dieu n'existe pas), le croyant ne perd que des biens finis et temporaires. Dans le meilleur des cas (Dieu existe), il gagne un bien infini et éternel. Inversement, l'incroyant risque une perte infinie pour un gain fini. La rationalité prudente commande donc de parier sur l'existence de Dieu, indépendamment de la probabilité qu'on lui attribue (pourvu qu'elle ne soit pas exactement nulle). ==== Les réponses agnostiques au pari ==== L'agnostique peut répondre à Pascal sur plusieurs plans. Premièrement, le pari confond croyance authentique et profession de foi stratégique. Pascal lui-même reconnaît ce problème : comment acquérir une croyance sincère par simple calcul d'intérêt ? Il répond en recommandant de « prendre de l'eau bénite, faire dire des messes », c'est-à-dire d'adopter les comportements des croyants jusqu'à ce que la croyance vienne. Mais cette solution soulève une question morale : Dieu ne serait-il pas capable de distinguer la foi authentique de la foi calculatrice ? Une croyance adoptée pour ses bénéfices escomptés plutôt que pour sa vérité n'est-elle pas une forme d'hypocrisie qui devrait déplaire à un Dieu omniscient ? Deuxièmement, l'objection des révélations incompatibles : Pascal présuppose le Dieu chrétien, mais le pari s'applique également à d'autres conceptions divines mutuellement exclusives. Le musulman pourrait formuler le même pari pour Allah, l'hindou pour Vishnou, le païen pour Zeus. Si nous prenons au sérieux le pari, nous devrions croire simultanément en toutes les divinités possibles – ce qui est logiquement impossible lorsque ces divinités se contredisent. Face à cette multiplicité, l'agnosticisme redevient rationnel : suspendre son jugement entre des options incompatibles dont aucune ne se distingue épistémiquement des autres. Troisièmement, Pascal suppose que Dieu, s'il existe, récompense la croyance et punit l'incroyance. Mais cette supposition n'est pas évidente. On peut concevoir un Dieu qui valorise l'honnêteté intellectuelle et l'humilité épistémique de l'agnostique plutôt que la foi sans preuves. Un « Dieu des philosophes » pourrait préférer celui qui dit honnêtement « je ne sais pas » à celui qui prétend savoir ce qu'il ne sait pas. Dans ce cas, l'agnosticisme serait la position à parier, non le théisme. Quatrièmement, même si nous acceptions la logique du pari, celui-ci justifierait au mieux un théisme minimal et prudentiel, non l'adhésion à une religion particulière avec ses dogmes spécifiques. Or, Pascal veut nous conduire au catholicisme. Le passage du théisme général aux doctrines spécifiques (Trinité, incarnation, transsubstantiation) requiert des arguments supplémentaires que le pari ne fournit pas. === L'objection thomiste : l'existence de Dieu est démontrable === La tradition scolastique, notamment Thomas d'Aquin (1225-1274), soutient que l'existence de Dieu n'est pas une question indécidable, mais peut être démontrée rationnellement par la philosophie naturelle. ==== Les cinq voies de Thomas d'Aquin ==== Dans la ''Somme théologique'' (I, q. 2, a. 3), Thomas propose cinq démonstrations de l'existence de Dieu, partant de faits d'expérience pour remonter à leur cause ultime : 1. L'argument du mouvement : Tout ce qui est mû est mû par un autre. Or, la série des moteurs ne peut remonter à l'infini. Il faut donc un Premier Moteur immobile, que tous reconnaissent comme Dieu. 2. L'argument de la cause efficiente : Tout effet a une cause. La chaîne des causes ne pouvant être infinie, il faut une Cause première incausée. 3. L'argument de la contingence : Les êtres du monde sont contingents (ils auraient pu ne pas exister). Or, si tout était contingent, rien n'existerait. Il faut donc un Être nécessaire, qui est Dieu. 4. L'argument des degrés de perfection : Nous constatons des degrés de bonté, de vérité, de beauté dans les choses. Ces degrés impliquent un maximum absolu qui est leur cause, à savoir Dieu. 5. L'argument téléologique : Les êtres naturels dépourvus de connaissance agissent en vue d'une fin, ce qui suppose une Intelligence ordonna trice. Pour Thomas, ces arguments établissent rationnellement non seulement qu'un Dieu existe, mais qu'il possède certains attributs (nécessité, perfection, intelligence). L'agnosticisme serait donc une position déraisonnable, refusant d'accepter des conclusions pourtant démonstrées. ==== Les réponses agnostiques à Thomas ==== L'agnostique peut contester chacune de ces « voies ». Concernant les trois premières (mouvement, causalité, contingence), la critique kantienne a montré qu'elles appliquent illégitimement les catégories de l'entendement (causalité, nécessité) au-delà du domaine de l'expérience possible. Pourquoi la série des causes devrait-elle avoir un commencement ? L'impossibilité d'une régression infinie n'est qu'une limitation de notre imagination, non une vérité métaphysique. De plus, même si nous admettions un Premier Moteur, une Cause première ou un Être nécessaire, rien ne prouve qu'il s'agisse du Dieu personnel des religions plutôt que d'un principe métaphysique impersonnel. L'argument des degrés de perfection repose sur une métaphysique platonicienne contestable : l'existence de degrés implique-t-elle nécessairement un maximum absolu ? Nous constatons des degrés de chaleur sans postuler une Chaleur maximale absolue. L'argument confond peut-être des échelles relatives avec des perfections absolues. L'argument téléologique (également critiqué par Hume et Darwin) suppose que l'ordre naturel requiert une explication intentionnelle. Mais les sciences modernes expliquent l'apparence de finalité par des mécanismes aveugles (sélection naturelle en biologie, lois physiques en cosmologie) sans recourir à une Intelligence ordonna trice. Plus fondamentalement, même si ces arguments établissaient l'existence d'un principe métaphysique ultime, ils ne prouveraient pas le Dieu des religions : un être personnel, provident, accessible à la prière, source de révélations. Le fossé entre le « Dieu des philosophes » et le « Dieu d'Abraham, d'Isaac et de Jacob » (pour reprendre la distinction pascalienne) reste infranchissable par la seule raison naturelle. === L'objection de l'épistémologie réformée : la croyance proprement basique === Au XXe siècle, le philosophe Alvin Plantinga a développé une critique sophistiquée de l'évidentialisme et de l'agnosticisme dans le cadre de ce qu'on appelle l'épistémologie réformée (''Reformed Epistemology'').<ref>Alvin Plantinga, "Reason and Belief in God", in Alvin Plantinga et Nicholas Wolterstorff (éd.), Faith and Rationality: Reason and Belief in God, Notre Dame, University of Notre Dame Press, 1983, p. 16-93 ; Warranted Christian Belief, Oxford, Oxford University Press, 2000, 528 p.</ref> ==== La thèse de Plantinga ==== Plantinga soutient que la croyance en Dieu peut être proprement basique (''properly basic''), c'est-à-dire rationnellement justifiée sans reposer sur d'autres croyances ou sur des preuves. De même que nous tenons pour justifiées certaines croyances perceptuelles (« je vois un arbre »), mémorielles (« j'ai mangé ce matin ») ou introspectives (« j'ai mal ») sans les dériver d'arguments, la croyance en Dieu pourrait être directement justifiée par une expérience immédiate du divin. Plantinga s'inspire de Jean Calvin, qui postulait un ''sensus divinitatis'', une capacité cognitive innée nous permettant de percevoir Dieu dans certaines circonstances (contemplation de la nature, sentiment de culpabilité, gratitude). Cette faculté, si elle fonctionne correctement, produit des croyances théistes justifiées sans médiation argumentative. Plantinga développe une théorie de la justification appelée fonctionnalisme propre (''proper functionalism'') : une croyance est justifiée si elle est produite par nos facultés cognitives fonctionnant correctement, dans un environnement approprié, selon un plan de conception visant la vérité. Si Dieu existe et a créé en nous un ''sensus divinitatis'', alors les croyances théistes produites par cette faculté sont justifiées, même sans preuves. ==== Les réponses agnostiques à Plantinga ==== L'agnostique peut objecter à plusieurs niveaux. Premièrement, l'épistémologie réformée est circulaire : elle suppose que Dieu existe pour établir que la croyance en Dieu est justifiée. Plantinga répond que ce n'est pas problématique : il ne prétend pas ''prouver'' que la croyance en Dieu est justifiée, mais seulement montrer que ''si'' Dieu existe, ''alors'' la croyance en lui peut être justifiée. Mais cette conditionnelle ne résout pas le problème de l'agnostique, qui demande précisément : ''comment savons-nous que Dieu existe'' ? Deuxièmement, le critère de Plantinga (fonctionnement propre des facultés cognitives) est trop permissif. Un musulman pourrait affirmer que sa croyance en Allah est proprement basique, un hindou sa croyance en Brahman, un polythéiste sa croyance en Zeus. Si toutes ces croyances mutuellement incompatibles peuvent être « proprement basiques », le concept perd toute force normative. Plantinga répond qu'une seule de ces croyances peut être vraie, et que seule celle qui est vraie sera également justifiée (si produite par un ''sensus divinitatis'' authentique). Mais cela ramène au problème initial : comment distinguer le véritable ''sensus divinitatis'' des illusions ou des facultés défaillantes ? Troisièmement, l'épistémologie réformée ne fournit aucun critère public et intersubjectif pour évaluer les croyances religieuses. La science et la philosophie progressent précisément parce qu'elles reposent sur des méthodes partageables, des preuves vérifiables, des arguments évaluables par tous. En faisant de la croyance religieuse une affaire de « fonctionnement propre » d'une faculté interne, Plantinga privatise la justification et rend impossible le dialogue rationnel entre croyants et non-croyants. === L'objection du réglage fin : l'argument cosmologique contemporain === Les avancées récentes en cosmologie et en physique ont donné naissance à une nouvelle version de l'argument téléologique : l'argument du réglage fin (''fine-tuning'') de l'univers. ==== La structure de l'argument ==== Les constantes fondamentales de la physique (constante gravitationnelle, charge de l'électron, constante cosmologique, etc.) semblent ajustées avec une précision extraordinaire pour permettre l'existence de la vie. Si ces constantes différaient même très légèrement de leurs valeurs actuelles, l'univers ne pourrait contenir ni atomes, ni étoiles, ni planètes, ni vie. Par exemple, si la force gravitationnelle était plus forte de seulement 1 part sur 10^40, l'univers se serait effondré sur lui-même en quelques instants ; si elle était plus faible, les étoiles et les galaxies n'auraient jamais pu se former. Les théistes argumentent que ce réglage fin extrême est hautement improbable sous l'hypothèse naturaliste (hasard aveugle), mais prévisible sous l'hypothèse théiste (dessein intelligent). Donc, par inférence à la meilleure explication, le réglage fin constitue une preuve de l'existence d'un Créateur intelligent. ==== Les réponses agnostiques au réglage fin ==== L'agnostique dispose de plusieurs ripostes. Premièrement, l'argument du principe anthropique : nous ne pouvons observer que des univers compatibles avec notre existence. Si l'univers n'était pas « réglé » pour la vie, nous ne serions pas là pour nous en étonner. Cette observation n'est donc pas surprenante et ne requiert aucune explication spéciale. C'est comme si un survivant de peloton d'exécution s'étonnait que tous les tireurs aient raté : sa survie est la condition de possibilité de son étonnement. Deuxièmement, l'hypothèse du multivers : si un nombre immense (voire infini) d'univers existent avec des constantes physiques différentes, il n'est pas surprenant qu'au moins un soit compatible avec la vie – et nous nous trouvons nécessairement dans celui-là. Cette hypothèse, bien que spéculative, trouve un appui dans certaines théories cosmologiques (inflation éternelle, interprétation des mondes multiples en physique quantique). Troisièmement, l'objection de l'anthropocentrisme : pourquoi l'univers devrait-il être « réglé » pour produire spécifiquement la vie humaine ? Si un Créateur tout-puissant voulait créer des êtres conscients, pourquoi choisir une méthode aussi indirecte et gaspilleuse (milliards d'années, milliards de galaxies, pour produire une seule planète habitée) ? Le réglage fin pourrait tout aussi bien être une contrainte physique nécessaire dont nous ignorons la raison, plutôt qu'une preuve de dessein. Quatrièmement, même si nous acceptions que le réglage fin requiert une explication, l'hypothèse « Dieu » ne fait que déplacer le problème : qui a « réglé » Dieu pour qu'il ait les attributs précis (intelligence, créativité, volonté) permettant de créer un univers ? Si Dieu peut exister sans explication, pourquoi l'univers ne le pourrait-il pas ? === L'objection existentialiste : l'agnosticisme comme fuite devant l'engagement === Certains philosophes existentialistes ont critiqué l'agnosticisme non pas pour des raisons épistémologiques, mais pour des raisons existentielles et éthiques. ==== La critique kierkegaardienne ==== Pour Kierkegaard, l'agnosticisme représente une forme de lâcheté existentielle, un refus de s'engager authentiquement face à la question qui définit notre existence. La vie humaine ne tolère pas la neutralité : ne pas choisir, c'est déjà choisir (choisir de vivre sans Dieu). L'agnostique qui suspend son jugement se berce de l'illusion qu'il peut rester spectateur impartial, alors qu'il est nécessairement acteur embarqué dans le drame de l'existence. Pour Kierkegaard, la foi n'est pas une conclusion rationnelle à laquelle on parvient après examen des preuves, mais un saut dans l'incertitude, un engagement passionné malgré l'absence de garanties objectives. L'agnosticisme, en demandant des certitudes avant de s'engager, manifeste une incompréhension de la nature même de la foi et de l'existence humaine. C'est vouloir traverser la mer sans se mouiller. ==== Réponse agnostique ==== L'agnostique peut rétorquer que confondre prudence épistémique et lâcheté existentielle est un sophisme rhétorique. Reconnaître honnêtement qu'on ne sait pas n'est pas fuir l'engagement, mais refuser l'engagement dogmatique injustifié. On peut vivre une existence pleinement engagée, moralement riche et existentiellement authentique sans prétendre connaître ce qu'on ne connaît pas. De plus, la critique kierkegaardienne suppose que la question de Dieu est ''la'' question existentielle décisive. Mais pourquoi ? Pour un agnostique, les questions morales, les relations humaines, la création de sens dans un univers potentiellement indifférent peuvent être tout aussi existentiellement significatives sans référence à une transcendance hypothétique. L'héroïsme existentiel peut consister précisément à assumer l'incertitude sans se réfugier dans des certitudes illusoires. === L'objection pragmatiste : les conséquences de la croyance === William James, dans ''La volonté de croire'' (1896), critique l'agnosticisme cliffordien en soutenant que dans certaines situations, nous avons le droit de croire même sans preuves suffisantes. ==== L'argument de James ==== James distingue les « options » (choix) selon trois critères : 1. Vivante ou morte : une option est vivante si elle représente une possibilité réelle pour le sujet. 2. Forcée ou évitable : une option est forcée si ne pas choisir équivaut à choisir. 3. Momentanée ou triviale : une option est momentanée si la décision ne peut être remise à plus tard sans perte irréparable. La question religieuse, selon James, constitue une option vivante, forcée et momentanée pour beaucoup de personnes. Dans ces conditions, suspendre indéfiniment son jugement (position agnostique) revient pratiquement à choisir l'athéisme, avec tous les coûts potentiels associés (perte de la consolation religieuse, du sens, de la communauté, et peut-être du salut). James argumente que lorsqu'une question présente ces caractéristiques et que les preuves intellectuelles sont insuffisantes, nous avons le droit de laisser nos « passions » (désirs, espoirs, besoins) influencer notre croyance. ==== Réponse agnostique ==== L'agnostique peut objecter que James confond croyance et action. Nous pouvons ''agir comme si'' une hypothèse était vraie (par exemple, vivre moralement, participer à une communauté religieuse) sans ''croire'' fermement qu'elle est vraie. L'agnosticisme pratique permet cette attitude. De plus, James présuppose que la croyance en Dieu apporte nécessairement des bénéfices psychologiques et existentiels. Mais cela dépend de la personnalité et des circonstances. Pour certains, la croyance religieuse génère anxiété (peur de l'enfer), culpabilité (péché), ou conflit cognitif (dissonance entre foi et raison). Dans ces cas, l'agnosticisme peut être psychologiquement libérateur plutôt qu'appauvrissant. Enfin, la méthode jamesienne ouvre la porte à la pensée magique : si nous avons le droit de croire sans preuves chaque fois qu'une croyance pourrait nous être bénéfique, nous justifions également les superstitions, les pseudo-sciences et toutes sortes de croyances réconfortantes mais fausses. L'éthique cliffordienne de la croyance, malgré sa sévérité, protège contre cette dérive en maintenant un lien rigoureux entre croyance et évidence. === Conclusion : l'agnosticisme face à ses critiques === Ces objections révèlent les tensions inhérentes à l'agnosticisme. La position agnostique doit naviguer entre plusieurs écueils : le radicalisme évidentialiste qui exigerait des preuves impossibles, et le laxisme épistémique qui justifierait n'importe quelle croyance ; la sécheresse intellectuelle de la pure suspension du jugement, et l'engagement existentiel dans un monde incertain ; la cohérence logique, et la pertinence existentielle. Aucune de ces objections n'est décisive prise isolément, mais ensemble elles obligent l'agnostique à affiner sa position. L'agnosticisme mature reconnaît ses limites : il ne prétend pas résoudre toutes les questions existentielles ni fournir une recette pour vivre. Il offre simplement une position épistémique honnête face à l'incertitude ultime, laissant chacun libre de déterminer comment vivre sous l'horizon de cette incertitude. == L'agnosticisme et la pensée contemporaine == L'agnosticisme n'appartient pas qu'à l'histoire de la philosophie ; il reste une position vivante et pertinente dans le paysage intellectuel contemporain. Les développements récents de la philosophie analytique, de l'épistémologie, des sciences cognitives et de la sociologie ont enrichi et complexifié le débat sur l'agnosticisme. Cette section examine comment la pensée du XXe et XXIe siècles a transformé, critiqué et parfois réhabilité la position agnostique. === Le falsificationnisme de Popper et l'agnosticisme méthodologique === Karl Popper (1902-1994) a profondément influencé la manière dont nous concevons les limites entre science et métaphysique, avec des implications directes pour l'agnosticisme. ==== Le critère de falsifiabilité ==== Dans ''La Logique de la découverte scientifique'' (1934)<ref>Karl Popper, Logik der Forschung, Vienne, Julius Springer, 1934 ; trad. Nicole Thyssen-Rutten et Philippe Devaux, La Logique de la découverte scientifique, Paris, Payot, 1973, 480 p.</ref>, Popper propose son célèbre critère de démarcation entre énoncés scientifiques et énoncés métaphysiques. Un énoncé est scientifique si, et seulement si, il est falsifiable (''falsifiable'', non ''falsifié''), c'est-à-dire s'il existe des observations empiriques possibles qui, si elles se produisaient, réfuteraient l'énoncé. Par exemple, l'énoncé « tous les cygnes sont blancs » est scientifique car falsifiable : l'observation d'un seul cygne noir le réfuterait. En revanche, l'énoncé « Dieu existe » n'est pas falsifiable : aucune observation concevable ne pourrait le réfuter définitivement, car on peut toujours réinterpréter les données pour les rendre compatibles avec l'existence divine. De même, « Dieu n'existe pas » n'est pas falsifiable. Par conséquent, selon Popper, la question de l'existence de Dieu n'appartient pas au domaine de la science, mais à celui de la métaphysique. ==== L'agnosticisme méthodologique de la science ==== Cette position implique ce qu'on peut appeler un agnosticisme méthodologique : la science, en tant que discipline, doit procéder ''comme si'' les questions métaphysiques (dont celle de Dieu) étaient hors de son ressort. Ce n'est pas que ces questions soient dénuées de sens ou d'importance, mais elles n'appartiennent pas au domaine du savoir scientifique proprement dit. Popper lui-même n'était pas agnostique au sens religieux. Il se considérait comme rationaliste et rejetait le dogmatisme sous toutes ses formes, qu'il soit religieux ou scientiste. Mais son critère de falsifiabilité établit une forme d'agnosticisme épistémologique concernant toute question qui échappe structurellement à la méthode scientifique. Cette perspective a une conséquence importante : elle délimite rigoureusement les magistères respectifs de la science et de la religion (pour reprendre la terminologie de Stephen Jay Gould). La science peut dire que l'univers a 13,8 milliards d'années, que la vie a évolué par sélection naturelle, que les neurones produisent la conscience – mais elle ne peut pas dire si un Créateur transcendant existe au-delà de la nature observable. Sur cette question ultime, l'agnosticisme scientifique s'impose. ==== Le faillibilisme poppérien ==== Popper développe également une philosophie générale du savoir qu'il nomme faillibilisme : toute notre connaissance est conjecturale et provisoire ; nous ne possédons jamais de certitudes absolues, seulement des théories qui ont jusqu'ici résisté aux tentatives de réfutation. Cette perspective renforce l'agnosticisme : si même nos meilleures théories scientifiques restent conjecturales, à plus forte raison nos croyances métaphysiques doivent-elles demeurer hypothétiques. Le faillibilisme poppérien suggère une attitude épistémique générale d'humilité et d'ouverture à la révision. L'agnosticisme représente l'application de cette attitude à la question de Dieu : reconnaître que nous ne possédons pas de connaissance certaine, que nos arguments sont provisoires, que la vérité pourrait être différente de ce que nous croyons. === Le néo-positivisme et l'hypothèse théologique === Le Cercle de Vienne (années 1920-1930) et l'empirisme logique ont adopté une position encore plus radicale que Popper concernant les énoncés métaphysiques. ==== Le principe de vérification et ses conséquences ==== Pour les néo-positivistes comme Rudolf Carnap, Moritz Schlick et A.J. Ayer, un énoncé n'a de signification cognitive que s'il est soit analytique (vrai par définition), soit vérifiable empiriquement. Un énoncé qui ne satisfait aucun de ces critères est littéralement dénué de sens (''sinnlos''), comparable aux sons d'un instrument de musique : grammaticalement correct mais sémantiquement vide. Appliqué à la théologie, ce critère est dévastateur. L'énoncé « Dieu existe » n'est ni analytique (car l'existence n'est pas contenue dans le concept de Dieu, comme l'a montré Kant), ni vérifiable empiriquement (aucune observation ne peut confirmer ou infirmer définitivement l'existence d'un être transcendant). Donc, selon les néo-positivistes, cet énoncé est dénué de signification. Il n'est ni vrai ni faux ; il n'appartient pas au domaine des propositions ayant un contenu informatif sur la réalité. Cette position dépasse l'agnosticisme classique. Là où l'agnostique suspend son jugement sur une question qu'il considère comme significative mais indécidable, le néo-positiviste rejette la question elle-même comme mal formée. La question « Dieu existe-t-il ? » n'appelle pas de réponse ; elle appelle une dissolution par clarification conceptuelle. ==== L'échec du vérificationnisme strict ==== Toutefois, le principe de vérification s'est heurté à des objections décisives. Premièrement, il est auto-réfutant : l'énoncé « seuls les énoncés vérifiables ont un sens » n'est lui-même ni analytique ni vérifiable empiriquement ; il devrait donc être dénué de sens selon ses propres critères. Deuxièmement, de nombreux énoncés scientifiques théoriques (concernant des entités non observables comme les quarks, les trous noirs, ou les dimensions supplémentaires de la théorie des cordes) ne sont pas strictement vérifiables, sans pour autant être dénués de sens. Ces difficultés ont conduit la plupart des philosophes à abandonner le vérificationnisme strict. Mais l'intuition sous-jacente demeure : les énoncés théologiques posent des problèmes sémantiques et épistémologiques spécifiques qui justifient une attitude agnostique. ==== Le tournant linguistique et l'analyse du langage religieux ==== Le tournant linguistique de la philosophie au XXe siècle, inauguré par Wittgenstein, Carnap et les philosophes du langage ordinaire (Austin, Ryle), a transformé la manière d'aborder les questions théologiques. Le second Wittgenstein, dans les ''Investigations philosophiques'' (1953), propose une approche radicalement différente du langage. Plutôt que de chercher ''la'' signification d'un terme, il faut examiner ses ''usages'' dans différents « jeux de langage ». Le langage religieux, selon cette perspective, ne fonctionne pas comme le langage scientifique : il n'a pas pour fonction principale de décrire des faits, mais d'exprimer des attitudes, de constituer une forme de vie, de créer du sens existentiel. Cette analyse conduit à une forme sophistiquée d'ignosticisme ou de non-cognitivisme théologique : les énoncés religieux (« Dieu existe », « Dieu est amour ») ne sont peut-être pas des affirmations factuelles susceptibles d'être vraies ou fausses, mais des expressions d'engagement existentiel, comparables à « Vive la République ! » ou « J'accepte de t'épouser ». Si tel est le cas, la question « Dieu existe-t-il vraiment ? » repose sur une confusion de catégories, comme si l'on demandait « L'enthousiasme existe-t-il vraiment ? » en réponse à « Vive la République ! ». === L'agnosticisme et les sciences cognitives de la religion === Les dernières décennies ont vu l'émergence d'un champ interdisciplinaire : les sciences cognitives de la religion (SCR), qui étudient les bases psychologiques et évolutives des croyances religieuses. ==== Les explications naturalistes de la croyance religieuse ==== Des chercheurs comme Pascal Boyer, Scott Atran, Justin Barrett et Ara Norenzayan ont montré que les croyances religieuses (agents surnaturels, vie après la mort, rituels, morale cosmique) sont des sous-produits (''by-products'') de mécanismes cognitifs qui ont évolué pour d'autres raisons. Par exemple, nous possédons un détecteur d'agents hyperactif (''hyperactive agency detection device'', HADD) qui nous fait percevoir des intentions et des agents même là où il n'y en a peut-être pas. Ce mécanisme a une valeur de survie : mieux vaut percevoir un prédateur qui n'existe pas que manquer un prédateur qui existe. Mais ce même mécanisme nous dispose à percevoir des agents invisibles (esprits, dieux, ancêtres) derrière les événements naturels. De même, notre théorie de l'esprit (capacité à attribuer des états mentaux à autrui) s'applique spontanément aux phénomènes naturels (« le volcan est en colère ») et nous prédispose à concevoir des esprits désincarnés. Notre dualisme intuitif (distinction spontanée entre corps et esprit) rend naturelle l'idée d'âmes immortelles et de divinités immatérielles. ==== Implications pour l'agnosticisme ==== Ces découvertes renforcent l'agnosticisme de plusieurs manières. Premièrement, elles montrent que la croyance religieuse s'explique entièrement par des causes naturelles (psychologie évolutive, structures cognitives innées, besoins sociaux), sans qu'il soit nécessaire de postuler une réalité transcendante objective. La croyance en Dieu pourrait être une illusion adaptative, utile pour la survie et la cohésion sociale, mais néanmoins illusoire. Deuxièmement, elles suggèrent que nos intuitions religieuses ne sont pas des perceptions fiables d'une réalité divine, mais des artefacts de notre architecture cognitive façonnée par la sélection naturelle. De même que nos illusions d'optique ne révèlent pas la réalité physique mais les limites de notre système visuel, nos intuitions théistes pourraient ne révéler que les biais de notre cognition religieuse. Troisièmement, la diversité radicale des croyances religieuses à travers les cultures s'explique par des variations culturelles dans l'expression de dispositions cognitives universelles. Cette diversité rend encore plus improbable l'idée qu'une de ces croyances soit une perception véridique du divin. ==== Les objections à l'argument des sciences cognitives de la religion ==== Les théistes objectent que ces explications naturalistes commettent le sophisme génétique : expliquer l'origine d'une croyance n'en détermine pas la valeur de vérité. De même qu'expliquer neurologiquement nos croyances mathématiques ne les invalide pas, expliquer évolutivement nos croyances religieuses ne prouve pas qu'elles sont fausses. Cette objection est valide : les SCR établissent que la croyance religieuse est naturelle et explicable, non qu'elle est nécessairement fausse. Cependant, elles diminuent considérablement la force épistémique de nos intuitions religieuses. Si nous savons que ces intuitions sont produites par des mécanismes cognitifs indépendants de la réalité de leur objet (comme les illusions d'optique), nous avons des raisons de leur accorder moins de confiance. L'agnosticisme devient alors la position par défaut : nos intuitions religieuses ne constituant pas une preuve fiable, nous devrions suspendre notre jugement. === Le Nouvel Athéisme et l'agnosticisme militant === Au début du XXIe siècle, un mouvement intellectuel appelé le Nouvel Athéisme a revitalisé le débat public sur la religion. Ses figures principales – Richard Dawkins, Daniel Dennett, Sam Harris, Christopher Hitchens – adoptent généralement une position intermédiaire entre athéisme et agnosticisme. ==== Dawkins et le spectre de probabilité théiste ==== Dans ''Pour en finir avec Dieu'' (''The God Delusion'', 2006), Richard Dawkins propose un « spectre de probabilité théiste » en sept niveaux, allant du théisme fort (certitude absolue de l'existence de Dieu) à l'athéisme fort (certitude absolue de l'inexistence de Dieu). Dawkins lui-même se situe à 6 sur 7 : « athéisme de facto » – Dieu est très improbable mais son inexistence ne peut être prouvée absolument. Cette position est techniquement agnostique (Dawkins ne prétend pas ''savoir'' que Dieu n'existe pas), mais pratiquement athée (il vit comme si Dieu n'existait pas et estime la probabilité de son existence infime). Dawkins critique l'« agnosticisme de conciliation » (position 4 sur son spectre : 50% de probabilité) comme déraisonnable : de même que nous ne sommes pas « agnostiques » concernant les fées ou la théière de Russell, nous ne devrions pas l'être concernant Dieu. Cette distinction entre agnosticisme théorique et athéisme pratique caractérise de nombreux intellectuels contemporains. Ils reconnaissent l'impossibilité logique de prouver l'inexistence de Dieu, mais estiment cette existence suffisamment improbable pour justifier une attitude pratique d'athéisme. ==== Dennett et l'athéisme évolutionnaire ==== Daniel Dennett, dans ''Breaking the Spell'' (2006), adopte l'approche des sciences cognitives pour « briser le charme » de la religion. Il argumente que comprendre les origines naturelles de la religion permet de la démystifier et de réduire son emprise psychologique. Dennett se considère comme un athée lumineux (''bright''), quelqu'un dont la vision du monde est naturaliste et ne requiert aucune entité surnaturelle. Cependant, il reconnaît que l'athéisme dogmatique (affirmer avec certitude que Dieu n'existe pas) n'est pas justifié. La position rationnelle est un agnosticisme fortement incliné vers l'athéisme. ==== Les critiques de l'agnosticisme "mou" ==== Le Nouvel Athéisme critique souvent l'agnosticisme comme une position de complaisance intellectuelle, un refus de tirer les conclusions logiques des prémisses acceptées. Si nous n'avons aucune preuve de l'existence de Dieu, si les arguments théistes échouent tous, si les explications naturalistes suffisent pour tout ce que nous observons, pourquoi maintenir même une probabilité significative pour l'hypothèse théiste ? Cette critique vise particulièrement ce que Stephen Jay Gould appelait les « magistères non-overlappants » (''non-overlapping magisteria'', NOMA) : l'idée que science et religion s'occupent de domaines distincts et ne peuvent se contredire. Pour le Nouvel Athéisme, cette position est intellectuellement malhonnête : si la religion fait des affirmations sur la réalité (Dieu a créé l'univers, Jésus est ressuscité, les prières sont exaucées), ces affirmations entrent en conflit avec la science et peuvent être évaluées empiriquement. L'agnosticisme respectueux qui refuse d'examiner ces affirmations trahit les exigences de la rationalité. === L'agnosticisme dans la société sécularisée === Les sociologues de la religion observent depuis plusieurs décennies un processus de sécularisation dans les sociétés occidentales, particulièrement en Europe. Ce processus ne se traduit pas tant par une montée de l'athéisme militant que par une diffusion de l'agnosticisme pratique et de l'indifférence religieuse. ==== Les « nones » : l'agnosticisme sociologique ==== Les enquêtes sociologiques révèlent une croissance massive de la catégorie des « nones » (« aucune affiliation religieuse ») dans les sociétés occidentales. En 2020, environ 26% de la population mondiale n'était affiliée à aucune religion, avec des taux beaucoup plus élevés en Europe (Pays-Bas 54%, République tchèque 78%, Estonie 80%) et des augmentations rapides aux États-Unis (passant de 16% en 2007 à 29% en 2021). Ces « nones » ne sont pas majoritairement des athées militants. Beaucoup se décrivent comme « spirituels mais non religieux », agnostiques, ou simplement indifférents aux questions religieuses. Ils incarnent une forme d'agnosticisme sociologique : un mode de vie où les questions métaphysiques ultimes ne jouent plus un rôle central dans l'identité, les valeurs ou les décisions. ==== Le post-sécularisme et le retour du religieux ==== Toutefois, certains sociologues (notamment Jürgen Habermas) parlent d'un âge post-séculier où, après le déclin du religieux traditionnel, on observe de nouvelles formes de spiritualité, de quête de sens et même de retour aux institutions religieuses. Dans ce contexte, l'agnosticisme représente non pas une station finale vers l'athéisme, mais une position stable, une manière moderne d'habiter l'incertitude métaphysique sans abandonner la recherche de sens. L'agnosticisme contemporain s'accommode souvent d'une spiritualité séculière : méditation, expériences esthétiques intenses, sentiment de connexion avec la nature ou l'humanité, sans référence à un Dieu transcendant personnel. Cette spiritualité agnostique reconnaît la dimension de mystère et d' émerveillement de l'existence sans prétendre la résoudre par des doctrines théologiques. === L'agnosticisme et le pluralisme religieux === La conscience croissante de la diversité religieuse mondiale renforce l'agnosticisme d'une manière que les philosophes des siècles précédents ne pouvaient anticiper. ==== L'argument de l'exclusivisme religieux ==== Face à la multiplicité des religions mutuellement incompatibles (christianisme, islam, hindouisme, bouddhisme, judaïsme, etc.), trois positions logiques sont possibles : 1. Exclusivisme : ma religion est vraie, les autres sont fausses. 2. Inclusivisme : ma religion est vraie, les autres contiennent des vérités partielles ou sont des chemins détournés vers la même vérité. 3. Pluralisme : toutes les religions sont des réponses culturelles diverses à une réalité transcendante ineffable. Chacune de ces positions pose des problèmes. L'exclusivisme semble arbitraire (pourquoi ma religion serait-elle la seule vraie, alors que les autres croyants sont tout aussi convaincus ?). L'inclusivisme est condescendant (il impose ses propres catégories aux autres traditions). Le pluralisme est incohérent (comment des doctrines contradictoires peuvent-elles toutes être vraies ?). L'agnosticisme offre une quatrième voie : suspendre son jugement sur ces prétentions conflictuelles et reconnaître que la vérité, si elle existe, nous échappe. Cette position respecte la sincérité de tous les croyants sans accepter leurs affirmations mutuellement exclusives. ==== L'épistémologie des désaccords entre pairs ==== L'épistémologie contemporaine a développé une réflexion sur les désaccords entre pairs (''peer disagreement'') : que devons-nous penser lorsque des individus également intelligents, également informés et également rationnels arrivent à des conclusions opposées ? En matière religieuse, nous observons précisément cette situation : des théologiens brillants, des philosophes rigoureux, des mystiques sincères adhèrent à des religions mutuellement exclusives. Cette situation suggère que la vérité religieuse, si elle existe, n'est pas accessible de manière fiable par les facultés humaines. Sinon, comment expliquer ces désaccords persistants entre pairs ? L'agnosticisme apparaît comme la réponse épistémiquement humble à cette situation : face à des désaccords insolubles entre pairs, la suspension du jugement est rationnellement justifiée. === Conclusion : l'agnosticisme à l'ère de l'incertitude === L'agnosticisme contemporain se distingue de ses formes classiques par plusieurs caractéristiques : 1. Intégration des sciences : il s'appuie sur les découvertes en cosmologie, biologie évolutive, neurosciences et sciences cognitives qui offrent des explications naturalistes de phénomènes jadis attribués au divin. 2. Conscience du pluralisme : il reconnaît la diversité irréductible des croyances religieuses comme un fait qui requiert explication. 3. Sophistication épistémologique : il bénéficie des développements de l'épistémologie contemporaine (faillibilisme, bayésianisme, épistémologie sociale). 4. Compatibilité avec la spiritualité : il se distingue de l'athéisme matérialiste en maintenant une ouverture au mystère, à l'émerveillement, à la quête de sens. 5. Pertinence sociale : dans des sociétés pluralistes et sécularisées, il offre une base commune pour le dialogue entre croyants et non-croyants. L'agnosticisme n'est pas une position de faiblesse ou d'indécision, mais une reconnaissance mature des limites de notre connaissance face aux questions ultimes. Dans un monde où les certitudes dogmatiques – religieuses ou scientistes – alimentent les conflits et les exclusions, l'humilité épistémique agnostique représente peut-être la sagesse dont nous avons le plus besoin. == Conclusion générale == L’agnosticisme, loin d’être une posture de retrait ou de tiédeur intellectuelle, apparaît comme une position philosophique riche, nuancée et exigeante qui résume une démarche critique face aux grandes questions ultimes de l’existence : Dieu, l’absolu, la transcendance, le sens du réel. À travers l’histoire de la pensée, des origines antiques à la philosophie kantienne, des bouleversements de la modernité scientifique jusqu’aux débats contemporains, l’agnosticisme n’a cessé de se reconfigurer au fil des avancées de la connaissance, des évolutions sociales et des débats épistémologiques. Sur le plan épistémologique, l’agnosticisme dresse un constat lucide sur les structures et limites de la raison, des catégories kantiennes aux contraintes posées par la falsifiabilité poppérienne ou le vérificationnisme positiviste. Il rappelle que la question de Dieu ne relève pas du même régime de connaissance que les hypothèses scientifiques, et qu’il est rationnel de suspendre le jugement là où l’investigation s’arrête par principe ou par absence de preuve suffisante. D’un point de vue éthique, il prolonge le devoir d’honnêteté intellectuelle défendu par Clifford : croire sans preuve n’est pas seulement hasardeux, mais engage notre responsabilité individuelle et collective vis-à-vis de la vérité et de la société. Cette exigence intellectuelle fonde l’agnosticisme comme une authentique *vertu épistémique*. Dans ses modalités contemporaines, l’agnosticisme bénéficie de l’apport des sciences cognitives de la religion, qui éclairent les mécanismes naturels conduisant à la formation de la croyance religieuse, sans pour autant trancher leur validité. Il s’enrichit également du constat pluraliste engendré par la mondialisation, découvrant que la diversité religieuse, loin d’être un simple accident, constitue une donnée fondamentale de l’aventure humaine qui invite à l’humilité. Les objections majeures formulées contre l’agnosticisme, qu’elles proviennent du pari pascalien, de l’épistémologie réformée, de l’argument du réglage fin ou du défi de l’engagement existentiel (chez Kierkegaard, James ou les nouveaux athées), constituent autant de défis féconds qui ont permis à la position agnostique de se préciser : elle ne prétend pas représenter la seule attitude rationnelle ni une réponse définitive à tous les besoins existentiels, mais propose, face aux incertitudes radicales, un espace de liberté et de réflexion critique. Sur le plan pratique, l’agnosticisme offre aujourd’hui un cadre de coexistence dans les sociétés pluralistes : en reconnaissant la part d’incertitude inhérente à toute démarche humaine, il offre un socle pour le dialogue entre croyants, athées, spiritualistes et indifférents, participant à la pacification du débat public et au respect de la pluralité. Il existe de multiples variétés d’agnosticisme (faible, fort, théiste, athée, apathique, apophatique, ignostique…), chacune correspondant à un rapport spécifique à la question religieuse, à la connaissance, au langage et à la vie pratique. Cette diversité reflète la capacité de l’agnosticisme à s’adapter aux enjeux intellectuels, sociétaux et spirituels d’une époque caractérisée par l’incertitude, l’accès démultiplié à l’information, la globalisation des croyances et des doutes. En définitive, l’agnosticisme se présente comme l’une des attitudes philosophiques les plus adaptées à la condition humaine : il allie rigueur intellectuelle, ouverture d’esprit, conscience de nos limites, et sens du dialogue. Son acceptation de l’incertitude n’est pas résignation, mais courage devant le mystère, et fidélité à l’exigence de vérité qui fonde la philosophie. Dans un monde traversé par les certitudes opposées et les radicalismes, il invite à une posture d’humilité, qui pourrait bien être, à long terme, la base d’une sagesse commune et d’un vivre-ensemble éclairé. == Notes et références == {{references|colonnes=2}} == Bibliographie == === Sources antiques === ==== Philosophie grecque ==== * Platon, ''Œuvres complètes'', trad. Léon Robin, Paris, Gallimard, coll. « Bibliothèque de la Pléiade », 1950. ** ''Apologie de Socrate'' (pour la « docta ignorantia » socratique) ** ''République'', livres VI-VII (pour l'allégorie de la caverne et les limites de la connaissance) * Sextus Empiricus, ''Esquisses pyrrhoniennes'', trad. Pierre Pellegrin, Paris, Seuil, coll. « Points Essais », 1997. ** Exposition systématique du scepticisme pyrrhonien et de la suspension du jugement (''épochè'') * Diogène Laërce, ''Vies et doctrines des philosophes illustres'', trad. sous la direction de Marie-Odile Goulet-Cazé, Paris, Le Livre de Poche, coll. « La Pochothèque », 1999. ** Livre IX (sur Pyrrhon et les sceptiques) * Cicéron, ''De natura deorum'' (''La nature des dieux''), trad. Clara Auvray-Assayas, Paris, Les Belles Lettres, 2002. ** Discussion des arguments pour et contre l'existence des dieux ==== Fragments présocratiques ==== * Diels, Hermann & Kranz, Walther (éd.), ''Die Fragmente der Vorsokratiker'', 3 vol., Berlin, Weidmann, 1951-1952. ** Fragment de Protagoras sur l'incertitude concernant les dieux * Dumont, Jean-Paul (éd.), ''Les Présocratiques'', Paris, Gallimard, coll. « Bibliothèque de la Pléiade », 1988. ** Édition française avec fragments et témoignages === Philosophie moderne === ==== David Hume ==== * Hume, David, ''Enquête sur l'entendement humain'' [1748], trad. André Leroy, Paris, Flammarion, coll. « GF », 1983. ** Section X : « Des miracles » ; Section XI : « D'une providence particulière et d'un état futur » * Hume, David, ''Dialogues sur la religion naturelle'' [1779], trad. Michel Malherbe, Paris, Vrin, 1997. ** Critique systématique des arguments théistes, notamment l'argument du dessein * Hume, David, ''Histoire naturelle de la religion'' [1757], trad. Michel Malherbe, Paris, Vrin, 1980. ** Explication naturaliste de l'origine des croyances religieuses ==== Emmanuel Kant ==== * Kant, Emmanuel, ''Critique de la raison pure'' [1781/1787], trad. Alain Renaut, Paris, Flammarion, coll. « GF », 2006. ** « Dialectique transcendantale », livre II, chapitre III : « L'idéal de la raison pure » (critique des preuves de l'existence de Dieu) ** « Analytique transcendantale » : distinction phénomènes/noumènes * Kant, Emmanuel, ''Critique de la raison pratique'' [1788], trad. François Picavet, Paris, PUF, coll. « Quadrige », 2012. ** Les postulats de la raison pratique (immortalité de l'âme, existence de Dieu) * Kant, Emmanuel, ''Prolégomènes à toute métaphysique future qui pourra se présenter comme science'' [1783], trad. Louis Guillermit, Paris, Vrin, 1986. === Fondateurs de l'agnosticisme === ==== Thomas Henry Huxley ==== * Huxley, Thomas Henry, ''Collected Essays'', 9 vol., Londres, Macmillan, 1893-1894. ** Vol. V : ''Science and Christian Tradition'' (contient « Agnosticism » et « Agnosticism and Christianity ») ** Vol. I : ''Method and Results'' (contient « On the Physical Basis of Life ») * Huxley, Thomas Henry, « Agnosticism » [1889], dans ''The Nineteenth Century'', vol. 25, 1889, p. 169-194. ** Premier usage et définition du terme « agnosticisme » * Huxley, Thomas Henry, « Agnosticism : A Rejoinder » [1889], dans ''The Nineteenth Century'', vol. 25, 1889, p. 481-503. ==== Herbert Spencer ==== * Spencer, Herbert, ''First Principles'' [1862], Londres, Williams & Norgate, 6e éd., 1900. ** Développement de la doctrine de l'« Inconnaissable » * Spencer, Herbert, ''The Principles of Psychology'', 2 vol., Londres, Longman, Brown, Green and Longmans, 1855. === Philosophie analytique et épistémologie === ==== Bertrand Russell ==== * Russell, Bertrand, « Is There a God? » [1952], dans ''The Collected Papers of Bertrand Russell'', vol. 11, Londres, Routledge, 1997, p. 542-548. ** Article contenant l'analogie de la théière céleste * Russell, Bertrand, ''Pourquoi je ne suis pas chrétien'' [''Why I Am Not a Christian'', 1927], trad. Guy Le Clec'h, Paris, 10/18, 2011. ** Recueil d'essais critiquant les arguments religieux * Russell, Bertrand, « Am I an Atheist or an Agnostic? A Plea for Tolerance in the Face of New Dogmas » [1947], dans ''Bertrand Russell on God and Religion'', éd. Al Seckel, New York, Prometheus Books, 1986. * Russell, Bertrand, ''Histoire de mes idées philosophiques'' [''My Philosophical Development'', 1959], trad. Georges Auclair, Paris, Gallimard, 1961. ==== William Kingdon Clifford ==== * Clifford, William Kingdon, « The Ethics of Belief » [1877], dans ''Lectures and Essays'', éd. Leslie Stephen & Frederick Pollock, Londres, Macmillan, 1879, vol. 2, p. 163-205. ** Texte fondateur de l'évidentialisme et de l'éthique de la croyance * Clifford, William Kingdon, « The Ethics of Religion » [1877], dans ''Lectures and Essays'', vol. 2, p. 206-231. ==== William James ==== * James, William, « La volonté de croire » [« The Will to Believe », 1896], dans ''La volonté de croire'', trad. Loÿs Moulin, Paris, Flammarion, 1916 ; rééd. Les Empêcheurs de penser en rond, 2005. ** Réponse à Clifford défendant le droit de croire sans preuves dans certaines circonstances * James, William, ''Les variétés de l'expérience religieuse'' [''The Varieties of Religious Experience'', 1902], trad. Frank Abauzit, Paris, Alcan, 1906 ; rééd. Paris, Les Empêcheurs de penser en rond, 2007. === Théologie et mystique === ==== Théologie apophatique ==== * Pseudo-Denys l'Aréopagite, ''Œuvres complètes'', trad. Maurice de Gandillac, Paris, Aubier, 1943. ** ''La théologie mystique'' (théologie négative chrétienne) * Grégoire de Nysse, ''La vie de Moïse'', trad. Jean Daniélou, Paris, Cerf, coll. « Sources chrétiennes », n° 1, 1955. ** Théologie de l'obscurité divine et de l'inconnaissabilité de Dieu * Maître Eckhart, ''Sermons'', trad. Gwendoline Jarczyk & Pierre-Jean Labarrière, 3 vol., Paris, Albin Michel, 1998-2015. * Thomas d'Aquin, ''Somme théologique'', trad. A.-M. Roguet, Paris, Cerf, 1984-1986. ** Ia, q. 2-3 (sur la connaissance de Dieu et ses limites) ==== Philosophie religieuse ==== * Kierkegaard, Søren, ''Miettes philosophiques'' [''Philosophiske Smuler'', 1844], trad. Paul Petit, Paris, Gallimard, coll. « Tel », 1990. ** Le paradoxe absolu de la foi * Kierkegaard, Søren, ''Crainte et tremblement'' [''Frygt og Bæven'', 1843], trad. Charles Le Blanc, Paris, Payot & Rivages, 2000. ** La foi d'Abraham comme saut par-delà la raison * Pascal, Blaise, ''Pensées'' [1670], éd. Philippe Sellier, Paris, Classiques Garnier, 2010. ** Fragment 680 (édition Sellier) : le pari de Pascal === Philosophie contemporaine === ==== Karl Popper et falsificationnisme ==== * Popper, Karl, ''La logique de la découverte scientifique'' [''Logik der Forschung'', 1934], trad. Nicole Thyssen-Rutten & Philippe Devaux, Paris, Payot, 1973. ** Critère de falsifiabilité et démarcation science/métaphysique * Popper, Karl, ''Conjectures et réfutations'' [''Conjectures and Refutations'', 1963], trad. Michelle-Irène & Marc B. de Launay, Paris, Payot, 1985. ** Développement du faillibilisme ==== Empirisme logique ==== * Ayer, Alfred Jules, ''Langage, vérité et logique'' [''Language, Truth and Logic'', 1936], trad. J. Ohana, Paris, Flammarion, 1956. ** Exposé du principe de vérification et critique de la métaphysique * Carnap, Rudolf, « Le dépassement de la métaphysique par l'analyse logique du langage » [« Überwindung der Metaphysik durch logische Analyse der Sprache », 1932], trad. dans ''Manifeste du Cercle de Vienne et autres écrits'', Paris, PUF, 1985. * Wittgenstein, Ludwig, ''Investigations philosophiques'' [''Philosophische Untersuchungen'', 1953], trad. Françoise Dastur et al., Paris, Gallimard, 2004. ** Théorie des jeux de langage ==== Nouvel athéisme ==== * Dawkins, Richard, ''Pour en finir avec Dieu'' [''The God Delusion'', 2006], trad. Marie-France Desjeux, Paris, Robert Laffont, 2008. ** Spectre de probabilité théiste ; critique de l'agnosticisme « conciliant » * Dennett, Daniel C., ''Breaking the Spell: Religion as a Natural Phenomenon'', New York, Viking, 2006. ** Approche naturaliste de la religion * Harris, Sam, ''The End of Faith: Religion, Terror, and the Future of Reason'', New York, W. W. Norton, 2004. * Hitchens, Christopher, ''Dieu n'est pas grand : Comment la religion empoisonne tout'' [''God Is Not Great'', 2007], trad. Anatole Muchnik, Paris, Belfond, 2009. ==== Épistémologie réformée ==== * Plantinga, Alvin, « Reason and Belief in God », dans Alvin Plantinga & Nicholas Wolterstorff (éd.), ''Faith and Rationality'', Notre Dame, University of Notre Dame Press, 1983, p. 16-93. ** Exposition de l'épistémologie réformée * Plantinga, Alvin, ''Warranted Christian Belief'', New York, Oxford University Press, 2000. ** Développement complet du ''sensus divinitatis'' * Plantinga, Alvin, ''God and Other Minds: A Study of the Rational Justification of Belief in God'', Ithaca, Cornell University Press, 1967. === Sciences cognitives de la religion === * Boyer, Pascal, ''Et l'homme créa les dieux : Comment expliquer la religion'' [''Religion Explained'', 2001], trad. Jean-Baptiste Rautureau, Paris, Gallimard, coll. « Folio essais », 2003. ** Explication évolutionniste et cognitive des croyances religieuses * Atran, Scott, ''In Gods We Trust: The Evolutionary Landscape of Religion'', Oxford, Oxford University Press, 2002. * Barrett, Justin L., ''Why Would Anyone Believe in God?'', Walnut Creek (CA), AltaMira Press, 2004. ** Concept du HADD (Hyperactive Agency Detection Device) * Norenzayan, Ara, ''Big Gods: How Religion Transformed Cooperation and Conflict'', Princeton, Princeton University Press, 2013. === Études contemporaines sur l'agnosticisme === ==== Monographies ==== * Le Poidevin, Robin, ''Agnosticism: A Very Short Introduction'', Oxford, Oxford University Press, 2010. ** Introduction concise et accessible * Oppy, Graham, ''Arguing About Gods'', Cambridge, Cambridge University Press, 2006. ** Analyse philosophique rigoureuse des arguments pour et contre l'existence de Dieu * Martin, Michael, ''Atheism: A Philosophical Justification'', Philadelphie, Temple University Press, 1990. ** Défense de l'athéisme négatif et de l'agnosticisme athée * Swinburne, Richard, ''The Existence of God'', 2e éd., Oxford, Clarendon Press, 2004. ** Défense théiste avec discussion de l'agnosticisme ==== Articles et chapitres ==== * Draper, Paul, « Agnosticism », dans ''The Oxford Handbook of Atheism'', éd. Stephen Bullivant & Michael Ruse, Oxford, Oxford University Press, 2013, p. 170-186. * Schellenberg, J. L., « Agnosticism », dans ''The Routledge Companion to Philosophy of Religion'', 2e éd., éd. Chad Meister & Paul Copan, Londres, Routledge, 2012, p. 31-40. * van Inwagen, Peter, « Is it Wrong, Everywhere, Always, for Anyone, to Believe Anything on Insufficient Evidence? », dans Jeff Jordan & Daniel Howard-Snyder (éd.), ''Faith, Freedom and Rationality'', Lanham (MD), Rowman & Littlefield, 1996, p. 137-153. ** Critique de la maxime de Clifford === Sociologie de la religion et sécularisation === * Taylor, Charles, ''L'âge séculier'' [''A Secular Age'', 2007], trad. Patrick Savidan, Paris, Seuil, 2011. ** Analyse du processus de sécularisation en Occident * Berger, Peter L., ''La religion dans la conscience moderne'' [''The Sacred Canopy'', 1967], trad. J. Feisthauer, Paris, Centurion, 1971. * Habermas, Jürgen & Ratzinger, Joseph, ''Raison et religion : La dialectique de la sécularisation'', trad. Christian Bouchindhomme & Frédéric Joly, Paris, Salvator, 2010. * Pew Research Center, « The Global Religious Landscape », décembre 2012 (rapport sur les « nones »). === Encyclopédies et dictionnaires spécialisés === * Bullivant, Stephen & Ruse, Michael (éd.), ''The Oxford Handbook of Atheism'', Oxford, Oxford University Press, 2013. * Meister, Chad & Copan, Paul (éd.), ''The Routledge Companion to Philosophy of Religion'', 2e éd., Londres, Routledge, 2012. * Craig, Edward (éd.), ''Routledge Encyclopedia of Philosophy'', 10 vol., Londres, Routledge, 1998. ** Article « Agnosticism » * Zalta, Edward N. (éd.), ''Stanford Encyclopedia of Philosophy'', Stanford University, en ligne : https://plato.stanford.edu/ ** Articles : « Agnosticism », « Religious Epistemology », « Pascal's Wager », « Reformed Epistemology » === Ressources en ligne === * Internet Encyclopedia of Philosophy : https://iep.utm.edu/ ** Articles : « Agnosticism », « Religious Epistemology », « William Kingdon Clifford » * PhilPapers (bibliographie spécialisée en philosophie) : https://philpapers.org/ ** Section « Philosophy of Religion » et « Epistemology of Religion » {{Autocat}} iycy1dwgxg46l798qok2dnpdd9mptt2 Grec ancien/Dieux/Cronos 0 59805 768168 523702 2026-06-19T07:28:16Z ~2026-34862-02 124042 L'époux de Rhéa est Cronos et non pas Chronos. 768168 wikitext text/x-wiki {{Grec ancien}} {{Dieu grec |nom=Cronos |img=Kronos e Rhea.jpg |comim=Rhéa offre la pierre à Kronos. Vase en céramique à figures rouges attribué au peintre de Nausicaa. environ. 460-450 av. J.-C. Metropolitan Museum of Art, New York. |ngr=Κρόνος |par=Gaïa et Ouranos |ddd= |dd= |rom=Saturne |fs=Céos, Crios, les Cyclopes, les Hécatonchires, Hypérion, Japet, Mnémosyne, Océan, Phébé, Téthys, Théia, Thémis, Rhéa |enf=Hestia, Déméter, Héra, Hadès, Poséidon, Zeus }} '''Chronos''' est le roi des Titans. 6xicm0xlishnxpjq4hce7k3lnz1zzfu Grec ancien/Dieux/Gaïa 0 59809 768169 520691 2026-06-19T07:31:59Z ~2026-34862-02 124042 768169 wikitext text/x-wiki {{Grec ancien}} {{Dieu grec |nom=Gaïa |img=Feuerbach_Gaea.jpg |comim=Portrait de Gaïa par Anselm Feuerbach (1875). |ngr=Γαῖα |par=Chaos et Éther |ddd=Déesse de |dd=la Terre |rom=Tellus |fs=Érèbe, Tartare et Nyx |enf=Ouranos, Ouréa, Pontos, les Titans, les Titanides, les Cyclopes, Nérée, les Géants, Thaumas, Phorcys, Céto, Eurybie et Typhon }} '''Gaïa''' est une divinité primordiale. dei35ohfbuqcbbdk6dse25kxd99rp52 Discussion:Peeragogie Manuel V2 1 59900 768171 455640 2026-06-19T09:42:27Z Eric.LEWIN 22523 /* « Pairagogie » plutôt que "peeragogie" pour traduire ‘peeragogy’ */ nouvelle section 768171 wikitext text/x-wiki Alex Gagnon a fait remarquer que le mot "anti-pattern" s'il peut être littéralement traduit par anti-modele ne peut pas l'être sans enlever une partie de son sens et de son histoire qui s'ancre dans la conception industrielle et logicielle. La bonne traduction serait donc : anti-patron mais cela ne semble pas être compréhensible en français (vos avis ?). Nous pensions donc remettre le terme en anglais. Le hic je n'arrive plus à modifier la page principale depuis qu'elle est en modèle "sommaire", des idées ? [[Utilisateur:Elvirebornand|Elvirebornand]] ([[Discussion utilisateur:Elvirebornand|discussion]]) 19 décembre 2014 à 08:17 (CET) == « Pairagogie » plutôt que "peeragogie" pour traduire ‘peeragogy’ == Tant qu'à créer un néologisme pour une traduction, autant qu'il soit, si c'est possible, le plus immédiatement compréhensible. "Pairagogie" est un mot-valise dont on voit ou devine bien l'origine ; "peeragogie" est juste un barbarisme que j'ai mis très longtemps à comprendre. Mes deux centimes ! -- [[Utilisateur:Eric.LEWIN|Eric.LEWIN]] ([[Discussion utilisateur:Eric.LEWIN|discussion]]) 19 juin 2026 à 11:42 (CEST) 594i7czr0x0fnj8icih7szwzrx2dge2 Fonctionnement d'un ordinateur/Les circuits pour l'addition et la soustraction 0 65787 768008 767955 2026-06-18T14:27:07Z Mewtow 31375 /* L'incrémenteur */ Déplacement dans chapitre séparé 768008 wikitext text/x-wiki Dans ce chapitre, nous allons voir les circuits capables de faire une addition ou une soustraction, ainsi que quelques circuits spécialisés. Précisons cependant que les fabricants de processeurs travaillent d'arrache-pied pour trouver des moyens de rendre ces circuits de calcul plus rapides et plus économes en énergie. Autant vous dire que les circuits que vous allez voir sont vraiment des circuits qui font pâle figure comparé à ce que l'on peut trouver dans un vrai processeur commercial ! ==Les circuits pour additionner 2 ou 3 bits== L'addition se fait en binaire de la même manière qu'en décimal. On additionne les chiffres/bits colonne par colonne, une éventuelle retenue est propagée à la colonne d'à côté. La soustraction fonctionne sur le même principe, sur le même modèle qu'en décimal. [[File:Binary Addition Demonstration.svg|centre|vignette|Exemple d'addition en binaire.]] En clair, additionner deux nombres demande d'additionner 2 bits et une retenue sur chaque colonne, et de propager les retenues d'une colonne à l'autre. La propagation des retenues est quelque chose de simple en apparence, mais qui est sujet à des optimisations extraordinairement nombreuses. Aussi, pour simplifier l'exposition, nous allons voir comment gérer une colonne avant de voir comment sont propagées les retenues. En effet, tout additionneur est composé d'additionneurs plus simples, capables d'additionner deux ou trois bits suivant la situation. Ceux-ci gèrent ce qui se passe sur une colonne. ===Le demi-additionneur et l'additionneur complet=== Un additionneur deux bits implémente la table d'addition, qui est très simple en binaire. Jugez plutôt : * 0 + 0 = 0, retenue = 0 ; * 0 + 1 = 1, retenue = 0 ; * 1 + 0 = 1, retenue = 0 ; * 1 + 1 = 0, retenue = 1. Un circuit capable d'additionner deux bits est donc simple à construire avec les techniques vues dans les premiers chapitres. On voit immédiatement que la colonne des retenues donne une porte ET, alors que celle du bit de somme est calculé par un XOR. Le circuit obtenu est appelé un '''demi-additionneur'''. {| class="flexible" |[[File:1-bit half-adder.svg|class=transparent|centre|Demi-addtionneur.]] |[[File:Half-adder.svg|centre|class=transparent|Circuit d'un demi-addtionneur.]] |} [[File:Full Adder Block.svg|vignette|upright=1|class=transparent|Additionneur complet.]] Si on effectue une addition en colonne, on doit additionner les deux bits sur la colonne, mais aussi additionner une éventuelle retenue. Il faut donc créer un circuit qui additionne trois bits : deux bits de données, plus une retenue. Il fournit en sortie deux bits : un bit de somme et une retenue sortante. Ce circuit qui additionne trois bits est appelé un '''additionneur complet'''. Voici sa table de vérité : {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- ||0||0||0|| ||0||0 |- ||0||0||1|| ||0||1 |- ||0||1||0|| ||0||1 |- ||0||1||1|| ||1||0 |- ||1||0||0|| ||0||1 |- ||1||0||1|| ||1||0 |- ||1||1||0|| ||1||0 |- ||1||1||1|| ||1||1 |} Il est possible d'utiliser un tableau de Karnaugh pour traduire la table de vérité, mais elle donne un résultat légèrement sous-optimal. D'autres méthodes donnent des résultats plus compréhensibles. Nous allons les détailler dans ce qui suit. ===L'additionneur complet conçu avec deux demi-additionneurs=== La solution plus simple consiste à enchaîner deux demi-additionneurs : un qui additionne les deux bits de données, et un second qui additionne la retenue au résultat. La retenue finale se calcule en combinant les sorties de retenue des deux demi-additionneurs, avec une porte OU. Pour vous en convaincre, établissez la table de vérité de ce circuit, vous verrez que ça marche. {| class="flexible" |[[File:Full Adder Modules.svg|class=transparent|Composition d'un additionneur complet. On voit bien que celui-ci est composé de deux demi-additionneurs, en rouge et en bleu, auxquels on a ajouté une porte OU pour calculer la retenue finale.]] |[[File:Full-adder.svg|300px|class=transparent|Circuit d'un additionneur complet.]] |} Le circuit de calcul de la retenue peut être remplacé par une '''porte à majorité''', mais cette possibilité n'est presque jamais utilisée, on lui préfère le circuit à trois portes logiques. [[File:Additionneur crée avec une porte à majorité.png|centre|vignette|upright=2|Additionneur crée avec une porte à majorité]] Les autres implémentations de l'additionneur complet que nous allons voir sont des dérivés de ce circuit, auquel on a appliqué quelques simplifications. Les simplifications portent surtout sur le circuit de calcul de la retenue. En effet, le calcul de la retenue doit absolument être le plus rapide possible,vu que la propagation des retenues est le point limitant pour les performances d'un additionneur. ===L'additionneur complet basé sur la propagation et la génération de retenue=== Le circuit précédent est basé sur deux additions 2-bits successives : une première pour additionner deux bits d'opérande, une seconde pour additionner la retenue. Mais il existe une autre façon de faire l'addition, qui est terriblement importante pour la suite du cours. L'idée est de regarder ce que vaut la retenue sortante, en fonction de la retenue entrante. Pour cela, reprenons la table de vérité de l'additionneur complet. Dans la majorité des cas, la retenue sortante est égale à la retenue entrante. On dit que la retenue entrante est propagée sur la sortie de retenue. Cependant, il y a aussi deux cas où la retenue n'est pas propagée : celui où la retenue sortante est forcée à 1, et celui où elle est forcée à 0. Dans le premier cas, l'addition donne une retenue à 1, quelle que soit la retenue envoyée en entrée (sous-entendu, même si celle-ci vaut 0). On dit que la retenue sortante est générée. Dans le cas inverse, la retenue sortante est forcée à 0, peu importe la retenue entrante. On dit que la retenue entrante est absorbée. Il y a cependant une petite ambiguïté à dire que la retenue a été propagée, absorbée ou générée. En effet, prenons le cas où la retenue sortante et entrantes valent toutes deux 0 : est-ce que la retenue a été propagée ou bien absorbée, ou les deux ? Idem quand les deux retenues sont à 1. Il y a un choix arbitraire à faire dans ce genre de cas, pour la plupart des lignes de la table de vérité. Cependant, il y a un choix bien précis qui est supérieur aux autres, et c'est celui qui est présenté dans le tableau suivant. Les lignes rouge correspondent à une retenue propagée, celles en bleu à une retenue absorbée, celle en vert à une retenue générée. {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- class="f_bleu" ||0||0||0|| ||0||0 |- class="f_rouge" ||0||0||1|| ||0||1 |- class="f_rouge" ||0||1||0|| ||0||1 |- class="f_vert" ||0||1||1|| ||1||0 |- class="f_bleu" ||1||0||0|| ||0||1 |- class="f_rouge" ||1||0||1|| ||1||0 |- class="f_rouge" ||1||1||0|| ||1||0 |- class="f_vert" ||1||1||1|| ||1||1 |} Avec ce choix, on peut déterminer si la retenue est propagée, absorbée ou générée, sans tenir compte de la retenue elle-même. On peut déterminer dans quel cas on est seulement en regardant les bits d'opérandes nommés A et B. * La retenue est propagée si les deux bits d'opérande sont différents. * La retenue est générée si les deux bits d'opérande sont à 1. * La retenue est absorbée si les deux bits d'opérande sont à 0. L'additionneur que nous allons voir détermine si la retenue est propagée, absorbée ou générée, et calcule la retenue sortante en fonction de ça. Il génère deux bits, nommés P et G : P pour ''Propagate'', G pour ''Generate''. Le bit P indique que la retenue entrante doit être propagée ou non : il est mis à 1 pour propager la retenue entrante, à 0 si elle ne doit pas être propagée. Le bit G indique si une retenue a été générée ou non : 1 si une retenue générée, 0 sinon. Une retenue est considérée comme absorbée si elle n'est pas ni propagée ni générée, pas besoin d'un troisième bit pour gérer ce cas. Pour rappel, la retenue est propagée si les deux bits sont différents, n'est pas propagée s'ils sont identiques. Déterminer si deux bits sont identiques ou différents est le comportement d'une banale porte XOR. Le bit P est donc généré par une simple porte XOR. Quant au bit G, il est à 1 si les deux bits d'opérandes sont à 1, ce qui correspond à une porte ET. Il existe des pseudo-additionneurs qui ne calculent pas la retenue sortante et fournissent à la place les signaux P et G, en plus du résultat. Un tel additionneur est appelé un '''additionneur P/G''' (P/G pour propagation/génération). Ils sont très utiles pour créer des additionneurs dits "à anticipation de retenue", comme on le verra dans la suite du chapitre. {| class="flexible" | [[File:FulladderPG.png|Additionneur P/G : entrées et sorties.]] | [[File:Partial Full-Adder.svg|class=transparent|Additionneur P/G : circuit de génération des signaux P et G.]] |} Pour créer un additionneur complet avec cette méthode, il faut ajouter un circuit qui calcule la retenue sortante à partir des bits P et G. La retenue finale vaut 1 soit quand la retenue est générée, soit quand la retenue d'entrée vaut 1 et qu'elle est propagée. La traduction en équation logique; puis en circuits, donne un circuit strictement identique à celui basé sur deux demi-additionneurs... Vous remarquerez que les signaux P et G sont calculés par le premier demi-additionneur. [[File:Additionneur complet avec propagation et génération de retenue.png|class=transparent|centre|vignette|upright=2|Additionneur complet avec propagation et génération de retenue.]] Une méthode alternative donne cependant un circuit différent. Le circuit en question choisit entre les deux situations : soit il propage la retenue, soit il calcule la retenue adéquate. Propager une retenue demande de connecter l'entrée de retenue sur la sortie de retenue. Mais cela ne doit être fait que si les conditions sont réunies, que si la retenue est belle et bien propagée. Si ce n'est pas le cas, il faut connecter la sortie de retenue à un circuit qui calcule la retenue adéquate. Pour cela, on utilise un multiplexeur, commandé par le bit P. [[File:Additionneur crée avec un multiplexeur.png|centre|vignette|upright=2|Additionneur crée avec un multiplexeur]] Quand la retenue entrante n'est pas propagée, la retenue sortante vaut 1 si une retenue est générée, 0 sinon. Le circuit qui calcule la retenue doit donc fournir un 0 si les bits d'opérande valent tous les deux 0, un 1 s'ils valent tous les deux 1. Mais si la retenue est propagée, la retenue calculée peut prendre n'importe quelle valeur, vu que le multiplexeur ne choisira pas sa sortie. Suivant quelles valeurs on prend dans ce cas, le circuit obtenu sera différent. Si on suppose que le circuit fournit un 0 si la retenue est propagée, alors la retenue calculée indique une retenue est générée ou non : on peut alors réutiliser le bit G ! Le tout donne alors ce circuit : [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Le circuit semble utiliser plus de portes logiques que nécessaires. Cependant, tout dépend de l'implémentation du multiplexeur. En réalité, nous verrons dans quelques chapitres qu'il est possible d'implémenter un multiplexeur avec seulement 6 transistors. L'implémentation utilise des portes à transmission, mais nous en reparlerons dans le chapitre sur les transistors, quand nous verrons les additionneurs à ''Manchester Carry Chain''. Au passage, une variante de ce circuit a été utilisée dans le processeur processeur 8086 d'Intel, comme on le verra dans le chapitre suivant. ===L'additionneur complet basé sur une modification de la retenue sortante=== Dans les circuits précédents, la retenue sortante et le bit du résultat sont calculés séparément, même si quelques portes logiques sont partagées entre les deux. Mais il est possible de calculer le bit du résultat à partir de la retenue sortante. En effet, le bit du résultat est l'inverse de la retenue sortante, sauf dans deux cas : les trois bits d'entrée sont à 0, où ils sont tous à 1. Le bit de somme vaut 0 dans le premier cas, 1 dans le second cas. {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- class="f_bleu" ||0||0||0|| ||0||0 |- class="f_vert" ||0||0||1|| ||0||1 |- class="f_vert" ||0||1||0|| ||0||1 |- class="f_vert" ||0||1||1|| ||1||0 |- class="f_vert" ||1||0||0|| ||0||1 |- class="f_vert" ||1||0||1|| ||1||0 |- class="f_vert" ||1||1||0|| ||1||0 |- class="f_rouge" ||1||1||1|| ||1||1 |} L'implémentation en circuit demande donc trois choses : * de calculer la retenue sortante et de quoi l'inverser ; * un circuit qui vérifie si tous les bits opérande valent 0 : une porte NOR ou OU fait l'affaire ; * un circuit qui vérifie s'ils valent tous 1, à savoir une porte ET. Ensuite, on combine le résultat des trois circuits précédents pour obtenir le résultat final. La combinaison est le fait du circuit en jaune dans le schéma ci-dessous. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] Le circuit en jaune est assez simple. Quand la porte ET sort un 1, la sortie doit être forcée à 1. Par contre, quand la porte OU sort un zéro, la sortie doit être forcée à 0. Il suffit donc d'enchainer un circuit de mise à 1 et un circuit de mise à 0. Nous avons vu dans le chapitre sur les opérations de masquage qu'il s'agit respectivement d'une porte OU et d'une porte ET. [[File:Full adder basé sur une modification de la retenue interne, au complet.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue interne, au complet]] Divers processeurs utilisaient des additionneurs complets de ce type : le fameux Z80, l'Intel 4004 et de l'Intel 8008 sont les exemples les plus notables. Pourtant, on pourrait s'étonner qu'un tel circuit ait existé. Il utilise beaucoup de portes logiques, a une profondeur logique supérieure : il n'a rien d'avantageux. Sauf qu'il était utilisé sur d'anciens processeurs, qui utilisaient la technologie dite TTL, différente de la technologie CMOS des transistors modernes. Et avec la technologie TTL, il est possible de fusionner plusieurs portes logiques ET et NOR en une seule porte logique ET/OU/NON ! Un additionneur complet construit ainsi ne prenait que deux portes logiques : une pour le calcul de la retenue sortante, une autre pour le reste du circuit. ==L'addition non signée== Voyons maintenant un circuit capable d'additionner deux nombres entiers: l''''additionneur'''. Dans la version qu'on va voir, ce circuit manipulera des nombres strictement positifs. L'addition des nombres codés en complètement à deux sera vu dans une section ultérieure. ===L'additionneur série=== Il est possible d'additionner deux nombres bit par bit,colonne par colonne, avec un additionneur complet. Cela demande de coupler un additionneur complet avec plusieurs registres à décalages. Les opérandes sont placées chacune dans un registre à décalage, afin de passer d'un bit au suivant, d'une colonne à la suivante, à chaque cycle. Même chose pour le résultat, qui a sont propre registre à décalage. La retenue de l'addition est stockée dans une bascule de 1 bit, en attente du prochain cycle d'horloge. Un tel additionneur est appelé un '''additionneur série'''. [[File:Additionneur série.jpg|centre|vignette|upright=2.5|Additionneur série.]] L'additionneur série a été utilisé sur d'anciens prototypes dans les années 50-60, et quelques ordinateurs commerciaux très rares. ===L'additionneur à propagation de retenue=== L'additionneur à propagation de retenue pose l'addition comme en décimal, en additionnant les bits colonne par colonne avec une éventuelle retenue. Évidemment, on commence par les bits les plus à droite, comme en décimal. Il suffit ainsi de câbler des additionneurs complets les uns à la suite des autres. Notons la présence de la retenue sortante, qui est utilisée pour détecter les débordements d'entier, ainsi que pour d'autres opérations. Le bit de retenue final est souvent stocké dans un registre spécial du processeur (généralement appelé ''carry flag''). [[File:Ripplecarryadder.png|centre|vignette|upright=2.5|Additionneur à propagation de retenue.]] Notez aussi, sur le schéma précédent, la présence de l’entrée de retenue <math>\text{R}_\text{Entrée}</math> sur l'additionneur. L'additionneur le plus à droite est bien un additionneur complet, et non un demi-additionneur,c e qui fait qui l'additionneur a une entrée de retenue. Tous les additionneurs ont une entrée de retenue de ce type. Elle est très utile pour l'implémentation de certaines opérations comme l'inversion de signe, la soustraction, l'incrémentation, etc. Certains processeurs sont capables de faire une opération appelée ADC, ADDC ou autre nom signifiant ''Addition with Carry'', qui permet de faire le calcul A + B + Retenue (la retenue en question est la retenue sortante de l'addition précédente, stockée dans le registre ''carry flag''). Son utilité principale est de permettre des additions d'entiers plus grands que ceux supportés par le processeur. Par exemple, cela permet de faire des additions d'entiers 32 bits sur un processeur 16 bits. [[File:Adder Network 3 Bit Sum Delay 003.svg|vignette|upright=0.5|Propagation de retenue dans l'additionneur.]] L'avantage est qu'il utilise très peu de portes logiques et est assez économe en transistors, ce qui fait qu'il était utilisé sur certains processeurs 8 et 16 bits assez anciens. Bien que très simple, cet additionneur est cependant peu performant. Le temps de calcul est proportionnel à la taille des opérandes. Par exemple, additionner deux nombres de 32 bits prendra deux fois plus de temps que l'addition de deux nombres de 16 bits. La raison est que le calcul des retenues s'effectue en série, l'une après l'autre. En effet, chaque additionneur doit attendre que la retenue de l'addition précédente soit disponible pour donner son résultat. Les retenues doivent se propager à travers le circuit, du premier additionneur jusqu'au dernier. L'addition étant une opération fréquente, il vaut mieux utiliser d'autres méthodes d'addition, plus rapides. Pour cela, les autres additionneurs utilisent diverses optimisations : calculer les retenues en parallèle, éliminer certaines opérations inutiles quand c'est possible, accélérer le calcul de la retenue avec des techniques d'anticipation de retenue, etc. Mais ces optimisations demandent d'utiliser plus de circuits, quitte à gagner quelque peu en rapidité. Si on met de côté les additionneurs de type ''Manchester carry chain'', qu'on ne peut pas encore expliquer à ce stade du cours, il existe plusieurs solutions, qui donnent respectivement les additionneurs à saut de retenue, à sélection de retenue, et à anticipation de retenue. Nous allons les voir dans les sections suivantes. ===Les accélérations de la propagation de retenue=== [[File:Full-adder-4bits-serial-CEI.svg|vignette|upright=0.5|Additionneur 4 bits, un bloc.]] Dans cette section, nous allons voir quelques additionneurs qui visent à accélérer la propagation de la retenue, mais en gardant la base de l'additionneur de propagation de retenue. Avant de poursuivre, partons du principe que l'additionneur est conçu en assemblant des additionneurs à plus simples, qui additionnent environ 4 à 5 bits, parfois plus, parfois moins. Ces additionneurs simples seront nommés ''blocs'' dans ce qui suit, et l'un d'entre eux est illustré ci-contre. Chaque bloc prend en entrée un morceau des deux opérandes à additionner, mais aussi une retenue d'entrée. Il fournit en sortie un résultat codé sur 4/5 bits, mais aussi une retenue sortante. Dans un bloc, la retenue sortante est plus ou moins calculée à part du résultat. L'enjeu est de calculer la retenue sortante d'un bloc rapidement, plus rapidement qu'un additionneur à propagation de retenue. Le calcul du résultat n'a pas besoin d'être accéléré, on garde des additionneurs à propagation de retenue. En enchaînant plusieurs blocs les uns à la suite des autres, la retenue sortante d'un bloc est connectée sur l'entrée de retenue du bloc suivant, la retenue est propagée d'un bloc au suivant. Les blocs sont tous identiques dans le cas le plus simple, mais il est possible d'utiliser des blocs de taille variable. Par exemple, le premier bloc peut avoir des opérandes de 6 bits, le second des opérandes de 7 bits, etc. Faire ainsi permet de gagner un petit peu en performances, si la taille de chaque bloc est bien choisie. La raison est une question de temps de propagation des retenues. La retenue met plus de temps à se propager à travers 8 blocs qu'à travers 4, ce qui prend plus de temps qu'à travers 2 blocs, etc. En tenir compte fait que la taille des blocs tend à augmenter ou diminuer quand on se rapproche des bits de poids fort. ====Le calcul parallèle de la retenue==== [[File:4008 Functional Diagram.svg|vignette|upright=1|4008 Functional Diagram]] L'optimisation la plus évidente est de calculer la retenue sortante en parallèle de l'addition. Chaque bloc contient, à côté d'un additionneur proprement dit, un circuit qui calcule la retenue sortante. Il existe de nombreuses manières de calculer la retenue sortante. La plus simple consiste à établir la table de vérité de l'entrée de retenue et d'utiliser les techniques du chapitre sur les circuits combinatoires. Cela marche si les blocs sont de petite taille, mais elle devient difficile si le bloc a des opérandes de 2/3 bits ou plus. Mais des techniques alternatives existent. Un exemple est celui de l'additionneur CMOS 4008, un additionneur de 4 bit. Il est intéressant de voir comment fonctionne ce circuit. Aussi, voici son implémentation. Le circuit est décomposé en trois sections. Une première couche de demi-additionneurs, le circuit de calcul de la retenue sortante, le reste du circuit qui calcule l'addition en propageant les retenues. Le circuit de calcul de la retenue sortante prend les résultats des demi-additionneurs, et les utilise pour calculer la retenue sortante. C'est là une constante de tous les circuits qui vont suivre. [[File:CMOS 4008, circuit découpé en sections.png|centre|vignette|upright=1.5|CMOS 4008, circuit découpé en sections]] Le point important à comprendre est que les demi-additionneurs génèrent les signaux P et G, qui disent si l'additionneur propage ou génère une retenue. Ces signaux sont alors combinés pour déterminer la retenue sortante. La méthode de combinaison des signaux P et G dépend fortement de l'additionneur utilisé. La méthode utilisée sur le 4008 utilise à la fois les signaux P et G, ce qui fait que c'est un hybride entre un additionneur à propagation de retenue, et un additionneur à anticipation de retenue qui sera vu dans la suite du chapitre. Mais il existe des techniques alternatives pour calculer la retenue sortante. ====L'additionneur à saut de retenue==== L''''additionneur à saut de retenue''' (''carry-skip adder'') est un additionneur dont le temps de calcul est variable. Le calcul prendra quelques cycles d'horloges avec certains opérandes, tandis qu'il sera aussi long qu'avec un additionneur à propagation de retenue avec d'autres. Il n'améliore pas le pire des cas, dans lequel la retenue doit être propagée du début à la fin, du bit de poids faible au bit de poids fort. Mais dans les autres cas, le circuit détecte quand le résultat de l'addition est disponible, quand la retenue a fini de se propager. Il permet d'avoir le résultat en avance, plutôt que d'attendre suffisamment pour couvrir le pire des cas. L'additionneur à saut de retenue est lui aussi composé de blocs qui additionnent 4/5 bits. Il peut, sous certaines conditions, sauter complètement la propagation de la retenue dans le bloc. L'idée est de calculer si un bloc génère une retenue sortante, ou si la retenue entrante est simplement propagée. Dans le second cas, le bloc ne fait que recopier la retenue entrante sur la sortie de retenue. La propagation de retenue entre blocs est alors skippée (mais elle a quand même lieu). Si une retenue est générée dans le bloc, on envoie cette retenue sur la retenue sortante. Le choix entre les deux est le fait d'un multiplexeur. [[File:Carry skip adder, principe de base.png|centre|vignette|upright=2.5|Carry skip adder : principe de base]] Toute la difficulté est de savoir comment commander le multiplexeur. Pour cela, on doit savoir si le circuit propage une retenue ou non. Le bloc propage une retenue si chaque additionneur complet propage la retenue. Les additionneurs complets doivent donc fournir le résultat, mais aussi indiquer s'ils propagent la retenue d'entrée ou non. Le signal de commande du multiplexeur est généré assez simplement : il vaut 1 si tous les additionneurs complets du bloc propagent la retenue précédente. C'est donc un vulgaire ET entre tous ces signaux. [[File:Additionneur à saut de retenue.png|centre|vignette|upright=2.5|Calcul de la commande du MUX.]] L'additionneur à saut de retenue est construit en assemblant plusieurs blocs de ce type. [[File:BCSAdder16Bit.svg|centre|vignette|upright=3|Additionneur à saut de retenue.]] ====L'additionneur à sélection de retenue==== L''''additionneur à sélection de retenue''' utilise aussi des blocs, comme les additionneurs précédents. L'addition se fait en deux versions : une avec la retenue du bloc précédent valant zéro, et une autre version avec la retenue du bloc précédent valant 1. Il suffira alors de choisir le bon résultat avec un multiplexeur, une fois cette retenue connue. On gagne ainsi du temps en calculant à l'avance les valeurs de certains bits du résultat, sans connaître la valeur de la retenue. Petit détail : sur certains additionneurs à sélection de retenue, les blocs de base n'ont pas la même taille. Cela permet de tenir compte des temps de propagation des retenues entre les blocs. [[File:Additionneur à sélection de retenue.png|centre|vignette|upright=1|Additionneur à sélection de retenue avec seulement deux blocs.]] Dans les exemples du dessus, chaque sous-additionneur étaient des additionneurs à propagation de retenue. Mais ce n'est pas une obligation, et tout autre type d’additionneur peut être utilisé. Par exemple, on peut faire en sorte que les sous-additionneurs soient eux-mêmes des additionneurs à sélection de retenue, et poursuivre ainsi de suite, récursivement. On obtient alors un '''additionneur à somme conditionnelle''', plus rapide que l'additionneur à sélection de retenue, mais qui utilise beaucoup plus de portes logiques. ===Les additionneurs à anticipation de retenue=== Les '''additionneurs à anticipation de retenue''' accélèrent le calcul des retenues en les calculant sans les propager. Au lieu de calculer les retenues une par une, ils calculent toutes les retenues en parallèle, à partir de la valeur de tout ou partie des bits précédents. Une fois les retenues pré-calculées, il suffit de les additionner avec les deux bits adéquats, pour obtenir le résultat. [[File:Cla4bits.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Ces additionneurs sont composés de deux parties : * un circuit qui pré-calcule la valeur de la retenue d'un étage ; * et d'un circuit qui additionne les deux bits et la retenue pré-calculée : il s'agit d'une couche d'additionneurs complets simplifiés, qui ne fournissent pas de retenue. [[File:Additionneur à anticipation de retenue.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Le circuit qui détermine la valeur de la retenue est lui-même composé de deux grandes parties, qui ont chacune leur utilité. La première partie réutilise des additionneurs qui donnent les signaux de propagation et génération de retenue. L'additionneur commence donc à prendre forme, et est composé de trois parties : * un circuit qui crée les signaux P et G ; * un circuit qui déduit la retenue à partir des signaux P et G adéquats ; * et une couche d'additionneurs qui additionnent chacun deux bits et une retenue. [[File:Circuit complet d'un additionneur à anticipation de retenue.png|centre|vignette|upright=2|Circuit complet d'un additionneur à anticipation de retenue.]] Il ne nous reste plus qu'à voir comment fabriquer le circuit qui reste. Pour cela, il faut remarquer que la retenue est égale : * à 1 si l'addition des deux bits génère une retenue ; * à 1 si l'addition des deux bits propage une retenue ; * à zéro sinon. Ainsi, l'addition des bits de rangs i va produire une retenue Ci, qui est égale à Gi+(Pi·Ci−1). Si on utilisait cette formule sans trop réfléchir, on retomberait sur un additionneur à propagation de retenue inutilement compliqué. L'astuce des additionneurs à anticipation de retenue consiste à remplacer le terme Ci−1 par sa valeur calculée avant. Par exemple, je prends un additionneur 4 bits. Je dispose de deux nombres A et B, contenant chacun 4 bits : A3, A2, A1, et A0 pour le nombre A, et B3, B2, B1, et B0 pour le nombre B. Si j'effectue les remplacements, j'obtiens les formules suivantes : * C1 = G0 + ( P0 · C0 ) ; * C2 = G1 + ( P1 · G0 ) + ( P1 · P0 · C0 ) ; * C3 = G2 + ( P2 · G1 ) + ( P2 · P1 · G0 ) + ( P2 · P1 · P0 · C0 ) ; * C4 = G3 + ( P3 · G2 ) + ( P3 · P2 · G1 ) + ( P3 · P2 · P1 · G0 ) + ( P3 · P2 · P1 · P0 · C0 ). Ces formules nous permettent de déduire la valeur d'une retenue directement : il reste alors à créer un circuit qui implémente ces formules, et le tour est joué. On peut même simplifier le tout en fusionnant les deux couches d'additionneurs. [[File:4-bit carry lookahead adder.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 4 bits.]] Ces additionneurs sont plus rapides que les additionneurs à propagation de retenue. Ceci dit, utiliser un additionneur à anticipation de retenue sur des nombres très grands (16/32bits) utiliserait trop de portes logiques. Pour éviter tout problème, nos additionneurs à anticipation de retenue sont souvent découpés en blocs, avec soit une anticipation de retenue entre les blocs et une propagation de retenue dans les blocs, soit l'inverse. [[File:64-bit lookahead carry unit.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 64 bits.]] ===L'additionneur à calcul parallèle de préfixes=== Les '''additionneurs à calcul parallèle de préfixes''' sont des additionneurs à anticipation de retenue améliorés pour gagner en performances. Les additionneurs à anticipation de retenue générent des signaux ''propagate'' et ''generate'' pour un bit, sous-entedu 1 bit par opérande. L'optimisation apportée est de générer des signaux ''propagate'' et ''generate'' pour un bit, mais aussi pour des groupes de 2, 3, 4, ..., N bits. Par exemple, il est possible de générer un signal ''P 0 vers 7'', qui précise si la retenue de la seconde colonne est propagée jusqu'à la 7ème colonne ou non. Un autre exemple est un signal de génération qui indique si les colonnes 4 à 7 génèrent une retenue ou non. En clair, les signaux P et G ont maintenant un intervalle, qui précise de quelle colonne vers quelle colonne se fait la propagation, ou entre quelles colonnes se fait la génération. De plus, les signaux pour un intervalle peuvent se calculer en combinant les signaux pour des intervalles plus restreints. Par exemple, pour calculer P pour les colonnes 0 à 10 peuvent se calculer à partir des deux signaux P des colonnes 0-4 et 5-10. Néanmoins, il y a plusieurs manières pour subdiviser les intervalles en intervalles plus petits et combiner le tout. Et elles donnent chacune des additionneurs différent, comme l'additionneur de Ladner-Fisher, l'additionneur de Brent-Kung, l'additionneur de Kogge-Stone, ou tout design hybride. Ils ont des caractéristiques différentes. L'additionneur de Brent-Kung est le plus lent de tous les additionneurs cités, mais c'est celui qui utilise le moins de portes logiques. Les autres ont des performances un peu plus variables, mais utilisent plus de portes logiques. {| |[[File:Additionneur de Kogge-Stone.jpg|vignette|Additionneur de Kogge-Stone.]] |[[File:Additionneur de Ladner-Fisher.jpg|vignette|Additionneur de Ladner-Fisher.]] |} [[File:4bitKoggeStone.svg|vignette|upright=1.5|Additionneur de Kogge-Stone pour 4 bits.]] L'additionneur Kogge-Stone est illustré ci-contre. Il est composé de plusieurs couches de portes logiques. La toute première calcule les signaux P et G pour chaque colonne, comme le ferait un additionneur à anticipation de retenue. Il s'agit de la couche en rouge dans le schéma ci-dessous. Les circuits en jaune combinent ces signaux de manière à calculer les signaux P et G pour plusieurs colonnes. En vert, les circuits calculent la retenue finale. Voici le circuit pour 8 bits : [[File:Kogge-stone-8-bit.png|centre|vignette|upright=2|Additionneur de Kogge-Stone pour 8 bits.]] ==L'addition signée et la soustraction== Après avoir vu l'addition, il est logique de passer à la soustraction, les deux opérations étant très proches. Si on sait câbler une addition entre entiers positifs, câbler une soustraction n'est pas très compliqué. De plus, la soustraction permet de faire des additions de nombres signés. ===Le soustracteur pour opérandes entiers=== Pour soustraire deux nombres entiers, on peut adapter l'algorithme de soustraction utilisé en décimal, celui que vous avez appris à l'école. Celui-ci ressemble fortement à l'algorithme d'addition : on soustrait les bits de même poids, et on propage éventuellement une retenue sur la colonne suivante. À la différence de l'addition, la retenue est soustraite, et non ajoutée. La table de soustraction nous dit quel est le résultat de la soustraction de deux bits. La voici : * 0 - 0 = 0 ; * 0 - 1 = 1 et une retenue ; * 1 - 0 = 1 ; * 1 - 1 = 0. [[File:Algebra1 05 fig014.svg|centre|vignette|Soustraction en binaire, avec les retenues en rouge.]] La table de soustraction peut servir de table de vérité pour construire un circuit qui soustrait deux bits. Celui-ci est appelé un '''demi-soustracteur'''. Il ressemble beaucoup à un demi-additionneur, les différences se résumant à une porte NON ajoutée pour le calcul de la retenue. [[File:Half Subtractor Vektor.svg|centre|vignette|Demi-soustracteur.]] Comme pour l'additionneur, deux demi-soustracteurs peuvent être combinés pour donner un '''soustracteur complet'''. Le calcul de la retenue se fait en combinant les deux retenues des demi-soustracteurs avec une porte OU. Les soustracteurs complets sont utilisés pour créer des soustracteurs à propagation de retenue ou tout autre circuit soustracteur, sur le même modèle que les additionneurs. [[File:FullSubtractor.svg|centre|vignette|upright=2|Soustracteur complet.]] Vous l'aurez sans doute remarqué, mais le demi-soustracteur ressemble beaucoup au demi-additionneur. La seule différence est une porte NON ajoutée au bon endroit dans le demi-soustracteur. {| |[[File:Half-adder.svg|vignette|Demi-additionneur]] |[[File:Half Subtractor Vektor.svg|vignette|upright=1.3|Demi-soustracteur]] |} La conséquence est qu'il est possible de créer un circuit capable de faire à la fois des additions et des soustractions. L'idée est de remplacer la porte NON du demi-soustracteur par un inverseur commandable. Si on envoie un zéro sur l'entrée de commande, l'inverseur commandable se comportera comme une porte OUI. Le circuit sera alors identique à un demi-additionneur. Si on envoie un 1 sur l'entrée de commande, l'inverseur commandable se comportera comme une porte NON. le circuit sera alors un demi-soustracteur. Il faut faire cela pour chaque demi-soustracteur, ce qui donne ceci pour un soustracteur complet. le résultat est alors appelé un '''additionneur-soustracteur complet'''. [[File:Additionneur-soustracteur complet.png|centre|vignette|upright=2|Additionneur-soustracteur complet]] ===L'additionneur-soustracteur pour opérandes codées en complément à deux=== Étudions le cas de la soustraction en complément à deux, dans l'objectif de créer un circuit soustracteur. Vous savez sûrement que a−b et a+(−b) sont deux expressions équivalentes. Et en complément à deux, − b = not(b) + 1. Dit autrement, a − b = a + not(b) + 1. On pourrait se dire qu'il faut deux additionneurs pour faire le calcul, mais la majorité des additionneurs possède une entrée de retenue pour incrémenter le résultat de l'addition. Un soustracteur en complément à deux est donc simplement composé d'un additionneur et d'un inverseur. [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Soustracteur en complément à deux.]] Il est possible de créer un circuit capable d'effectuer soit une addition, soit une soustraction : il suffit de remplacer l'inverseur par un inverseur commandable, qui peut être désactivé. On a vu comment créer un tel inverseur commandable dans le chapitre sur les circuits combinatoires. On peut remarquer que l'entrée de retenue et l'entrée de commande de l'inverseur sont activées en même temps : on peut fusionner les deux signaux en un seul. [[File:Additionneur-soustracteur en complément à deux.png|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux.]] Une implémentation alternative est la suivante. Elle remplace l'inverseur commandable par un multiplexeur. [[File:4-bit ripple carry adder-subtracter.svg|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux, version alternative.]] ===L'additionneur-soustracteur pour opérandes codées en signe-magnitude=== Passons maintenant aux nombres codés en signe-valeur absolue, les deux opérandes étant notées A et B. Suivant les signes des deux opérandes, on a quatre cas possibles : A + B, A − B (B négatif), −A + B (A négatif) et −A − B (A et B négatifs). Une astuce est que le circuit n'a besoin que de calculer A + B et A − B : il peut les inverser pour obtenir − A − B ou B − A. A + B et A − B peuvent se calculer avec un additionneur-soustracteur, reste à corriger le résultat. Il suffit de lui ajouter un inverseur commandable pour obtenir le circuit d'addition finale. [[File:Additionneur en signe-valeur absolue.png|centre|vignette|upright=2|Additionneur en signe-valeur absolue.]] Toute la difficulté tient dans le calcul du bit de signe du résultat, quand interviennent des soustractions. Autant l'addition de deux nombres de même signe (A + B et −A − B) ne pose aucun problème, autant les soustractions posent problème (A − B et −A + B). Suivant que <math>A<B</math> ou que <math>A>B</math>, le signe du résultat ne sera pas le même. Déterminer le signe du résultat se fait en regardant les bits de débordement d'entier, comme on le verra plus bas. ===L'additionneur-soustracteur pour opérandes codées en représentation par excès=== Passons maintenant aux nombres codés en représentation par excès. On pourrait croire que ces nombres s'additionnent comme des nombres non-signés, mais ce serait oublier la présence du biais, qui pose problème. Dans les cas de nombres signés gérés avec un biais, voyons ce que donne l'addition de deux nombres : : <math>( n_1 + biais ) + ( n_2 + biais ) = n_1 + n_2 + 2 \times biais</math> Or, le résultat correct serait : : <math>n_1 + n_2 + biais</math> En effectuant l'addition telle quelle, le biais est compté deux fois. On doit donc le soustraire après l'addition pour obtenir le résultat correct. Même chose pour la soustraction qui donne ceci : : <math>(n_1 + biais) - (n_2 + biais) = n_1 - n_2</math> Or, le résultat correct serait : : <math> ( n_1 - n_2 ) + biais </math> Il faut rajouter le biais pour obtenir l'exposant correct. On a donc besoin de deux additionneurs/soustracteurs : un pour additionner/soustraire les représentations binaires des opérandes, et un autre pour ajouter/retirer le biais en trop/manquant. ==L'additionneur BCD== Maintenant, voyons un additionneur qui additionne deux entiers au format BCD. Pour cela, nous allons devoir passer par deux étapes. La première est de créer un circuit capable d'additionneur deux chiffres BCD. Ensuite, nous allons voir comment enchaîner ces circuits pour créer un additionneur BCD complet. ===L'additionneur BCD qui fait l'opération chiffre par chiffre=== Nous allons commencer par voir un additionneur qui additionne deux chiffres en BCD, une sorte d'équivalent BCD de l'additionneur complet. Il fournit un résultat sur 4 bits et une retenue qui est mise à 1 si le résultat dépasse 10 (la limite d'un chiffre BCD). Les deux opérandes sont des chiffres BCD codés sur 4 bits et sont additionnés en binaire par un additionneur des plus normaux, similaire à ceux vus plus haut. Le résultat est alors un entier codé en binaire, sur 5 bits, qu'on corrige/convertit pour obtenir un chiffre BCD et une retenue sortante. Pour corriger le résultat, une idée intuitive serait de prendre le résultat et de faire une division par 10. Le quotient donne la retenue, alors que le reste est le résultat, le chiffre BCD. Mais un circuit diviseur par 10 utilise beaucoup de portes logiques, ce qui ne vaut pas le coup. Une autre méthode détecte si le résultat est égal ou supérieur à 10, ce qui correspond à un "débordement" (on dépasse les limites d'un chiffre BCD). Si le résultat est plus petit que 10, il n'y a rien à faire : le résultat est bon et la retenue est de zéro. Par contre, si le résultat vaut 10 ou plus, il faut corriger le résultat et générer une retenue à 1. Il faut donc ajouter un circuit qui détecte si le résultat est supérieur à 9, qui calcule directement la retenue. Ce circuit peut se fabriquer simplement à partir de sa table de vérité, ou en utilisant les techniques que nous verrons dans un chapitre ultérieur sur les comparateurs. La solution la plus simple est clairement d'utiliser la table de vérité, ce qui est très simple, assez pour être laissé en exercice au lecteur. Pour comprendre comment corriger le résultat, établissons une table de vérité qui associe le résultat et le résultat corrigé. L'entrée vaut au minimum 10 et au maximum 9 + 9 = 18. On considère la sortie comme un tout, la retenue étant un 5ème bit, le bit de poids fort. {|class="wikitable" |- ! colspan="5" | Entrée ! ! rowspan="10" | ! Retenue ! Résultat corrigé (sans retenue) ! interprétation de la sortie en binaire (retenue inclue) |- | 0 || 1 || 0 || 1 || 0 | (10) | 1 || 0000 | (16) |- | 0 || 1 || 0 || 1 || 1 | (11) | 1 || 0001 | (17) |- | 0 || 1 || 1 || 0 || 0 | (12) | 1 || 0010 | (18) |- | 0 || 1 || 1 || 0 || 1 | (13) | 1 || 0011 | (19) |- | 0 || 1 || 1 || 1 || 0 | (14) | 1 || 0100 | (20) |- | 0 || 1 || 1 || 1 || 1 | (15) | 1 || 0101 | (21) |- | 1 || 0 || 0 || 0 || 0 | (16) | 1 || 0110 | (22) |- | 1 || 0 || 0 || 0 || 1 | (17) | 1 || 0111 | (23) |- | 1 || 0 || 0 || 1 || 0 | (18) | 1 || 1000 | (24) |} En analysant le tableau, on voit que pour corriger le résultat, il suffit d'ajouter 6. La raison est que le résultat déborde d'un nibble à 16 en binaire, mais à 10 en décimal : il suffit d'ajouter la différence entre les deux, à savoir 6, et le débordement binaire fait son travail. Donc, la correction après une addition est très simple : si le résultat dépasse 9, on ajoute 6. On peut maintenant implémenter l'additionneur BCD, en combinant le comparateur avec 10, le circuit de correction, et l'additionneur. La première solution calcule deux versions du résultat : la version corrigée, la version normale. Le choix entre les deux est réalisée par un multiplexeur, commandé par le comparateur. [[File:Additionneur BCD.png|centre|vignette|upright=1.5|Additionneur BCD]] L'autre solution utilise un circuit commandable qui soit additionne 6, soit ne fait rien. Le choix entre les deux est commandé par le bit calculé par le comparateur. [[File:Additionneur BCD, seconde version.png|centre|vignette|upright=1.5|Additionneur BCD, seconde version.]] Une version alternative du circuit précédent est la suivante. Il contient deux additionneurs : un pour additionner les deux chiffres BCD, un autre pour additionner 6 si besoin. Le résultat du comparateur est directement utilisé pour générer l'opérande du second additionneur : 0 ou 6. Le circuit est simple à concevoir, mais gaspille beaucoup de circuit. Idéalement, il vaudrait mieux utiliser un circuit combinatoire d'addition avec une constante. [[File:Adder 4 Bit BCD.svg|centre|vignette|upright=2|Additionneur BCD, circuit complet.]] Pour obtenir un additionneur BCD complet, il suffit d’enchaîner les additionneurs précédents, comme on le ferait avec les additionneurs complets dans un additionneur à propagation de retenue. Au final, l'additionneur BCD est beaucoup plus compliqué qu'un additionneur normal, car il rajoute un comparateur ">9", un petit additionneur pour ajouter 6 et éventuellement d'autres circuits. De plus, il est difficile d'appliquer les optimisations disponibles sur les additionneurs non-BCD. Notamment, les circuits d'anticipation de retenue sont totalement à refaire et le résultat est relativement compliqué. C'est ce qui explique pourquoi le BCD a progressivement été abandonné au profit du binaire simple. La soustraction en BCD se fait comme en binaire : le nombre à soustraire est remplacé par son complément, le circuit additionne le complément et l'autre opérande, le débordement d'entier fait que le résultat marche. Sauf qu'ici, le complément est un complément à 9. Il se calcule chiffre par chiffre : chaque chiffre est remplacé par (9 - le chiffre en question). ===L'additionneur BCD par ajustement décimal=== L'additionneur BCD précédent effectuait son travail chiffre BCD par chiffre BCD, mais il existe des additionneurs BCD qui font autrement. Sur les premiers processeurs x86, il n'y avait pas d'opération d'addition BCD proprement dit, seulement une addition binaire normale de 8, 16 ou 32 bits. Par contre, elle était secondée par une opération dite d''''ajustement décimal''' qui transformait un nombre binaire en nombre codé en BCD. L'opération d'ajustement décimal prenait un opérande de 8 bits codé en binaire et fournissait un résultat de la même taille, c'est à dire deux chiffres BCD. Effectuer une addition BCD demandait donc de faire deux opérations à la suite : une addition binaire simple, suivie par l'opération d'ajustement décimal. Cela permettait de gérer des nombres entiers en binaire usuel et des entiers BCD sans avoir deux instructions d'addition séparées pour les deux, sans compter que cela simplifiait aussi les circuits d'addition. L'ajustement décimal s'effectue en ajoutant une constante bien précise à l'opérande à convertir en BCD. L'idée est que la constante est découpée en morceaux de 4 bits, correspondant chacun à un chiffre BCD de l'opérande, chaque morceau contenant soit un 0, soit 6. Cela permet d'ajouter soit 0, soit 6, à chaque chiffre BCD, et donc de le corriger. La propagation des retenues d'un chiffre à l'autre est effectuée automatiquement par l'addition binaire de la constante. L'opération d'ajustement décimal calcule automatiquement la constante. Elle découpe l'opérande en ''nibbles'', vérifie si chaque ''nibble'' est supérieur ou égal à 10, puis détermine la valeur de chaque ''nibble'' de la constante finale. Par exemple, si je prends l'opérande 1001 1110, le ''nibble'' de poids faible déborde, alors que celui de poids fort non. La constante sera donc 0000 0110 : 0x06. Inversement, si le ''nibble'' de poids fort déborde et pas celui de poids faible, la constante sera alors 0x60. Et la constante est de 0x66 si les deux ''nibbles'' débordent, de 0x00 si aucun ne déborde. Le circuit d’ajustement décimal est donc composé de trois étapes : deux étapes pour calculer la constante, et un circuit d'addition pour additionner cette constante au nombre de départ. La première étape découpe l'opérande en morceaux de 4 bits, en chiffres BCD, et vérifie si chacun d'entre eux vaut 10 ou plus. La seconde étape prend les résultats de la première étape, et les combine pour calculer la constante. Enfin, on trouve l'addition finale, qui était réalisée par un circuit d'addition utilisé à la fois pour l'ajustement décimal et l'addition binaire. La différence entre une addition normale et une opération d'ajustement décimal tient dans le fait que les deux premières étapes sont désactivées dans une addition normale. [[File:Additionneur BCD parallèle.png|centre|vignette|upright=1.5|Additionneur BCD parallèle]] ===L'additionneur biquinaire=== Les entiers BCD ne sont qu'un des encodages hybrides entre décimal et binaire. L'encodage biquinaire est l'un d'entre eux et nous allons faire un rappel rapide à ce sujet. Pour simplifier, un chiffre encodé en biquinaire est composé de deux parties : un bit, couplé à une partie quinaire encodée en représentation ''one-hot''. La partie quinaire encode un nombre allant de 0 à 4, ce qui prend 5 bits (0, 1, 2, 3 et 4). Le bit indique s'il faut ou non ajouter 5 à la valeur encodée par la partie quinaire. Ainsi, on peut coder tous les nombres de 0 à 9. Additionner deux nombres de biquinaire demande donc d'additionner deux parties quinaires encodées en ''one-hot'' et d'additionner deux bits. Mais attention : il faut tenir compte de la retenue de l'addition des parties quinaires. Et idéalement, il faut aussi tenir compte d'une retenue entrante, provenant de l'addition de la colonne de chiffres précédente. Toute la difficulté vient de la création de l'additionneur ''one-hot''. Heureusement, vu qu'il n'y a que 4-5 bits à additionner, il est souvent fabriqué à partir de sa table de vérité. [[File:Additionneur bi-quinaire.png|centre|vignette|upright=2|Additionneur bi-quinaire]] Un avantage du biquinaire est que le calcul du complément à 9 est très simple. Il faut pour cela : inverser la partie binaire avec une porte NON, puis inverser l'ordre des bits de la partie quinaire. Concrètement, le bit de poids faible devient le bit de poids fort, et ainsi de suite. Par exemple, une partie quinaire 01000 devient 00010, 10000 devient 00001, 00100 ne change pas, etc. Le tout peut se calculer avec une porte NON et 5 multiplexeurs. ===L'additionneur BCD avec calculs intermédiaires en biquinaire=== L'ordinateur IBM 1401, un ancien ''mainframe'' des années 60, utilisait un additionneur BCD un peu particulier. Les nombres étaient encodés en BCD dans la mémoire de l'ordinateur, mais les circuits de calcul utilisaient la représentation biquinaire. Lors d'un calcul, le processeur de l'ordinateur traduisait les chiffres BCD en représentation biquinaire, faisait une addition en biquinaire, avant de traduire le résultat en BCD normal. Pour être précis, l'IBM 1401 utilisait une variante du biquinaire. L'encodage biquinaire de l'IBM 1401 est le suivant : la partie binaire disait si le chiffre était pair ou non, la partie quinaire encodait les valeurs 0, 2, 4, 6 et 8. Le chiffre se calculait en additionnant la partie binaire (0 ou 1) au nombre pair encodé par la partie quinaire. Si l'IBM 1401 utilisait cette variante du biquinaire, c'est car elle donnait des circuits de conversion BCD-biquinaire plus économes en portes logiques et plus rapides. La partie binaire est le bit de poids faible du chiffre BCD, la partie biquinaire est calculée par un simple décodeur qui prend en entrée le chiffre BCD, amputé de son bit de poids faible. La traduction inverse demande d'utiliser un encodeur, à la place du décodeur. Par contre, le circuit d'addition biquinaire était plus compliqué du fait de la gestion des retenues. L'addition des parties binaires et quinaires se faisait en parallèle, dans deux additionneurs séparés. Cependant, l'addition des parties binaire fournit une retenue, qu'il faut prendre en compte. Pour cela, l'IBM 1401 disposait d'un troisième additionneur qui fournissait le résultat final, encodé en biquinaire. [[File:Additionneur bi-quinaire de l'IBM 1401.png|centre|vignette|upright=2|Additionneur biquinaire de l'IBM 1401]] Une implémentation moderne demanderait d'utiliser des portes ET combinées à des portes OU, le circuit pouvant être construit simplement à partir de sa table de vérité. Sur l'IBM 1401, le circuit était cependant différent, en raison de l'utilisation de OU câblés, des croisements de fils qui fonctionnent comme des portes OU, que nous n'avons pas encore vu pour le moment, mais qui seront détaillés dans quelques chapitres. Les OU câblés étaient utilisés pour simplifier le design du circuit, mais demandaient des portes logiques spécifiques, ce qui collait avec le fait que ce ''mainframe'' utilisait des transistors en Germanium. L'implémentation exacte est décrite dans cet article de blog, mais je ne recommande sa lecture qu'à ceux qui savent ce qu'est un OU câblé : * [https://www.righto.com/2015/10/qui-binary-arithmetic-how-1960s-ibm.html Qui-binary arithmetic: how a 1960s IBM mainframe does math]. ==Les débordements d'entier lors d'une addition/soustraction== Les instructions arithmétiques manipulent des entiers codés sur un nombre fixe de bits, qui ne peuvent prendre leurs valeurs que dans un intervalle. Pour les nombres positifs, un ordinateur qui code ses entiers sur n bits pourra coder tous les entiers allant de 0 à <math>2^n -1</math>. Pour les nombres négatifs, l'intervalle est différent et dépend de la représentation utilisée. Dans le cas général, l'ordinateur peut coder les valeurs comprises de <math>N_\text{min}</math> à <math>N_\text{max}</math>. Si le résultat d'un calcul sort de cet intervalle, il ne peut pas être représenté par l'ordinateur et il se produit ce qu'on appelle un '''débordement d'entier'''. La '''valeur haute de débordement''' désigne la première valeur qui est trop grande pour être représentée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 0 et 7, la valeur haute de débordement est égale à 8. On peut aussi définir la '''valeur basse de débordement''', qui est la première valeur trop petite pour être codée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 8 et 250, la valeur basse de débordement est égale à 7. Pour les nombres entiers, la valeur haute de débordement vaut <math>N_\text{max} + 1</math> , alors que la valeur basse vaut <math>N_\text{min} - 1</math> (avec <math>N_\text{max}</math> et <math>N_\text{min}</math> respectivement la plus grande et la plus petite valeur codable par l'ordinateur). ===La correction des débordements d'entier : l'arithmétique saturée=== Quand un débordement d'entier survient, tous les circuits de calcul ne procèdent pas de la même manière. Dans les grandes lignes, il y a deux réactions possibles : soit on corrige automatiquement le résultat du débordement, soit on ne fait rien et on se contente de détecter le débordement. Si le débordement n'est pas corrigé automatiquement, le circuit ne conserve que les bits de poids faibles du résultat. Les bits en trop sont simplement ignorés. On dit qu'on utilise l''''arithmétique modulaire'''. Le problème avec ce genre d'arithmétique, c'est qu'une opération entre deux grands nombres peut donner un résultat très petit. Par exemple, si je dispose de registres 4 bits et que je souhaite faire l'addition 1111 + 0010 (ce qui donne 15 + 2), le résultat est censé être 10001 (17), ce qui est un résultat plus grand que la taille d'un registre. En conservant les 4 bits de poids faible, j’obtiens 0001 (1). En clair, un résultat très grand est transformé en un résultat très petit. Cela peut poser problèmes si on travaille uniquement avec des nombres positifs, mais c'est aussi utilisé pour coder des nombres en complément à deux. D'autres circuits utilisent ce qu'on appelle l''''arithmétique saturée''' : si un calcul génère un débordement, on arrondi le résultat au plus grand entier supporté par le circuit. Les circuits capables de calculer en arithmétique saturée sont un peu plus complexes, vu qu'il faut rajouter des circuits pour corriger le résultat en cas de débordement. Il suffit généralement de rajouter un ''circuit de saturation'', qui prend en entrée le résultat et le corrige en cas de débordement. Ce circuit de saturation met la valeur maximale en sortie si un débordement survient, mais se contente de recopier le résultat du calcul sur sa sortie s'il n'y a pas de débordement. Typiquement, il est composé d'une couche de multiplexeurs, qui sélectionnent quelle valeur mettre sur la sortie : soit le résultat du calcul, soit le plus grand nombre entier géré par le processeur, soit le plus petit (pour les nombres négatifs/soustractions). L'arithmétique saturée est utilisée pour les additions et soustractions, mais c'est plus rare pour les multiplications/divisions. Une des raisons est que le résultat d'une addition/soustraction prend un bit de plus que le résultat, là où les multiplications doublent le nombre de bits. Quand une addition déborde, le résultat réel est proche de la valeur maximale codable. mais quand une multiplication déborde, le résultat peut parfois valoir 200 à 60000 fois plus que la valeur maximale codable. Les calculs avec une valeur saturée/corrigée sont donc crédibles pour une suite d'additions, mais pas pour une suite de multiplications. ===La détection des débordements entiers=== Quand un débordement d'entier a eu lieu, il vaut mieux que l'additionneur prévienne ! Pour cela, l'additionneur a une '''sortie de débordement''', parfois nommée ''Overflow'', dont la valeur indique si l'addition a généré un débordement d'entier ou non. Reste que détecter un débordement ne se fait pas de la même manière selon que l'on parle d'un additionneur non-signé ou signé. Pour les additionneur non-signés, l'additionneur calcule un bit de plus que ce qui est supporté par l'ordinateur. Par exemple, un additionneur 32 bits fournit un résultat sur 33 bits, un débordement d'entier a lieu quand le 33ème bit est à 1. Précisément, la sortie de débordement n'est autre que la retenue finale, celle fournie par le dernier additionneur complet. Le seul type de débordement possible est un débordement par le haut, où le résultat dépasse la valeur maximale. Avec l'arithmétique saturée, le circuit de saturation consiste en une seule couche de multiplexeurs, voire en un circuit de mise à la valeur maximale tel que vu dans le chapitre sur les opérations bits à bits. [[File:Gestion des débordements d'entiers.png|centre|vignette|upright=2.5|Gestion des débordements d'entiers lors d'une addition non-signée.]] Pour les additionneurs non-signés, la gestion des débordements d'entiers dépend fortement de la représentation signée. Nous allons étudier le cas du complément à deux. Si vous vous rappelez le chapitre 1, les calculs sur des nombres en complètement à deux utilisent les règles de l'arithmétique modulaire, c'est une condition nécessaire. À priori, on peut penser que dans ces conditions, les débordements d'entiers sont une chose parfaitement normale, qui nous permet d'avoir des résultats corrects. Néanmoins, certains débordements d'entiers peuvent survenir malgré tout et produire des bugs assez ennuyeux. Si l'on tient en compte les règles du complément à deux, on sait que le bit de poids fort (le plus à gauche) permet de déterminer si le nombre est positif ou négatif : il indique le signe du nombre. Tout se passe comme si les entiers en complément à deux étaient codés sur un bit de moins, et avaient leur longueur amputé du bit de poids fort. Si le résultat d'un calcul écrase le bit de poids fort, il y a un débordement d'entiers. Il existe une règle simple qui permet de détecter ces débordements d'entiers. L'addition de deux nombres positifs ne peut pas être un nombre négatif. Si on additionne deux nombres dont le bit de signe est à 0 et que le bit de signe du résultat est à 1, on est en face d'un débordement d'entiers. Même chose pour deux nombres négatifs : le résultat de l'addition ne peut pas être positif. On peut résumer cela en une phrase : si deux nombres de même signe sont ajoutés, un débordement a lieu quand le bit du signe du résultat a le signe opposé. Modifier les circuits d'au-dessus pour qu'ils détectent les débordements en complément à deux est simple comme bonjour : il suffit créer un petit circuit combinatoire qui prenne en entrée les bits de signe des opérandes et du résultat, et qui fasse le calcul de l'indicateur de débordements. Si l'on rédige sa table de vérité, on doit se retrouver avec la table suivante : {|class="wikitable" |- !Entrées !Sortie |- |000||0 |- |001||1 |- |010||0 |- |011||0 |- |100||0 |- |101||0 |- |110||1 |- |111||0 |} L'équation de ce circuit est la suivante, avec <math>S_a</math> et <math>S_b</math> les signes des deux opérandes, et <math>C_i</math> la retenue de la colonne précédente : : <math> ( S_a . S_b . \overline{C_i} ) + ( \overline{S_a} . \overline{S_b} . C_i )</math> En simplifiant, on obtient alors : : <math>( S_a . S_b ) \oplus C_i</math> Or, il se trouve que <math>S_a . S_b</math> est tout simplement la retenue en sortie du dernier additionneur, que nous noterons <math>C_o</math>. On trouve donc : : <math>C_o \oplus C_i</math> Il suffit donc de faire un XOR entre la dernière retenue et la précédente pour obtenir le bit de débordement. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de décalage et de rotation | prevText=Les circuits de décalage et de rotation | next=Les circuits de comparaison | nextText=Les circuits de comparaison }} </noinclude> aeb8q0ixbe5k1llsio5jrlro64sb8u3 Fonctionnement d'un ordinateur/Sommaire 0 69596 768006 765834 2026-06-18T14:24:58Z Mewtow 31375 /* Les circuits combinatoires */ 768006 wikitext text/x-wiki __NOTOC__ * [[Fonctionnement d'un ordinateur/Introduction|Introduction]] ==Le codage des informations== * [[Fonctionnement d'un ordinateur/L'encodage des données|L'encodage des données]] * [[Fonctionnement d'un ordinateur/Le codage des nombres|Le codage des nombres]] * [[Fonctionnement d'un ordinateur/Les codes de détection/correction d'erreur|Les codes de détection/correction d'erreur]] ==Les circuits électroniques== * [[Fonctionnement d'un ordinateur/Les portes logiques|Les portes logiques]] ===Les circuits combinatoires=== * [[Fonctionnement d'un ordinateur/Les circuits combinatoires|Les circuits combinatoires]] * [[Fonctionnement d'un ordinateur/Les circuits de masquage|Les circuits de masquage]] * [[Fonctionnement d'un ordinateur/Les circuits de sélection|Les circuits de sélection]] * [[Fonctionnement d'un ordinateur/Les circuits incrémenteurs/décrémenteurs|Les circuits incrémenteurs/décrémenteurs]] ===Les circuits séquentiels=== * [[Fonctionnement d'un ordinateur/Les bascules : des mémoires de 1 bit|Les bascules : des mémoires de 1 bit]] * [[Fonctionnement d'un ordinateur/Les circuits synchrones et asynchrones|Les circuits synchrones et asynchrones]] * [[Fonctionnement d'un ordinateur/Les registres et mémoires adressables|Les registres et mémoires adressables]] * [[Fonctionnement d'un ordinateur/Les circuits compteurs et décompteurs|Les circuits compteurs et décompteurs]] * [[Fonctionnement d'un ordinateur/Les timers et diviseurs de fréquence|Les timers et diviseurs de fréquence]] ===Les circuits de calcul et de comparaison=== * [[Fonctionnement d'un ordinateur/Les circuits de décalage et de rotation|Les circuits de décalage et de rotation]] * [[Fonctionnement d'un ordinateur/Les circuits pour l'addition et la soustraction|Les circuits pour l'addition et la soustraction]] * [[Fonctionnement d'un ordinateur/Les circuits de comparaison|Les circuits de comparaison]] * [[Fonctionnement d'un ordinateur/Les unités arithmétiques et logiques entières (simples)|Les unités arithmétiques et logiques entières (simples)]] * [[Fonctionnement d'un ordinateur/Les circuits pour l'addition multiopérande|Les circuits pour l'addition multiopérande]] * [[Fonctionnement d'un ordinateur/Les circuits pour la multiplication et la division|Les circuits pour la multiplication et la division]] * [[Fonctionnement d'un ordinateur/Les circuits de calcul logique et bit à bit|Les circuits de calcul logique et bit à bit]] * [[Fonctionnement d'un ordinateur/Les circuits de calcul flottant|Les circuits de calcul flottant]] * [[Fonctionnement d'un ordinateur/Les circuits de calcul trigonométriques|Les circuits de calcul trigonométriques]] ===Les circuits intégrés à semi-conducteurs=== * [[Fonctionnement d'un ordinateur/Les transistors et portes logiques|Les transistors et portes logiques]] * [[Fonctionnement d'un ordinateur/Les circuits intégrés|Les circuits intégrés]] * [[Fonctionnement d'un ordinateur/L'interface électrique entre circuits intégrés et bus|L'interface électrique entre circuits intégrés et bus]] ==L'architecture d'un ordinateur== * [[Fonctionnement d'un ordinateur/L'architecture de base d'un ordinateur|L'architecture de base d'un ordinateur]] * [[Fonctionnement d'un ordinateur/La hiérarchie mémoire|La hiérarchie mémoire]] * [[Fonctionnement d'un ordinateur/La performance d'un ordinateur|La performance d'un ordinateur]] * [[Fonctionnement d'un ordinateur/La loi de Moore et les tendances technologiques|La loi de Moore et les tendances technologiques]] * [[Fonctionnement d'un ordinateur/Les techniques de réduction de la consommation électrique d'un processeur|Les techniques de réduction de la consommation électrique d'un processeur]] ==Les bus électroniques et la carte mère== * [[Fonctionnement d'un ordinateur/La carte mère, chipset et BIOS|La carte mère, chipset et BIOS]] * [[Fonctionnement d'un ordinateur/Les bus et liaisons point à point (généralités)|Les bus et liaisons point à point (généralités)]] * [[Fonctionnement d'un ordinateur/Les encodages spécifiques aux bus|Les encodages spécifiques aux bus]] * [[Fonctionnement d'un ordinateur/Les liaisons point à point|Les liaisons point à point]] * [[Fonctionnement d'un ordinateur/Les bus électroniques|Les bus électroniques]] * [[Fonctionnement d'un ordinateur/Quelques exemples de bus et de liaisons point à point|Quelques exemples de bus et de liaisons point à point]] ==Les mémoires RAM/ROM== * [[Fonctionnement d'un ordinateur/Les différents types de mémoires|Les différents types de mémoires]] * [[Fonctionnement d'un ordinateur/L'interface d'une mémoire électronique|L'interface d'une mémoire électronique]] * [[Fonctionnement d'un ordinateur/Le bus mémoire|Le bus mémoire]] ===La micro-architecture d'une mémoire adressable=== * [[Fonctionnement d'un ordinateur/Les cellules mémoires|Les cellules mémoires]] * [[Fonctionnement d'un ordinateur/Le plan mémoire|Le plan mémoire]] * [[Fonctionnement d'un ordinateur/Contrôleur mémoire interne|Le contrôleur mémoire interne]] * [[Fonctionnement d'un ordinateur/Mémoires évoluées|Les mémoires évoluées]] ===Les mémoires primaires=== * [[Fonctionnement d'un ordinateur/Les mémoires ROM|Les mémoires ROM : Mask ROM, PROM, EPROM, EEPROM, Flash]] * [[Fonctionnement d'un ordinateur/Les mémoires SRAM synchrones|Les mémoires SRAM synchrones]] * [[Fonctionnement d'un ordinateur/Les mémoires RAM dynamiques (DRAM)|Les mémoires RAM dynamiques (DRAM)]] * [[Fonctionnement d'un ordinateur/Contrôleur mémoire externe|Le contrôleur mémoire externe]] ===Les mémoires exotiques=== * [[Fonctionnement d'un ordinateur/Les mémoires associatives|Les mémoires associatives]] * [[Fonctionnement d'un ordinateur/Les mémoires FIFO et LIFO|Les mémoires FIFO et LIFO]] ==Le processeur== ===L'architecture externe=== * [[Fonctionnement d'un ordinateur/Langage machine et assembleur|Langage machine et assembleur]] * [[Fonctionnement d'un ordinateur/Les registres du processeur|Les registres du processeur]] * [[Fonctionnement d'un ordinateur/Le modèle mémoire : alignement et boutisme|Le modèle mémoire : alignement et boutisme]] * [[Fonctionnement d'un ordinateur/Les modes d'adressage|Les modes d'adressage]] * [[Fonctionnement d'un ordinateur/L'encodage des instructions|L'encodage des instructions]] * [[Fonctionnement d'un ordinateur/Les jeux d'instructions|Les jeux d'instructions]] * [[Fonctionnement d'un ordinateur/La pile d'appel et les fonctions|La pile d'appel et les fonctions]] * [[Fonctionnement d'un ordinateur/Les interruptions et exceptions|Les interruptions et exceptions]] ===La micro-architecture=== * [[Fonctionnement d'un ordinateur/Les composants d'un processeur|Les composants d'un processeur]] * [[Fonctionnement d'un ordinateur/Le chemin de données|Le chemin de données]] * [[Fonctionnement d'un ordinateur/L'unité de chargement et le program counter|L'unité de chargement et le program counter]] * [[Fonctionnement d'un ordinateur/L'unité de contrôle|L'unité de contrôle]] * [[Fonctionnement d'un ordinateur/L'implémentation matérielle des branchements|L'implémentation matérielle des branchements]] ===Les jeux d'instruction anciens, avant les registres généraux ou exotiques=== * [[Fonctionnement d'un ordinateur/Les architectures à accumulateur|Les architectures à accumulateur]] * [[Fonctionnement d'un ordinateur/Les architectures à pile et mémoire-mémoire|Les architectures à pile et mémoire-mémoire]] * [[Fonctionnement d'un ordinateur/Les processeurs 8 bits et moins|Les processeurs 8 bits et moins]] ===L'espace d'adressage du processeur et la multiprogrammation=== * [[Fonctionnement d'un ordinateur/L'espace d'adressage du processeur|L'espace d'adressage du processeur]] * [[Fonctionnement d'un ordinateur/L'abstraction mémoire et la mémoire virtuelle|L'abstraction mémoire et la mémoire virtuelle]] ==Les entrées-sorties et périphériques== * [[Fonctionnement d'un ordinateur/Les méthodes de synchronisation entre processeur et périphériques|Les méthodes de synchronisation entre processeur et périphériques]] * [[Fonctionnement d'un ordinateur/L'adressage des périphériques|L'adressage des périphériques]] * [[Fonctionnement d'un ordinateur/Les périphériques et les cartes d'extension|Les périphériques et les cartes d'extension]] ==Les mémoires de stockage== * [[Fonctionnement d'un ordinateur/Les mémoires de masse : généralités|Les mémoires de masse : généralités]] * [[Fonctionnement d'un ordinateur/Les disques durs|Les disques durs]] * [[Fonctionnement d'un ordinateur/Les solid-state drives|Les solid-state drives]] * [[Fonctionnement d'un ordinateur/Les disques optiques|Les disques optiques]] * [[Fonctionnement d'un ordinateur/Compléments sur les mémoires de masse|Compléments sur les mémoires de masse]] ==La ou les mémoires caches== * [[Fonctionnement d'un ordinateur/Les mémoires cache|Les mémoires cache]] * [[Fonctionnement d'un ordinateur/Le préchargement|Le préchargement]] * [[Fonctionnement d'un ordinateur/Le Translation Lookaside Buffer|Le ''Translation Lookaside Buffer'']] ==Le parallélisme d’instructions== * [[Fonctionnement d'un ordinateur/Le pipeline|Le pipeline]] ===Les branchements et le ''front-end''=== * [[Fonctionnement d'un ordinateur/La prédiction de branchement|La prédiction de branchement]] * [[Fonctionnement d'un ordinateur/Les optimisations du chargement des instructions|Les optimisations du chargement des instructions]] ===Les pipelines multicycles simples=== * [[Fonctionnement d'un ordinateur/Les pipelines multicycles|Les pipelines multicycles]] * [[Fonctionnement d'un ordinateur/L'émission dans l'ordre des instructions|L'émission dans l'ordre des instructions]] * [[Fonctionnement d'un ordinateur/Le contournement (data forwarding)|Le contournement (data forwarding)]] * [[Fonctionnement d'un ordinateur/Les premiers processeurs Intel|Les premiers processeurs Intel]] ===L’exécution dans le désordre=== * [[Fonctionnement d'un ordinateur/L'exécution dans le désordre|L'exécution dans le désordre]] * [[Fonctionnement d'un ordinateur/Le renommage de registres|Le renommage de registres]] * [[Fonctionnement d'un ordinateur/Le scoreboarding et l'algorithme de Tomasulo|Annexe : Le scoreboarding et l'algorithme de Tomasulo]] ===Les optimisations des accès mémoire=== * [[Fonctionnement d'un ordinateur/La désambiguïsation mémoire|La désambiguïsation mémoire]] * [[Fonctionnement d'un ordinateur/Le parallélisme mémoire|Le parallélisme mémoire]] ===L'émission multiple=== * [[Fonctionnement d'un ordinateur/Les processeurs superscalaires|Les processeurs superscalaires]] * [[Fonctionnement d'un ordinateur/Exemples de microarchitectures CPU : le cas du x86|Exemples de CPU superscalaires: le cas du x86]] * [[Fonctionnement d'un ordinateur/Les processeurs VLIW et EPIC|Les processeurs VLIW et EPIC]] * [[Fonctionnement d'un ordinateur/Les architectures dataflow|Les architectures dataflow]] ==Les architectures parallèles== * [[Fonctionnement d'un ordinateur/Les architectures parallèles|Les architectures parallèles]] * [[Fonctionnement d'un ordinateur/Architectures multiprocesseurs et multicœurs|Les architectures multiprocesseurs et multicœurs]] * [[Fonctionnement d'un ordinateur/Architectures multithreadées et Hyperthreading|Les architectures multithreadées et Hyperthreading]] * [[Fonctionnement d'un ordinateur/Les architectures à parallélisme de données|Les architectures à parallélisme de données]] * [[Fonctionnement d'un ordinateur/La cohérence des caches|La cohérence des caches]] * [[Fonctionnement d'un ordinateur/Les sections critiques et le modèle mémoire|Les sections critiques et le modèle mémoire]] ==Annexes== ===Les nombres flottants : FPUs et coprocesseurs=== * [[Fonctionnement d'un ordinateur/Un exemple de jeu d'instruction : l'extension x87|Un exemple de jeu d'instruction : l'extension x87]] * [[Fonctionnement d'un ordinateur/Les coprocesseurs : FPU et IO|Les coprocesseurs : FPU et IO]] ===Les jeux d’instruction spécialisés=== * [[Fonctionnement d'un ordinateur/L'accélération matérielle de la virtualisation|L'accélération matérielle de la virtualisation]] * [[Fonctionnement d'un ordinateur/Les ISA optimisés pour la compilation/interprétation|Les ISA optimisés pour la compilation/interprétation]] * [[Fonctionnement d'un ordinateur/Les processeurs de traitement du signal|Les processeurs de traitement du signal]] * [[Fonctionnement d'un ordinateur/Les architectures actionnées par déplacement|Les architectures actionnées par déplacement]] * [[Fonctionnement d'un ordinateur/Les architectures systoliques|Les architectures systoliques]] * [[Fonctionnement d'un ordinateur/Les architectures neuromorphiques|Les réseaux de neurones matériels]] ===Les autres annexes=== * [[Fonctionnement d'un ordinateur/Le matériel réseau|Le matériel réseau]] * [[Fonctionnement d'un ordinateur/La tolérance aux pannes|La tolérance aux pannes]] * [[Fonctionnement d'un ordinateur/Les ordinateurs de première génération : tubes à vide et mémoires|Les ordinateurs de première génération : tubes à vide et mémoires]] * [[Fonctionnement d'un ordinateur/Les ordinateurs à encodages non-binaires|Les ordinateurs à encodages non-binaires]] * [[Fonctionnement d'un ordinateur/Les circuits réversibles|Les circuits réversibles]] * [[Fonctionnement d'un ordinateur/Les circuits de conversion analogique-numérique|Les circuits de conversion analogique-numérique]] {{autocat}} rzwhnwhrjbljtcguabniiwszckp1qk8 768069 768006 2026-06-18T16:54:49Z Mewtow 31375 /* Les circuits séquentiels */ 768069 wikitext text/x-wiki __NOTOC__ * [[Fonctionnement d'un ordinateur/Introduction|Introduction]] ==Le codage des informations== * [[Fonctionnement d'un ordinateur/L'encodage des données|L'encodage des données]] * [[Fonctionnement d'un ordinateur/Le codage des nombres|Le codage des nombres]] * [[Fonctionnement d'un ordinateur/Les codes de détection/correction d'erreur|Les codes de détection/correction d'erreur]] ==Les circuits électroniques== * [[Fonctionnement d'un ordinateur/Les portes logiques|Les portes logiques]] ===Les circuits combinatoires=== * [[Fonctionnement d'un ordinateur/Les circuits combinatoires|Les circuits combinatoires]] * [[Fonctionnement d'un ordinateur/Les circuits de masquage|Les circuits de masquage]] * [[Fonctionnement d'un ordinateur/Les circuits de sélection|Les circuits de sélection]] * [[Fonctionnement d'un ordinateur/Les circuits incrémenteurs/décrémenteurs|Les circuits incrémenteurs/décrémenteurs]] ===Les circuits séquentiels=== * [[Fonctionnement d'un ordinateur/Les bascules : des mémoires de 1 bit|Les bascules : des mémoires de 1 bit]] * [[Fonctionnement d'un ordinateur/Les circuits synchrones et asynchrones|Les circuits synchrones et asynchrones]] * [[Fonctionnement d'un ordinateur/Les registres et mémoires adressables|Les registres et mémoires adressables]] * [[Fonctionnement d'un ordinateur/Les circuits compteurs et décompteurs|Les circuits compteurs et décompteurs]] * [[Fonctionnement d'un ordinateur/Les compteurs à rétroaction|Les compteurs à rétroaction]] ===Les circuits de calcul et de comparaison=== * [[Fonctionnement d'un ordinateur/Les circuits de décalage et de rotation|Les circuits de décalage et de rotation]] * [[Fonctionnement d'un ordinateur/Les circuits pour l'addition et la soustraction|Les circuits pour l'addition et la soustraction]] * [[Fonctionnement d'un ordinateur/Les circuits de comparaison|Les circuits de comparaison]] * [[Fonctionnement d'un ordinateur/Les unités arithmétiques et logiques entières (simples)|Les unités arithmétiques et logiques entières (simples)]] * [[Fonctionnement d'un ordinateur/Les circuits pour l'addition multiopérande|Les circuits pour l'addition multiopérande]] * [[Fonctionnement d'un ordinateur/Les circuits pour la multiplication et la division|Les circuits pour la multiplication et la division]] * [[Fonctionnement d'un ordinateur/Les circuits de calcul logique et bit à bit|Les circuits de calcul logique et bit à bit]] * [[Fonctionnement d'un ordinateur/Les circuits de calcul flottant|Les circuits de calcul flottant]] * [[Fonctionnement d'un ordinateur/Les circuits de calcul trigonométriques|Les circuits de calcul trigonométriques]] ===Les circuits intégrés à semi-conducteurs=== * [[Fonctionnement d'un ordinateur/Les transistors et portes logiques|Les transistors et portes logiques]] * [[Fonctionnement d'un ordinateur/Les circuits intégrés|Les circuits intégrés]] * [[Fonctionnement d'un ordinateur/L'interface électrique entre circuits intégrés et bus|L'interface électrique entre circuits intégrés et bus]] ==L'architecture d'un ordinateur== * [[Fonctionnement d'un ordinateur/L'architecture de base d'un ordinateur|L'architecture de base d'un ordinateur]] * [[Fonctionnement d'un ordinateur/La hiérarchie mémoire|La hiérarchie mémoire]] * [[Fonctionnement d'un ordinateur/La performance d'un ordinateur|La performance d'un ordinateur]] * [[Fonctionnement d'un ordinateur/La loi de Moore et les tendances technologiques|La loi de Moore et les tendances technologiques]] * [[Fonctionnement d'un ordinateur/Les techniques de réduction de la consommation électrique d'un processeur|Les techniques de réduction de la consommation électrique d'un processeur]] ==Les bus électroniques et la carte mère== * [[Fonctionnement d'un ordinateur/La carte mère, chipset et BIOS|La carte mère, chipset et BIOS]] * [[Fonctionnement d'un ordinateur/Les bus et liaisons point à point (généralités)|Les bus et liaisons point à point (généralités)]] * [[Fonctionnement d'un ordinateur/Les encodages spécifiques aux bus|Les encodages spécifiques aux bus]] * [[Fonctionnement d'un ordinateur/Les liaisons point à point|Les liaisons point à point]] * [[Fonctionnement d'un ordinateur/Les bus électroniques|Les bus électroniques]] * [[Fonctionnement d'un ordinateur/Quelques exemples de bus et de liaisons point à point|Quelques exemples de bus et de liaisons point à point]] ==Les mémoires RAM/ROM== * [[Fonctionnement d'un ordinateur/Les différents types de mémoires|Les différents types de mémoires]] * [[Fonctionnement d'un ordinateur/L'interface d'une mémoire électronique|L'interface d'une mémoire électronique]] * [[Fonctionnement d'un ordinateur/Le bus mémoire|Le bus mémoire]] ===La micro-architecture d'une mémoire adressable=== * [[Fonctionnement d'un ordinateur/Les cellules mémoires|Les cellules mémoires]] * [[Fonctionnement d'un ordinateur/Le plan mémoire|Le plan mémoire]] * [[Fonctionnement d'un ordinateur/Contrôleur mémoire interne|Le contrôleur mémoire interne]] * [[Fonctionnement d'un ordinateur/Mémoires évoluées|Les mémoires évoluées]] ===Les mémoires primaires=== * [[Fonctionnement d'un ordinateur/Les mémoires ROM|Les mémoires ROM : Mask ROM, PROM, EPROM, EEPROM, Flash]] * [[Fonctionnement d'un ordinateur/Les mémoires SRAM synchrones|Les mémoires SRAM synchrones]] * [[Fonctionnement d'un ordinateur/Les mémoires RAM dynamiques (DRAM)|Les mémoires RAM dynamiques (DRAM)]] * [[Fonctionnement d'un ordinateur/Contrôleur mémoire externe|Le contrôleur mémoire externe]] ===Les mémoires exotiques=== * [[Fonctionnement d'un ordinateur/Les mémoires associatives|Les mémoires associatives]] * [[Fonctionnement d'un ordinateur/Les mémoires FIFO et LIFO|Les mémoires FIFO et LIFO]] ==Le processeur== ===L'architecture externe=== * [[Fonctionnement d'un ordinateur/Langage machine et assembleur|Langage machine et assembleur]] * [[Fonctionnement d'un ordinateur/Les registres du processeur|Les registres du processeur]] * [[Fonctionnement d'un ordinateur/Le modèle mémoire : alignement et boutisme|Le modèle mémoire : alignement et boutisme]] * [[Fonctionnement d'un ordinateur/Les modes d'adressage|Les modes d'adressage]] * [[Fonctionnement d'un ordinateur/L'encodage des instructions|L'encodage des instructions]] * [[Fonctionnement d'un ordinateur/Les jeux d'instructions|Les jeux d'instructions]] * [[Fonctionnement d'un ordinateur/La pile d'appel et les fonctions|La pile d'appel et les fonctions]] * [[Fonctionnement d'un ordinateur/Les interruptions et exceptions|Les interruptions et exceptions]] ===La micro-architecture=== * [[Fonctionnement d'un ordinateur/Les composants d'un processeur|Les composants d'un processeur]] * [[Fonctionnement d'un ordinateur/Le chemin de données|Le chemin de données]] * [[Fonctionnement d'un ordinateur/L'unité de chargement et le program counter|L'unité de chargement et le program counter]] * [[Fonctionnement d'un ordinateur/L'unité de contrôle|L'unité de contrôle]] * [[Fonctionnement d'un ordinateur/L'implémentation matérielle des branchements|L'implémentation matérielle des branchements]] ===Les jeux d'instruction anciens, avant les registres généraux ou exotiques=== * [[Fonctionnement d'un ordinateur/Les architectures à accumulateur|Les architectures à accumulateur]] * [[Fonctionnement d'un ordinateur/Les architectures à pile et mémoire-mémoire|Les architectures à pile et mémoire-mémoire]] * [[Fonctionnement d'un ordinateur/Les processeurs 8 bits et moins|Les processeurs 8 bits et moins]] ===L'espace d'adressage du processeur et la multiprogrammation=== * [[Fonctionnement d'un ordinateur/L'espace d'adressage du processeur|L'espace d'adressage du processeur]] * [[Fonctionnement d'un ordinateur/L'abstraction mémoire et la mémoire virtuelle|L'abstraction mémoire et la mémoire virtuelle]] ==Les entrées-sorties et périphériques== * [[Fonctionnement d'un ordinateur/Les méthodes de synchronisation entre processeur et périphériques|Les méthodes de synchronisation entre processeur et périphériques]] * [[Fonctionnement d'un ordinateur/L'adressage des périphériques|L'adressage des périphériques]] * [[Fonctionnement d'un ordinateur/Les périphériques et les cartes d'extension|Les périphériques et les cartes d'extension]] ==Les mémoires de stockage== * [[Fonctionnement d'un ordinateur/Les mémoires de masse : généralités|Les mémoires de masse : généralités]] * [[Fonctionnement d'un ordinateur/Les disques durs|Les disques durs]] * [[Fonctionnement d'un ordinateur/Les solid-state drives|Les solid-state drives]] * [[Fonctionnement d'un ordinateur/Les disques optiques|Les disques optiques]] * [[Fonctionnement d'un ordinateur/Compléments sur les mémoires de masse|Compléments sur les mémoires de masse]] ==La ou les mémoires caches== * [[Fonctionnement d'un ordinateur/Les mémoires cache|Les mémoires cache]] * [[Fonctionnement d'un ordinateur/Le préchargement|Le préchargement]] * [[Fonctionnement d'un ordinateur/Le Translation Lookaside Buffer|Le ''Translation Lookaside Buffer'']] ==Le parallélisme d’instructions== * [[Fonctionnement d'un ordinateur/Le pipeline|Le pipeline]] ===Les branchements et le ''front-end''=== * [[Fonctionnement d'un ordinateur/La prédiction de branchement|La prédiction de branchement]] * [[Fonctionnement d'un ordinateur/Les optimisations du chargement des instructions|Les optimisations du chargement des instructions]] ===Les pipelines multicycles simples=== * [[Fonctionnement d'un ordinateur/Les pipelines multicycles|Les pipelines multicycles]] * [[Fonctionnement d'un ordinateur/L'émission dans l'ordre des instructions|L'émission dans l'ordre des instructions]] * [[Fonctionnement d'un ordinateur/Le contournement (data forwarding)|Le contournement (data forwarding)]] * [[Fonctionnement d'un ordinateur/Les premiers processeurs Intel|Les premiers processeurs Intel]] ===L’exécution dans le désordre=== * [[Fonctionnement d'un ordinateur/L'exécution dans le désordre|L'exécution dans le désordre]] * [[Fonctionnement d'un ordinateur/Le renommage de registres|Le renommage de registres]] * [[Fonctionnement d'un ordinateur/Le scoreboarding et l'algorithme de Tomasulo|Annexe : Le scoreboarding et l'algorithme de Tomasulo]] ===Les optimisations des accès mémoire=== * [[Fonctionnement d'un ordinateur/La désambiguïsation mémoire|La désambiguïsation mémoire]] * [[Fonctionnement d'un ordinateur/Le parallélisme mémoire|Le parallélisme mémoire]] ===L'émission multiple=== * [[Fonctionnement d'un ordinateur/Les processeurs superscalaires|Les processeurs superscalaires]] * [[Fonctionnement d'un ordinateur/Exemples de microarchitectures CPU : le cas du x86|Exemples de CPU superscalaires: le cas du x86]] * [[Fonctionnement d'un ordinateur/Les processeurs VLIW et EPIC|Les processeurs VLIW et EPIC]] * [[Fonctionnement d'un ordinateur/Les architectures dataflow|Les architectures dataflow]] ==Les architectures parallèles== * [[Fonctionnement d'un ordinateur/Les architectures parallèles|Les architectures parallèles]] * [[Fonctionnement d'un ordinateur/Architectures multiprocesseurs et multicœurs|Les architectures multiprocesseurs et multicœurs]] * [[Fonctionnement d'un ordinateur/Architectures multithreadées et Hyperthreading|Les architectures multithreadées et Hyperthreading]] * [[Fonctionnement d'un ordinateur/Les architectures à parallélisme de données|Les architectures à parallélisme de données]] * [[Fonctionnement d'un ordinateur/La cohérence des caches|La cohérence des caches]] * [[Fonctionnement d'un ordinateur/Les sections critiques et le modèle mémoire|Les sections critiques et le modèle mémoire]] ==Annexes== ===Les nombres flottants : FPUs et coprocesseurs=== * [[Fonctionnement d'un ordinateur/Un exemple de jeu d'instruction : l'extension x87|Un exemple de jeu d'instruction : l'extension x87]] * [[Fonctionnement d'un ordinateur/Les coprocesseurs : FPU et IO|Les coprocesseurs : FPU et IO]] ===Les jeux d’instruction spécialisés=== * [[Fonctionnement d'un ordinateur/L'accélération matérielle de la virtualisation|L'accélération matérielle de la virtualisation]] * [[Fonctionnement d'un ordinateur/Les ISA optimisés pour la compilation/interprétation|Les ISA optimisés pour la compilation/interprétation]] * [[Fonctionnement d'un ordinateur/Les processeurs de traitement du signal|Les processeurs de traitement du signal]] * [[Fonctionnement d'un ordinateur/Les architectures actionnées par déplacement|Les architectures actionnées par déplacement]] * [[Fonctionnement d'un ordinateur/Les architectures systoliques|Les architectures systoliques]] * [[Fonctionnement d'un ordinateur/Les architectures neuromorphiques|Les réseaux de neurones matériels]] ===Les autres annexes=== * [[Fonctionnement d'un ordinateur/Le matériel réseau|Le matériel réseau]] * [[Fonctionnement d'un ordinateur/La tolérance aux pannes|La tolérance aux pannes]] * [[Fonctionnement d'un ordinateur/Les ordinateurs de première génération : tubes à vide et mémoires|Les ordinateurs de première génération : tubes à vide et mémoires]] * [[Fonctionnement d'un ordinateur/Les ordinateurs à encodages non-binaires|Les ordinateurs à encodages non-binaires]] * [[Fonctionnement d'un ordinateur/Les circuits réversibles|Les circuits réversibles]] * [[Fonctionnement d'un ordinateur/Les circuits de conversion analogique-numérique|Les circuits de conversion analogique-numérique]] {{autocat}} 4v9ycnttjk1cy386qhqvotyoh23dfnl 768124 768069 2026-06-19T01:05:49Z Mewtow 31375 /* Les circuits séquentiels */ 768124 wikitext text/x-wiki __NOTOC__ * [[Fonctionnement d'un ordinateur/Introduction|Introduction]] ==Le codage des informations== * [[Fonctionnement d'un ordinateur/L'encodage des données|L'encodage des données]] * [[Fonctionnement d'un ordinateur/Le codage des nombres|Le codage des nombres]] * [[Fonctionnement d'un ordinateur/Les codes de détection/correction d'erreur|Les codes de détection/correction d'erreur]] ==Les circuits électroniques== * [[Fonctionnement d'un ordinateur/Les portes logiques|Les portes logiques]] ===Les circuits combinatoires=== * [[Fonctionnement d'un ordinateur/Les circuits combinatoires|Les circuits combinatoires]] * [[Fonctionnement d'un ordinateur/Les circuits de masquage|Les circuits de masquage]] * [[Fonctionnement d'un ordinateur/Les circuits de sélection|Les circuits de sélection]] * [[Fonctionnement d'un ordinateur/Les circuits incrémenteurs/décrémenteurs|Les circuits incrémenteurs/décrémenteurs]] ===Les circuits séquentiels=== * [[Fonctionnement d'un ordinateur/Les bascules : des mémoires de 1 bit|Les bascules : des mémoires de 1 bit]] * [[Fonctionnement d'un ordinateur/Les circuits synchrones et asynchrones|Les circuits synchrones et asynchrones]] * [[Fonctionnement d'un ordinateur/Les registres et mémoires adressables|Les registres et mémoires adressables]] * [[Fonctionnement d'un ordinateur/Les compteurs et timers|Les compteurs et timers]] * [[Fonctionnement d'un ordinateur/Les compteurs à rétroaction|Les compteurs à rétroaction]] ===Les circuits de calcul et de comparaison=== * [[Fonctionnement d'un ordinateur/Les circuits de décalage et de rotation|Les circuits de décalage et de rotation]] * [[Fonctionnement d'un ordinateur/Les circuits pour l'addition et la soustraction|Les circuits pour l'addition et la soustraction]] * [[Fonctionnement d'un ordinateur/Les circuits de comparaison|Les circuits de comparaison]] * [[Fonctionnement d'un ordinateur/Les unités arithmétiques et logiques entières (simples)|Les unités arithmétiques et logiques entières (simples)]] * [[Fonctionnement d'un ordinateur/Les circuits pour l'addition multiopérande|Les circuits pour l'addition multiopérande]] * [[Fonctionnement d'un ordinateur/Les circuits pour la multiplication et la division|Les circuits pour la multiplication et la division]] * [[Fonctionnement d'un ordinateur/Les circuits de calcul logique et bit à bit|Les circuits de calcul logique et bit à bit]] * [[Fonctionnement d'un ordinateur/Les circuits de calcul flottant|Les circuits de calcul flottant]] * [[Fonctionnement d'un ordinateur/Les circuits de calcul trigonométriques|Les circuits de calcul trigonométriques]] ===Les circuits intégrés à semi-conducteurs=== * [[Fonctionnement d'un ordinateur/Les transistors et portes logiques|Les transistors et portes logiques]] * [[Fonctionnement d'un ordinateur/Les circuits intégrés|Les circuits intégrés]] * [[Fonctionnement d'un ordinateur/L'interface électrique entre circuits intégrés et bus|L'interface électrique entre circuits intégrés et bus]] ==L'architecture d'un ordinateur== * [[Fonctionnement d'un ordinateur/L'architecture de base d'un ordinateur|L'architecture de base d'un ordinateur]] * [[Fonctionnement d'un ordinateur/La hiérarchie mémoire|La hiérarchie mémoire]] * [[Fonctionnement d'un ordinateur/La performance d'un ordinateur|La performance d'un ordinateur]] * [[Fonctionnement d'un ordinateur/La loi de Moore et les tendances technologiques|La loi de Moore et les tendances technologiques]] * [[Fonctionnement d'un ordinateur/Les techniques de réduction de la consommation électrique d'un processeur|Les techniques de réduction de la consommation électrique d'un processeur]] ==Les bus électroniques et la carte mère== * [[Fonctionnement d'un ordinateur/La carte mère, chipset et BIOS|La carte mère, chipset et BIOS]] * [[Fonctionnement d'un ordinateur/Les bus et liaisons point à point (généralités)|Les bus et liaisons point à point (généralités)]] * [[Fonctionnement d'un ordinateur/Les encodages spécifiques aux bus|Les encodages spécifiques aux bus]] * [[Fonctionnement d'un ordinateur/Les liaisons point à point|Les liaisons point à point]] * [[Fonctionnement d'un ordinateur/Les bus électroniques|Les bus électroniques]] * [[Fonctionnement d'un ordinateur/Quelques exemples de bus et de liaisons point à point|Quelques exemples de bus et de liaisons point à point]] ==Les mémoires RAM/ROM== * [[Fonctionnement d'un ordinateur/Les différents types de mémoires|Les différents types de mémoires]] * [[Fonctionnement d'un ordinateur/L'interface d'une mémoire électronique|L'interface d'une mémoire électronique]] * [[Fonctionnement d'un ordinateur/Le bus mémoire|Le bus mémoire]] ===La micro-architecture d'une mémoire adressable=== * [[Fonctionnement d'un ordinateur/Les cellules mémoires|Les cellules mémoires]] * [[Fonctionnement d'un ordinateur/Le plan mémoire|Le plan mémoire]] * [[Fonctionnement d'un ordinateur/Contrôleur mémoire interne|Le contrôleur mémoire interne]] * [[Fonctionnement d'un ordinateur/Mémoires évoluées|Les mémoires évoluées]] ===Les mémoires primaires=== * [[Fonctionnement d'un ordinateur/Les mémoires ROM|Les mémoires ROM : Mask ROM, PROM, EPROM, EEPROM, Flash]] * [[Fonctionnement d'un ordinateur/Les mémoires SRAM synchrones|Les mémoires SRAM synchrones]] * [[Fonctionnement d'un ordinateur/Les mémoires RAM dynamiques (DRAM)|Les mémoires RAM dynamiques (DRAM)]] * [[Fonctionnement d'un ordinateur/Contrôleur mémoire externe|Le contrôleur mémoire externe]] ===Les mémoires exotiques=== * [[Fonctionnement d'un ordinateur/Les mémoires associatives|Les mémoires associatives]] * [[Fonctionnement d'un ordinateur/Les mémoires FIFO et LIFO|Les mémoires FIFO et LIFO]] ==Le processeur== ===L'architecture externe=== * [[Fonctionnement d'un ordinateur/Langage machine et assembleur|Langage machine et assembleur]] * [[Fonctionnement d'un ordinateur/Les registres du processeur|Les registres du processeur]] * [[Fonctionnement d'un ordinateur/Le modèle mémoire : alignement et boutisme|Le modèle mémoire : alignement et boutisme]] * [[Fonctionnement d'un ordinateur/Les modes d'adressage|Les modes d'adressage]] * [[Fonctionnement d'un ordinateur/L'encodage des instructions|L'encodage des instructions]] * [[Fonctionnement d'un ordinateur/Les jeux d'instructions|Les jeux d'instructions]] * [[Fonctionnement d'un ordinateur/La pile d'appel et les fonctions|La pile d'appel et les fonctions]] * [[Fonctionnement d'un ordinateur/Les interruptions et exceptions|Les interruptions et exceptions]] ===La micro-architecture=== * [[Fonctionnement d'un ordinateur/Les composants d'un processeur|Les composants d'un processeur]] * [[Fonctionnement d'un ordinateur/Le chemin de données|Le chemin de données]] * [[Fonctionnement d'un ordinateur/L'unité de chargement et le program counter|L'unité de chargement et le program counter]] * [[Fonctionnement d'un ordinateur/L'unité de contrôle|L'unité de contrôle]] * [[Fonctionnement d'un ordinateur/L'implémentation matérielle des branchements|L'implémentation matérielle des branchements]] ===Les jeux d'instruction anciens, avant les registres généraux ou exotiques=== * [[Fonctionnement d'un ordinateur/Les architectures à accumulateur|Les architectures à accumulateur]] * [[Fonctionnement d'un ordinateur/Les architectures à pile et mémoire-mémoire|Les architectures à pile et mémoire-mémoire]] * [[Fonctionnement d'un ordinateur/Les processeurs 8 bits et moins|Les processeurs 8 bits et moins]] ===L'espace d'adressage du processeur et la multiprogrammation=== * [[Fonctionnement d'un ordinateur/L'espace d'adressage du processeur|L'espace d'adressage du processeur]] * [[Fonctionnement d'un ordinateur/L'abstraction mémoire et la mémoire virtuelle|L'abstraction mémoire et la mémoire virtuelle]] ==Les entrées-sorties et périphériques== * [[Fonctionnement d'un ordinateur/Les méthodes de synchronisation entre processeur et périphériques|Les méthodes de synchronisation entre processeur et périphériques]] * [[Fonctionnement d'un ordinateur/L'adressage des périphériques|L'adressage des périphériques]] * [[Fonctionnement d'un ordinateur/Les périphériques et les cartes d'extension|Les périphériques et les cartes d'extension]] ==Les mémoires de stockage== * [[Fonctionnement d'un ordinateur/Les mémoires de masse : généralités|Les mémoires de masse : généralités]] * [[Fonctionnement d'un ordinateur/Les disques durs|Les disques durs]] * [[Fonctionnement d'un ordinateur/Les solid-state drives|Les solid-state drives]] * [[Fonctionnement d'un ordinateur/Les disques optiques|Les disques optiques]] * [[Fonctionnement d'un ordinateur/Compléments sur les mémoires de masse|Compléments sur les mémoires de masse]] ==La ou les mémoires caches== * [[Fonctionnement d'un ordinateur/Les mémoires cache|Les mémoires cache]] * [[Fonctionnement d'un ordinateur/Le préchargement|Le préchargement]] * [[Fonctionnement d'un ordinateur/Le Translation Lookaside Buffer|Le ''Translation Lookaside Buffer'']] ==Le parallélisme d’instructions== * [[Fonctionnement d'un ordinateur/Le pipeline|Le pipeline]] ===Les branchements et le ''front-end''=== * [[Fonctionnement d'un ordinateur/La prédiction de branchement|La prédiction de branchement]] * [[Fonctionnement d'un ordinateur/Les optimisations du chargement des instructions|Les optimisations du chargement des instructions]] ===Les pipelines multicycles simples=== * [[Fonctionnement d'un ordinateur/Les pipelines multicycles|Les pipelines multicycles]] * [[Fonctionnement d'un ordinateur/L'émission dans l'ordre des instructions|L'émission dans l'ordre des instructions]] * [[Fonctionnement d'un ordinateur/Le contournement (data forwarding)|Le contournement (data forwarding)]] * [[Fonctionnement d'un ordinateur/Les premiers processeurs Intel|Les premiers processeurs Intel]] ===L’exécution dans le désordre=== * [[Fonctionnement d'un ordinateur/L'exécution dans le désordre|L'exécution dans le désordre]] * [[Fonctionnement d'un ordinateur/Le renommage de registres|Le renommage de registres]] * [[Fonctionnement d'un ordinateur/Le scoreboarding et l'algorithme de Tomasulo|Annexe : Le scoreboarding et l'algorithme de Tomasulo]] ===Les optimisations des accès mémoire=== * [[Fonctionnement d'un ordinateur/La désambiguïsation mémoire|La désambiguïsation mémoire]] * [[Fonctionnement d'un ordinateur/Le parallélisme mémoire|Le parallélisme mémoire]] ===L'émission multiple=== * [[Fonctionnement d'un ordinateur/Les processeurs superscalaires|Les processeurs superscalaires]] * [[Fonctionnement d'un ordinateur/Exemples de microarchitectures CPU : le cas du x86|Exemples de CPU superscalaires: le cas du x86]] * [[Fonctionnement d'un ordinateur/Les processeurs VLIW et EPIC|Les processeurs VLIW et EPIC]] * [[Fonctionnement d'un ordinateur/Les architectures dataflow|Les architectures dataflow]] ==Les architectures parallèles== * [[Fonctionnement d'un ordinateur/Les architectures parallèles|Les architectures parallèles]] * [[Fonctionnement d'un ordinateur/Architectures multiprocesseurs et multicœurs|Les architectures multiprocesseurs et multicœurs]] * [[Fonctionnement d'un ordinateur/Architectures multithreadées et Hyperthreading|Les architectures multithreadées et Hyperthreading]] * [[Fonctionnement d'un ordinateur/Les architectures à parallélisme de données|Les architectures à parallélisme de données]] * [[Fonctionnement d'un ordinateur/La cohérence des caches|La cohérence des caches]] * [[Fonctionnement d'un ordinateur/Les sections critiques et le modèle mémoire|Les sections critiques et le modèle mémoire]] ==Annexes== ===Les nombres flottants : FPUs et coprocesseurs=== * [[Fonctionnement d'un ordinateur/Un exemple de jeu d'instruction : l'extension x87|Un exemple de jeu d'instruction : l'extension x87]] * [[Fonctionnement d'un ordinateur/Les coprocesseurs : FPU et IO|Les coprocesseurs : FPU et IO]] ===Les jeux d’instruction spécialisés=== * [[Fonctionnement d'un ordinateur/L'accélération matérielle de la virtualisation|L'accélération matérielle de la virtualisation]] * [[Fonctionnement d'un ordinateur/Les ISA optimisés pour la compilation/interprétation|Les ISA optimisés pour la compilation/interprétation]] * [[Fonctionnement d'un ordinateur/Les processeurs de traitement du signal|Les processeurs de traitement du signal]] * [[Fonctionnement d'un ordinateur/Les architectures actionnées par déplacement|Les architectures actionnées par déplacement]] * [[Fonctionnement d'un ordinateur/Les architectures systoliques|Les architectures systoliques]] * [[Fonctionnement d'un ordinateur/Les architectures neuromorphiques|Les réseaux de neurones matériels]] ===Les autres annexes=== * [[Fonctionnement d'un ordinateur/Le matériel réseau|Le matériel réseau]] * [[Fonctionnement d'un ordinateur/La tolérance aux pannes|La tolérance aux pannes]] * [[Fonctionnement d'un ordinateur/Les ordinateurs de première génération : tubes à vide et mémoires|Les ordinateurs de première génération : tubes à vide et mémoires]] * [[Fonctionnement d'un ordinateur/Les ordinateurs à encodages non-binaires|Les ordinateurs à encodages non-binaires]] * [[Fonctionnement d'un ordinateur/Les circuits réversibles|Les circuits réversibles]] * [[Fonctionnement d'un ordinateur/Les circuits de conversion analogique-numérique|Les circuits de conversion analogique-numérique]] {{autocat}} n3r8kgc2kqpm9uziiwtqgz7nhoa17to 768131 768124 2026-06-19T01:07:01Z Mewtow 31375 /* Les circuits séquentiels */ 768131 wikitext text/x-wiki __NOTOC__ * [[Fonctionnement d'un ordinateur/Introduction|Introduction]] ==Le codage des informations== * [[Fonctionnement d'un ordinateur/L'encodage des données|L'encodage des données]] * [[Fonctionnement d'un ordinateur/Le codage des nombres|Le codage des nombres]] * [[Fonctionnement d'un ordinateur/Les codes de détection/correction d'erreur|Les codes de détection/correction d'erreur]] ==Les circuits électroniques== * [[Fonctionnement d'un ordinateur/Les portes logiques|Les portes logiques]] ===Les circuits combinatoires=== * [[Fonctionnement d'un ordinateur/Les circuits combinatoires|Les circuits combinatoires]] * [[Fonctionnement d'un ordinateur/Les circuits de masquage|Les circuits de masquage]] * [[Fonctionnement d'un ordinateur/Les circuits de sélection|Les circuits de sélection]] * [[Fonctionnement d'un ordinateur/Les circuits incrémenteurs/décrémenteurs|Les circuits incrémenteurs/décrémenteurs]] ===Les circuits séquentiels=== * [[Fonctionnement d'un ordinateur/Les bascules : des mémoires de 1 bit|Les bascules : des mémoires de 1 bit]] * [[Fonctionnement d'un ordinateur/Les circuits synchrones et asynchrones|Les circuits synchrones et asynchrones]] * [[Fonctionnement d'un ordinateur/Les registres et mémoires adressables|Les registres et mémoires adressables]] * [[Fonctionnement d'un ordinateur/Les compteurs et timers|Les compteurs et timers]] * [[Fonctionnement d'un ordinateur/Les registres à décalage à rétroaction linéaire|Les registres à décalage à rétroaction linéaire]] ===Les circuits de calcul et de comparaison=== * [[Fonctionnement d'un ordinateur/Les circuits de décalage et de rotation|Les circuits de décalage et de rotation]] * [[Fonctionnement d'un ordinateur/Les circuits pour l'addition et la soustraction|Les circuits pour l'addition et la soustraction]] * [[Fonctionnement d'un ordinateur/Les circuits de comparaison|Les circuits de comparaison]] * [[Fonctionnement d'un ordinateur/Les unités arithmétiques et logiques entières (simples)|Les unités arithmétiques et logiques entières (simples)]] * [[Fonctionnement d'un ordinateur/Les circuits pour l'addition multiopérande|Les circuits pour l'addition multiopérande]] * [[Fonctionnement d'un ordinateur/Les circuits pour la multiplication et la division|Les circuits pour la multiplication et la division]] * [[Fonctionnement d'un ordinateur/Les circuits de calcul logique et bit à bit|Les circuits de calcul logique et bit à bit]] * [[Fonctionnement d'un ordinateur/Les circuits de calcul flottant|Les circuits de calcul flottant]] * [[Fonctionnement d'un ordinateur/Les circuits de calcul trigonométriques|Les circuits de calcul trigonométriques]] ===Les circuits intégrés à semi-conducteurs=== * [[Fonctionnement d'un ordinateur/Les transistors et portes logiques|Les transistors et portes logiques]] * [[Fonctionnement d'un ordinateur/Les circuits intégrés|Les circuits intégrés]] * [[Fonctionnement d'un ordinateur/L'interface électrique entre circuits intégrés et bus|L'interface électrique entre circuits intégrés et bus]] ==L'architecture d'un ordinateur== * [[Fonctionnement d'un ordinateur/L'architecture de base d'un ordinateur|L'architecture de base d'un ordinateur]] * [[Fonctionnement d'un ordinateur/La hiérarchie mémoire|La hiérarchie mémoire]] * [[Fonctionnement d'un ordinateur/La performance d'un ordinateur|La performance d'un ordinateur]] * [[Fonctionnement d'un ordinateur/La loi de Moore et les tendances technologiques|La loi de Moore et les tendances technologiques]] * [[Fonctionnement d'un ordinateur/Les techniques de réduction de la consommation électrique d'un processeur|Les techniques de réduction de la consommation électrique d'un processeur]] ==Les bus électroniques et la carte mère== * [[Fonctionnement d'un ordinateur/La carte mère, chipset et BIOS|La carte mère, chipset et BIOS]] * [[Fonctionnement d'un ordinateur/Les bus et liaisons point à point (généralités)|Les bus et liaisons point à point (généralités)]] * [[Fonctionnement d'un ordinateur/Les encodages spécifiques aux bus|Les encodages spécifiques aux bus]] * [[Fonctionnement d'un ordinateur/Les liaisons point à point|Les liaisons point à point]] * [[Fonctionnement d'un ordinateur/Les bus électroniques|Les bus électroniques]] * [[Fonctionnement d'un ordinateur/Quelques exemples de bus et de liaisons point à point|Quelques exemples de bus et de liaisons point à point]] ==Les mémoires RAM/ROM== * [[Fonctionnement d'un ordinateur/Les différents types de mémoires|Les différents types de mémoires]] * [[Fonctionnement d'un ordinateur/L'interface d'une mémoire électronique|L'interface d'une mémoire électronique]] * [[Fonctionnement d'un ordinateur/Le bus mémoire|Le bus mémoire]] ===La micro-architecture d'une mémoire adressable=== * [[Fonctionnement d'un ordinateur/Les cellules mémoires|Les cellules mémoires]] * [[Fonctionnement d'un ordinateur/Le plan mémoire|Le plan mémoire]] * [[Fonctionnement d'un ordinateur/Contrôleur mémoire interne|Le contrôleur mémoire interne]] * [[Fonctionnement d'un ordinateur/Mémoires évoluées|Les mémoires évoluées]] ===Les mémoires primaires=== * [[Fonctionnement d'un ordinateur/Les mémoires ROM|Les mémoires ROM : Mask ROM, PROM, EPROM, EEPROM, Flash]] * [[Fonctionnement d'un ordinateur/Les mémoires SRAM synchrones|Les mémoires SRAM synchrones]] * [[Fonctionnement d'un ordinateur/Les mémoires RAM dynamiques (DRAM)|Les mémoires RAM dynamiques (DRAM)]] * [[Fonctionnement d'un ordinateur/Contrôleur mémoire externe|Le contrôleur mémoire externe]] ===Les mémoires exotiques=== * [[Fonctionnement d'un ordinateur/Les mémoires associatives|Les mémoires associatives]] * [[Fonctionnement d'un ordinateur/Les mémoires FIFO et LIFO|Les mémoires FIFO et LIFO]] ==Le processeur== ===L'architecture externe=== * [[Fonctionnement d'un ordinateur/Langage machine et assembleur|Langage machine et assembleur]] * [[Fonctionnement d'un ordinateur/Les registres du processeur|Les registres du processeur]] * [[Fonctionnement d'un ordinateur/Le modèle mémoire : alignement et boutisme|Le modèle mémoire : alignement et boutisme]] * [[Fonctionnement d'un ordinateur/Les modes d'adressage|Les modes d'adressage]] * [[Fonctionnement d'un ordinateur/L'encodage des instructions|L'encodage des instructions]] * [[Fonctionnement d'un ordinateur/Les jeux d'instructions|Les jeux d'instructions]] * [[Fonctionnement d'un ordinateur/La pile d'appel et les fonctions|La pile d'appel et les fonctions]] * [[Fonctionnement d'un ordinateur/Les interruptions et exceptions|Les interruptions et exceptions]] ===La micro-architecture=== * [[Fonctionnement d'un ordinateur/Les composants d'un processeur|Les composants d'un processeur]] * [[Fonctionnement d'un ordinateur/Le chemin de données|Le chemin de données]] * [[Fonctionnement d'un ordinateur/L'unité de chargement et le program counter|L'unité de chargement et le program counter]] * [[Fonctionnement d'un ordinateur/L'unité de contrôle|L'unité de contrôle]] * [[Fonctionnement d'un ordinateur/L'implémentation matérielle des branchements|L'implémentation matérielle des branchements]] ===Les jeux d'instruction anciens, avant les registres généraux ou exotiques=== * [[Fonctionnement d'un ordinateur/Les architectures à accumulateur|Les architectures à accumulateur]] * [[Fonctionnement d'un ordinateur/Les architectures à pile et mémoire-mémoire|Les architectures à pile et mémoire-mémoire]] * [[Fonctionnement d'un ordinateur/Les processeurs 8 bits et moins|Les processeurs 8 bits et moins]] ===L'espace d'adressage du processeur et la multiprogrammation=== * [[Fonctionnement d'un ordinateur/L'espace d'adressage du processeur|L'espace d'adressage du processeur]] * [[Fonctionnement d'un ordinateur/L'abstraction mémoire et la mémoire virtuelle|L'abstraction mémoire et la mémoire virtuelle]] ==Les entrées-sorties et périphériques== * [[Fonctionnement d'un ordinateur/Les méthodes de synchronisation entre processeur et périphériques|Les méthodes de synchronisation entre processeur et périphériques]] * [[Fonctionnement d'un ordinateur/L'adressage des périphériques|L'adressage des périphériques]] * [[Fonctionnement d'un ordinateur/Les périphériques et les cartes d'extension|Les périphériques et les cartes d'extension]] ==Les mémoires de stockage== * [[Fonctionnement d'un ordinateur/Les mémoires de masse : généralités|Les mémoires de masse : généralités]] * [[Fonctionnement d'un ordinateur/Les disques durs|Les disques durs]] * [[Fonctionnement d'un ordinateur/Les solid-state drives|Les solid-state drives]] * [[Fonctionnement d'un ordinateur/Les disques optiques|Les disques optiques]] * [[Fonctionnement d'un ordinateur/Compléments sur les mémoires de masse|Compléments sur les mémoires de masse]] ==La ou les mémoires caches== * [[Fonctionnement d'un ordinateur/Les mémoires cache|Les mémoires cache]] * [[Fonctionnement d'un ordinateur/Le préchargement|Le préchargement]] * [[Fonctionnement d'un ordinateur/Le Translation Lookaside Buffer|Le ''Translation Lookaside Buffer'']] ==Le parallélisme d’instructions== * [[Fonctionnement d'un ordinateur/Le pipeline|Le pipeline]] ===Les branchements et le ''front-end''=== * [[Fonctionnement d'un ordinateur/La prédiction de branchement|La prédiction de branchement]] * [[Fonctionnement d'un ordinateur/Les optimisations du chargement des instructions|Les optimisations du chargement des instructions]] ===Les pipelines multicycles simples=== * [[Fonctionnement d'un ordinateur/Les pipelines multicycles|Les pipelines multicycles]] * [[Fonctionnement d'un ordinateur/L'émission dans l'ordre des instructions|L'émission dans l'ordre des instructions]] * [[Fonctionnement d'un ordinateur/Le contournement (data forwarding)|Le contournement (data forwarding)]] * [[Fonctionnement d'un ordinateur/Les premiers processeurs Intel|Les premiers processeurs Intel]] ===L’exécution dans le désordre=== * [[Fonctionnement d'un ordinateur/L'exécution dans le désordre|L'exécution dans le désordre]] * [[Fonctionnement d'un ordinateur/Le renommage de registres|Le renommage de registres]] * [[Fonctionnement d'un ordinateur/Le scoreboarding et l'algorithme de Tomasulo|Annexe : Le scoreboarding et l'algorithme de Tomasulo]] ===Les optimisations des accès mémoire=== * [[Fonctionnement d'un ordinateur/La désambiguïsation mémoire|La désambiguïsation mémoire]] * [[Fonctionnement d'un ordinateur/Le parallélisme mémoire|Le parallélisme mémoire]] ===L'émission multiple=== * [[Fonctionnement d'un ordinateur/Les processeurs superscalaires|Les processeurs superscalaires]] * [[Fonctionnement d'un ordinateur/Exemples de microarchitectures CPU : le cas du x86|Exemples de CPU superscalaires: le cas du x86]] * [[Fonctionnement d'un ordinateur/Les processeurs VLIW et EPIC|Les processeurs VLIW et EPIC]] * [[Fonctionnement d'un ordinateur/Les architectures dataflow|Les architectures dataflow]] ==Les architectures parallèles== * [[Fonctionnement d'un ordinateur/Les architectures parallèles|Les architectures parallèles]] * [[Fonctionnement d'un ordinateur/Architectures multiprocesseurs et multicœurs|Les architectures multiprocesseurs et multicœurs]] * [[Fonctionnement d'un ordinateur/Architectures multithreadées et Hyperthreading|Les architectures multithreadées et Hyperthreading]] * [[Fonctionnement d'un ordinateur/Les architectures à parallélisme de données|Les architectures à parallélisme de données]] * [[Fonctionnement d'un ordinateur/La cohérence des caches|La cohérence des caches]] * [[Fonctionnement d'un ordinateur/Les sections critiques et le modèle mémoire|Les sections critiques et le modèle mémoire]] ==Annexes== ===Les nombres flottants : FPUs et coprocesseurs=== * [[Fonctionnement d'un ordinateur/Un exemple de jeu d'instruction : l'extension x87|Un exemple de jeu d'instruction : l'extension x87]] * [[Fonctionnement d'un ordinateur/Les coprocesseurs : FPU et IO|Les coprocesseurs : FPU et IO]] ===Les jeux d’instruction spécialisés=== * [[Fonctionnement d'un ordinateur/L'accélération matérielle de la virtualisation|L'accélération matérielle de la virtualisation]] * [[Fonctionnement d'un ordinateur/Les ISA optimisés pour la compilation/interprétation|Les ISA optimisés pour la compilation/interprétation]] * [[Fonctionnement d'un ordinateur/Les processeurs de traitement du signal|Les processeurs de traitement du signal]] * [[Fonctionnement d'un ordinateur/Les architectures actionnées par déplacement|Les architectures actionnées par déplacement]] * [[Fonctionnement d'un ordinateur/Les architectures systoliques|Les architectures systoliques]] * [[Fonctionnement d'un ordinateur/Les architectures neuromorphiques|Les réseaux de neurones matériels]] ===Les autres annexes=== * [[Fonctionnement d'un ordinateur/Le matériel réseau|Le matériel réseau]] * [[Fonctionnement d'un ordinateur/La tolérance aux pannes|La tolérance aux pannes]] * [[Fonctionnement d'un ordinateur/Les ordinateurs de première génération : tubes à vide et mémoires|Les ordinateurs de première génération : tubes à vide et mémoires]] * [[Fonctionnement d'un ordinateur/Les ordinateurs à encodages non-binaires|Les ordinateurs à encodages non-binaires]] * [[Fonctionnement d'un ordinateur/Les circuits réversibles|Les circuits réversibles]] * [[Fonctionnement d'un ordinateur/Les circuits de conversion analogique-numérique|Les circuits de conversion analogique-numérique]] {{autocat}} jjdb2h701ly3wmyqsvcd3prx86vhew1 Fonctionnement d'un ordinateur/Les circuits de sélection 0 70056 768011 767885 2026-06-18T14:31:30Z Mewtow 31375 /* L'encodeur à priorité avec un circuit d'isolation du 1 de poids fort/faible */ 768011 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu comment fabriquer des circuits relativement généraux. Il est maintenant temps de voir quelques circuits relativement simples, très utilisés. Ces circuits simples sont utilisés pour construire des circuits plus complexes, comme des processeurs, des mémoires, et bien d'autres. Les prochains chapitres vont se concentrer exclusivement sur ces circuits simples, mais courants. Nous allons donner quelques exemples de circuits assez fréquents dans un ordinateur et voir comment construire ceux-ci avec des portes logiques. Dans ce chapitre, nous allons nous concentrer sur quelques circuits, que j'ai décidé de regrouper sous le nom de '''circuits de sélection'''. Les circuits que nous allons présenter sont utilisés dans les mémoires, ainsi que dans certains circuits de calcul. Il est important de bien mémoriser ces circuits, ainsi que la procédure pour les concevoir : nous en aurons besoin dans la suite du cours. Ils sont au nombre de quatre : le décodeur, l'encodeur, le multiplexeur et le démultiplexeur. ==Le décodeur== [[File:DECODER 3 vers 8.png|vignette|Décodeur à 3 entrées et 8 sorties.]] Le premier circuit que nous allons voir est le '''décodeur''', un composant qui contient un grand nombre d'entrées et de sorties, avec des sorties qui sont numérotées. Un décodeur possède une entrée sur laquelle on envoie un nombre codé <math>N</math> bits et <math>2^N</math> sorties de 1 bit. Par exemple, un décodeur avec une entrée de 2 bits aura 4 sorties, un décodeur avec une entrée de 3 bits aura 8 sorties, un décodeur avec une entrée de 8 bits aura 256 sorties, etc. Généralement, on précise le nombre de bits d'entrée et de sortie comme suit : on parle d'un décodeur X vers Y pour X bits d'entrée et Y de sortie. Ce qui fait qu'on peut parler de décodeur 3 vers 8 pour un décodeur à 3 bits d'entrée et 8 de sortie, de décodeur 4 vers 16, etc. Le fonctionnement d'un décodeur est très simple : il prend sur son entrée un nombre entier x codé en binaire, puis il positionne à 1 la sortie numérotée x et met à zéro toutes les autres sorties. Par exemple, si on envoie la valeur 6 sur ses entrées, il mettra la sortie numéro 6 à 1 et les autres à zéro. Pour résumer, un décodeur est un circuit : * avec une entrée de <math>N</math> bits ; * avec <math>2^N</math> sorties de 1 bit ; * où les sorties sont numérotées en partant de zéro ; * où on ne peut sélectionner qu'une seule sortie à la fois : une seule sortie devra être placée à 1, et toutes les autres à zéro ; * et où deux nombres d'entrée différents devront sélectionner des sorties différentes : la sortie de notre contrôleur qui sera mise à 1 sera différente pour deux nombres différents placés sur son entrée. Une autre manière d'expliquer leur fonctionnement est qu'il traduisent un nombre encodé en binaire vers la représentation ''one-hot''. Pour rappel, sur cette dernière, le nombre N est encodé en mettant le énième bit à 1, les autres sont à 0. Le bit de poids faible compte pour le zéro. Les décodeurs sont très utilisés, au point que faire la liste de leurs utilisations serait bien trop long. Par contre, on peut d'or et déjà prévenir que les décodeurs sont utilisés dans toutes les mémoires RAM et ROM, présentes dans tout ordinateur. La RAM de votre ordinateur contient un ou plusieurs décodeurs, idem pour la mémoire caché intégrée dans le processeur, etc. C'est donc un circuit absolument primordial à étudier, qui reviendra souvent dans ce cours. ===La table de vérité d'un décodeur=== Au vu de ce qui vient d'être dit, on peut facilement écrire la table de vérité d'un décodeur. Pour l'exemple, prenons un décodeur 2 vers 4, pour simplifier la table de vérité. Voici sa table de vérité complète, c’est-à-dire qui contient toutes les sorties regroupées : {|class="wikitable" |- ! E0 !! E1 !! !! S0 !! S1 !! S2 !! S3 |- | 0 || 0 || || 1 || 0 || 0 || 0 |- | 0 || 1 || || 0 || 1 || 0 || 0 |- | 1 || 0 || || 0 || 0 || 1 || 0 |- | 1 || 1 || || 0 || 0 || 0 || 1 |} Vous remarquerez que la table de vérité est assez spéciale. Les seuls bits à 1 sont sur la diagonale. Et cela ne vaut pas que dans l'exemple choisit, mais cela se généralise pour tous les décodeurs. Sur chaque ligne, il n'y a qu'un seul bit à 1, ce qui traduit le fait qu'une entrée ne met qu'une seule sortie est à 1 et met les autres à 0. Si on traduit la table de vérité sous la forme d'équations logiques et de circuit, on obtient ceci : [[File:Decoder Example.svg|centre|vignette|upright=2|Equations logiques et circuit d'un décodeur 2 vers 4.]] Il y a des choses intéressantes à remarquer sur les équations logiques. Pour rappel, l'équation logique d'une sortie est composée, dans le cas général, soit d'un minterm unique, soit d'un OU entre plusieurs minterms. Chaque minterm est l'équation d'un circuit qui compare l'entrée à un nombre bien précis et dépendant du minterm. Si on regarde bien, l'équation de chaque sortie correspond à un minterm et à rien d'autre, il n'y a pas de OU entre plusieurs minterms. Les minterms sont de plus différents pour chaque sortie et on ne trouve pas deux sorties avec le même minterm. Enfin, chaque minterm possible est présent : X bits d'entrée nous donnent 2^X entrées différentes possibles, donc 2^X minterms possibles. Et il se trouve que tous ces minterms possibles sont représentés dans un décodeur, ils ont tous leur sortie associée. C'est une autre manière de définir un décodeur : toutes ses sorties codent un minterm, deux sorties différentes ont des minterms différents et tous les minterms possibles sur n bits sont représentés. Ces informations vont nous être utiles pour la suite. En effet, grâce à elles, nous allons en déduire une méthode générale pour fabriquer un décodeur, peu importe son nombre de bits d'entrée et de sortie. Mais elles permettent aussi de montrer que l'on peut créer n'importe quel circuit combinatoire quelconque à partir d'un décodeur et de quelques portes logiques. Dans ce qui suit, on suppose que le circuit combinatoire en question a une entrée de n bits et une seule sortie de 1 bit. Pour rappel, ce genre de circuit se conçoit en utilisant une table de vérité qu'on traduit en équations logiques, puis en circuits. Le circuit obtenu est alors soit un simple minterm, soit un OU entre plusieurs minterms. Or, le décodeur contient tous les minterms possibles pour une entrée de n bits, avec un minterm par sortie. Il suffit donc de prendre une porte OU et de la connecter aux minterms/sorties adéquats. [[File:Conception d'un circuit combinatoire quelconque à partir d'un décodeur.jpg|centre|vignette|upright=2|Conception d'un circuit combinatoire quelconque à partir d'un décodeur.]] Fabriquer un circuit combinatoire avec un décodeur gaspille pas mal de portes logiques. En effet, le décodeur fournit tous les minterms possibles, alors que seule une minorité est réellement utilisée pour fabriquer le circuit combinatoire. Les minterms en trop correspondent à des paquets de portes NON et ET reliées entre elles, qui ne servent à rien. De plus, les minterms ne sont pas simplifiés. On ne peut pas utiliser les techniques vues dans les chapitres précédents pour simplifier les minterms et réduire le nombre de portes logiques utilisées. Le décodeur reste tel qu'il est, avec l'ensemble des minterms non-simplifiés. Mais la simplicité de conception du circuit reste un avantage dans certaines situations. Notamment, les circuits avec plusieurs bits de sortie sont faciles à fabriquer, notamment si les sorties partagent des minterms (si un minterm est présent dans l'équation de plusieurs sorties différentes, l'usage d'un décodeur permet de facilement factoriser celui-ci). Ceci étant dit, passons à la conception d'un décodeur avec des portes logiques. ===L'intérieur d'un décodeur=== On vient de voir que chaque sortie d'un décodeur correspond à son propre minterm, et que tous les minterms possibles sont représentés. Rappelons que chaque minterm est associé à un circuit qui compare l'entrée à une constante X, X dépendant du minterm. En combinant ces deux informations, on devine qu'un décodeur est simplement composé de comparateurs avec une constante que de minterms/sorties. Par exemple, si je prends un décodeur 7 vers 128, cela veut dire qu'on peut envoyer en entrée un nombre codé entre 0 et 127 et que chaque nombre aura son propre minterm associé : il y aura un minterm qui vérifie si l'entrée vaut 0, un autre vérifie si elle vaut 1, un autre qui vérifie si elle vaut 2, ... , un minterm qui vérifie si l'entrée vaut 126, et enfin un minterm qui vérifie si l'entrée vaut 127. Pour reformuler d'une manière bien plus simple, on peut voir les choses comme suit. Si l'entrée du décodeur vaut N, la sortie mise à 1 est la sortie N. Bref, déduire quand mettre à 1 la sortie N est facile : il suffit de comparer l'entrée avec N. Si l'adresse vaut N, on envoie un 1 sur la sortie, et on envoie un zéro sinon. Pour cela, j'ai donc besoin d'un comparateur pour chaque sortie, et le tour est joué. Précisons cependant que cette méthode gaspille beaucoup de circuits et qu'il y a une certaine redondance. En effet, les comparateurs ont souvent des portions de circuits qui sont identiques et ne diffèrent parfois que ce quelques portes logiques. En utilisant des comparateurs séparés, ces portions de circuits sont dupliquées, alors qu'il serait judicieux de partager. [[File:Internals of decoder.png|centre|vignette|upright=1.5|Exemple d'un décodeur à 8 sorties.]] Comme autre méthode, plus économe en circuits, on peut créer un décodeur en assemblant plusieurs décodeurs plus simples, nommés sous-décodeurs. Ces sous-décodeurs sont des décodeurs normaux, auxquels on a ajouté une entrée RAZ, qui permet de mettre à zéro toutes les sorties : si on met un 0 sur cette entrée, toutes les sorties passent à 0, alors que le décodeur fonctionne normalement sinon. Construire un décodeur demande suffisamment de sous-décodeurs pour combler toutes les sorties. Si on utilise des sous-décodeurs à n entrées, ceux-ci prendront en entrée les n bits de poids faible de l'entrée du décodeur que l'on souhaite construire (le décodeur final). Dans ces conditions, les n décodeurs auront une de leurs sorties à 1. Pour que le décodeur final se comporte comme il faut, il faut désactiver tous les sous-décodeurs, sauf un avec l'entrée RAZ. Pour commander les n bits RAZ des sous-décodeurs, il suffit d'utiliser un décodeur qui est commandé par les bits de poids fort du décodeur final. [[File:Décodeur 3 vers 8 conçu à partir de décodeurs 2 vers 4.jpg|centre|vignette|upright=1.5|Décodeur 3 vers 8 conçu à partir de décodeurs 2 vers 4.]] ==Le démultiplexeur== Les décodeurs ont des cousins : les multiplexeurs et les démultiplexeurs. Un démultiplexeur a plusieurs sorties et une seule entrée. Les sorties sont numérotées de 0 à la valeur maximale. Il permet de sélectionner une sortie et de recopier l'entrée dessus, les autres sorties sont mises à 0. Pour séléctionner la sortie, le démultiplexeur possède une entrée de commande, sur laquelle on envoie le numéro de la sortie de destination. Comme le nom l'indique, le démultiplexeur fait l'exact inverse du multiplexeur, que nous verrons plus bas. ===Le démultiplexeur à deux sorties=== Le démultiplexeur le plus simple est le démultiplexeur à deux sorties. Il possède une entrée de donnée, une entrée de commande et deux sorties, toutes de 1 bit. Suivant la valeur du bit sur l'entrée de commande, il recopie le bit d'entrée, soit sur la première sortie, soit sur la seconde. Les deux sorties sont numérotées respectivement 0 et 1. [[File:Demultiplexer.png|centre|vignette|upright=1.5|Démultiplexeur à 2 sorties.]] On peut le concevoir facilement en partant de sa table de vérité. {|class="wikitable" |- ! Entrée de commande ''Select'' ! Entrée de donnée ''Input'' ! ! Sortie 1 ! Sortie 0 |- | 0 || 0 || || 0 || 0 |- |- | 0 || 1 || || 0 || 1 |- |- | 1 || 0 || || 0 || 0 |- |- | 1 || 1 || || 1 || 0 |- |} Le circuit obtenu est le suivant : [[File:2to4demux.svg|centre|vignette|upright=2|Démultiplexeur à deux sorties.]] ===Les démultiplexeurs à plus de deux sorties=== Il est parfaitement possible de créer des démultiplexeurs en utilisant les méthodes du chapitre sur les circuits combinatoires, comme ma méthode des ''minterms'' ou les tableaux de Karnaugh. On obtient alors un démultiplexeur assez simple, composé de deux couches de portes logiques : une couche de portes NON et une couche de portes ET à plusieurs entrées. [[File:Demux.PNG|centre|vignette|upright=1.5|Démultiplexeur fabriqué avec une table de vérité.]] Mais cette méthode n'est pas pratique, car elle utilise beaucoup de portes logiques et que les portes logiques avec beaucoup d'entrées sont difficiles à fabriquer. Pour contourner ces problèmes, il est possible de créer des démultiplexeurs en assemblant des démultiplexeurs 1 vers 2. Évidemment, le même principe s'applique à des démultiplexeurs plus complexes : il suffit de rajouter des couches. [[File:Circuit d'un démultiplexeur à 4 sorties, conçu à partir de démultiplexeurs à 2 sorties.jpg|centre|vignette|upright=1.5|Circuit d'un démultiplexeur à 4 sorties, conçu à partir de démultiplexeurs à 2 sorties.]] Un démultiplexeur peut aussi se fabriquer en utilisant un décodeur et quelques portes ET. Pour comprendre pourquoi, regardons la table de vérité d'un démultiplexeur à quatre sorties. Si vous éliminez le cas où l'entrée de donnée ''Input'' vaut 0, et que vous tenez compte uniquement des entrées de commande, vous retombez sur la table de vérité d'un décodeur. Cela correspond aux cases en rouge. {|class="wikitable" |- ! Input !! E0 !! E1 !! !! S0 !! S1 !! S2 !! S3 |- | 0 || 0 || 0 || || 0 || 0 || 0 || 0 |- | 0 || 0 || 1 || || 0 || 0 || 0 || 0 |- | 0 || 1 || 0 || || 0 || 0 || 0 || 0 |- | 0 || 1 || 1 || || 0 || 0 || 0 || 0 |- | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 |- | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 |- | 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 |- | 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 1 || || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 |} En réalité, Le fonctionnement d'un démultiplexeur peut se résumer comme suit : soit l'entrée ''Input'' est à 1 et il fonctionne comme un décodeur dont l'entrée est l'entrée de commande, soit l'entrée ''Input'' vaut 0 et sa sortie est mise à 0. On devine donc qu'il faut combiner un décodeur avec le circuit de mise à zéro vu dans le chapitre précédent. On devine rapidement que l'entrée ''Input'' commande la mise à zéro de la sortie, ce qui donne le circuit suivant : [[File:Démultiplexeur conçu à partir d'un décodeur.jpg|centre|vignette|upright=1.5|Démultiplexeur conçu à partir d'un décodeur.]] ==Le multiplexeur== Les décodeurs ont des cousins : les multiplexeurs et les démultiplexeurs. Les multiplexeurs sont des composants qui possèdent un nombre variable d'entrées, mais une seule sortie. Un multiplexeur permet de sélectionner une entrée et de recopier son contenu sur sa sortie, les entrées non-sélectionnées étant ignorées. Sélectionner l'entrée à recopier sur la sortie se fait en configurant une entrée de commande du multiplexeur. Les entrées sont numérotées de 0 à la valeur maximale. Configurer l'entrée de commande demande juste d'envoyer le numéro de l'entrée sélectionnée dessus. [[File:4-to-1 multiplexer.svg|centre|vignette|Multiplexeur à 4 entrées.]] Les multiplexeurs sont très utilisés et on en retrouve partout : dans les mémoires RAM, dans les processeurs, dans les circuits de calcul, dans les circuits pour communiquer avec les périphériques, et j'en passe. Il s'agit d'un composant très utilisé, qu'il est primordial de bien comprendre avant de passer à la suite du cours. ===Le multiplexeur à deux entrées=== Le multiplexeur le plus simple est le multiplexeur à deux entrées et une sortie. Il est facile de le construire avec des portes logiques, dans les implémentations les plus simples. Sachez toutefois que les multiplexeurs utilisés dans les ordinateurs récents ne sont pas forcément fabriqués avec des portes logiques, mais qu'on peut aussi les fabriquer directement avec des transistors. [[File:Multiplexeur à deux entrées - symbole.png|centre|vignette|upright=1.5|Multiplexeur à deux entrées - symbole.]] Pour commencer, établissons sa table de vérité. On va supposer qu'un 0 sur l'entrée de commande sélectionne l'entrée a. La table de vérité devrait être la suivante : {|class="wikitable" |- !Entrée de commande !Entrée a !Entrée b !Sortie |- |0||0||0||0 |- |0||0||1||0 |- |0||1||0||1 |- |0||1||1||1 |- |1||0||0||0 |- |1||0||1||1 |- |1||1||0||0 |- |1||1||1||1 |} Sélectionnons les lignes qui mettent la sortie à 1 : {|class="wikitable" |- !Entrée de commande !Entrée a !Entrée b !Sortie |- |0||1||0||1 |- |0||1||1||1 |- |1||0||1||1 |- |1||1||1||1 |} On sait maintenant quels comparateurs avec une constante utiliser. On peut, écrire l'équation logique du circuit. La première ligne donne l'équation suivante : <math>\overline{E_c} . a . \overline{b}</math>, la seconde donne l'équation <math>\overline{E_c} . a . b</math> , la troisième l'équation <math>E_c . \overline{a} . b</math> et la quatrième l'équation <math>E_c . a . b</math>. L'équation finale obtenue est donc : : <math>(\overline{E_c} . a . \overline{b}) + (\overline{E_c} . a . b) + (E_c . \overline{a} . b) + E_c . a . b</math> L'équation précédente est assez compliquée, mais il y a moyen de la simplifier assez radicalement. Pour cela, nous allons utiliser les règles de l’algèbre de Boole. Pour commencer, nous allons factoriser <math>(\overline{E_c}</math> et <math>E_c</math> : : <math> \left[ \overline{E_c} .[ (a . \overline{b}) + (a . b)] \right] + \left[ E_c . [(\overline{a} . b) + (a . b)] \right] </math> Ensuite, factorisons <math>a</math> dans le premier terme et <math>b</math> dans le second : : <math> \left[ \overline{E_c} . a . (\overline{b} + b) \right] + \left[ E_c . b . (\overline{a} + a) \right]</math> Les termes <math>\overline{b} + b</math> et <math>\overline{a} + a</math> valent 1 : : <math> \left[ \overline{E_c} . a . 1 \right] + \left[ E_c . b . 1 \right]</math> On sait que <math>a . 1 = a</math>, ce qui fait que l'équation simplifiée est la suivante : : <math>(\overline{E_c} . a) + (E_c . b)</math> Le circuit qui correspond est : [[File:Multiplexeur à deux entrées - circuit.png|centre|vignette|upright=1.5|Multiplexeur à deux entrées - circuit.]] ===Les multiplexeurs à plus de deux entrées=== Il est possible de concevoir un multiplexeur quelconque à partir de sa table de vérité. Le résultat est alors un circuit composé d'une porte OU à plusieurs entrées, de plusieurs portes ET, et de quelques portes NON. Un exemple est illustré ci-dessous. Vous remarquerez cependant que ce circuit a un défaut : la porte OU finale a beaucoup d'entrées, ce qui pose de nombreux problèmes techniques. Il est difficile de concevoir des portes logiques avec un très grand nombre d'entrées. Aussi, les applications à haute performance demandent d'utiliser d'autres solutions. [[File:Mux2.png|centre|vignette|upright=1.5|Multiplexeur conçu à partir de sa table de vérité.]] Une solution alternative conçoit un multiplexeur à plus de deux entrées en combinant des multiplexeurs plus simples. Par exemple, en prenant deux multiplexeurs plus simples, et en ajoutant un multiplexeur 2 vers 1 sur leurs sorties respectives. Le multiplexeur final se contente de sélectionner une sortie parmi les deux sorties des multiplexeurs précédents, qui ont déjà effectué une sorte de présélection. [[File:Multiplexeur conçu à partir de multiplexeurs plus simples.jpg|centre|vignette|upright=1.5|Multiplexeur conçu à partir de multiplexeurs plus simples.]] Il existe toutefois une manière bien plus simple pour créer un multiplexeur, qui utilise des opérations de masquage. L'idée est qu'un multiplexeur sélectionne un bit bien précis dans l'opérande. L'idée est de masquer les bits non-sélectionnés, puis de regarder le résultat après masquage. Par défaut, les bits non-sélectionnés sont mis à 0. Le résultat après masquage dépend de la valeur du bit sélectionné : * Si le bit sélectionné vaut 0, alors tous les bits après masquage sont à zéro. * Si le bit sélectionné vaut 1, alors seul un bit du résultat après masquage est à 1. Pour savoir si au moins un bit du résultat vaut 1, l'idée est d'utiliser une porte OU. Si tous les bits sont à 0, la porte OU donnera un zéro. Sinon, elle sortira un 1. La sortie du multiplexeur s'obtient donc en faisant un OU logique entre tous les bits du résultat après masquage. Le circuit au complet est donc composé d'un circuit de masquage, d'un circuit qui génère le masque, et d'une porte OU. Le circuit qui génère le masque transforme le numéro du bit en un masque adéquat. Si le numéro du bit est de N, le masque a son énième bit à 1, les autres à 0. Pour le dire autrement, il convertit le numéro du bit en sa représentation ''one-hot''. Et ce n'est ni plus ni moins que ce que fait un décodeur ! La génération du masque est donc le fait d'un décodeur. [[File:Multiplexeur 2 vers 4 conçu à partir d'un décodeur.png|centre|vignette|upright=2|Multiplexeur 2 vers 4 conçu à partir d'un décodeur]] ==L'encodeur== [[File:8 to 3 simple encoder IEC symbol.svg|vignette|upright=0.5|Encodeur à 8 entrées (et 3 sorties).]] Il existe un circuit qui fait exactement l'inverse du décodeur : c'est l''''encodeur'''. Là où les décodeurs ont une entrée de <math>N</math> bits et <math>2^N</math> sorties de 1 bit, l'encodeur a à l'inverse <math>2^N</math> entrées de 1 bit avec une sortie de <math>N</math> bits. Par exemple, un encodeur avec une entrée de 4 bits aura 2 sorties, un décodeur avec une entrée de 8 bits aura 3 sorties, un décodeur avec une entrée de 256 bits aura 8 sorties, etc. Comme pour les décodeurs, on parle d'un encodeur X vers Y pour X bits d'entrée et Y de sortie. Ce qui fait qu'on peut parler de décodeur 8 vers 3 pour un décodeur à 8 bits d'entrée et 3 de sortie, de décodeur 16 vers 4, etc. [[File:Encoder block diagram.jpg|centre|vignette|upright=1.5|Entrées et sorties d'un encodeur.]] De plus, contrairement au décodeur, ce sont les entrées qui sont numérotées de 0 à N et non les sorties. Dans ce qui suit, on va supposer qu'une seule des entrées est à 1. Il existe des encodeurs capables de traiter le cas où plusieurs bits d'entrée sont à 1, qui sont appelés des encodeurs à priorité, mais nous les laissons pour le chapitre suivant. Le chapitre suivant sera totalement dédié aux encodeurs à priorité, aussi nous préférons nous focaliser sur le cas d'un encodeur simple, capable de traiter uniquement le cas où une seule entrée est à 1. En sortie, l'encodeur donne le numéro de l'entrée qui est à 1. Par exemple, si l'entrée numéro 5 est à 1 et les autres à 0, alors l'encodeur envoie un 5 sur sa sortie. Une autre manière d'expliquer son fonctionnement est la suivant : un encodeur traduit un nombre codé en représentation ''one-hot'' vers du binaire normal. L'utilité d'un encodeur n'est pas très évidente à ce moment du cours, mais nous pouvons déjà dire qu'ils seront utiles dans certaines formes de mémoires RAM appelées des mémoires associatives, qui sont utilisées dans des routeurs, switchs et autre matériel réseau. La majorité des mémoires caches de nos ordinateurs sont de ce type, bien que leur implémentation exacte ne fasse pas usage d'un encodeur. Une autre utilisation est la transformation d'un nombre codé en représentation ''one-hot'' vers du binaire normal, chose marginalement utile. ===L'encodeur 4 vers 2=== Prenons l'exemple d'un encodeur à 4 entrées et 2 sorties. Écrivons sa table de vérité. D'après la description du circuit, on devrait trouver ceci : {|class="wikitable" |+ Table de vérité d'un encodeur 4 vers 2 |- ! E3 !! E2 !! E1 !! E0 !! !! S1 !! S0 |- | 0 || 0 || 0 || 1 || || 0 || 0 |- | 0 || 0 || 1 || 0 || || 0 || 1 |- | 0 || 1 || 0 || 0 || || 1 || 0 |- | 1 || 0 || 0 || 0 || || 1 || 1 |} Vous voyez que la table de vérité est incomplète. En effet, l'encodeur fonctionne tant qu'une seule de ses entrées est à 1. L'encodeur dit alors quelle est la sortie à 1, mais cela suppose que les autres soient à 0. Si plusieurs entrées sont à 1, le comportement de l'encodeur est potentiellement erroné. En effet, il donnera un résultat incorrect sur certaines entrées. Mais passons cela sous silence et ne tenons compte que de la table de vérité partielle précédente. On peut traduire cette table de vérité en circuit logique. On obtient alors les équations suivantes : : <math>S1 = E3 + E2</math> : <math>S0 = E3 + E1</math> Le tout donne le circuit suivant : [[File:A Simple 4-2 encoder using or gate.jpg|centre|vignette|upright=1.5|Exemple d'encodeur à 4 entrées et 2 sorties.]] ===Les encodeurs à plus de deux sorties=== Il est possible de créer un encodeur complexe en combinant plusieurs encodeurs simples. C'est un peu la même chose qu'avec les décodeurs, pour lesquels on peut créer un décodeur 8 vers 256 à base de deux décodeurs 7 vers 128, ou de quatre décodeurs 6 vers 64. L'idée de découper le nombre d'entrée en morceaux séparés, chaque morceau étant traité par un encodeur à priorité distinct des autres. Les résultats des différents encodeurs sont ensuite combinés pour donner le résultat final. Pour comprendre l'idée, prenons la table de vérité d'un encodeur 8 vers 3; donnée dans le tableau ci-dessous. {|class="wikitable" |+ Table de vérité d'un encodeur 8 vers 3 |- ! E7 !! E6 !! E5 !! E4 !! E3 !! E2 !! E1 !! E0 !! !! S2 !! S1 !! S0 |- | 0 || 0 || 0 || 0 || 0 || 0 || 0 || 1 || || 0 || 0 || 0 |- | 0 || 0 || 0 || 0 || 0 || 0 || 1 || 0 || || 0 || 0 || 1 |- | 0 || 0 || 0 || 0 || 0 || 1 || 0 || 0 || || 0 || 1 || 0 |- | 0 || 0 || 0 || 0 || 1 || 0 || 0 || 0 || || 0 || 1 || 1 |- | 0 || 0 || 0 || 1 || 0 || 0 || 0 || 0 || || 1 || 0 || 0 |- | 0 || 0 || 1 || 0 || 0 || 0 || 0 || 0 || || 1 || 0 || 1 |- | 0 || 1 || 0 || 0 || 0 || 0 || 0 || 0 || || 1 || 1 || 0 |- | 1 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || || 1 || 1 || 1 |} En regardant bien, vous verrez que vous pouvez trouver la table de vérité d'un encodeur 4 vers 2 en deux exemplaires, indiquées en rouge. {|class="wikitable" |+ Table de vérité d'un encodeur 8 vers 3 |- ! E7 !! E6 !! E5 !! E4 !! E3 !! E2 !! E1 !! E0 !! !! S2 !! S1 !! S0 |- | 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 |- | 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 |- | 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 |- | 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 1 |- | bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || 0 || 0 || 0 || 0 || | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 |- | bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || 0 || 0 || 0 || 0 || | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 |- | bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || 0 || 0 || 0 || 0 || | 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 |- | bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || 0 || 0 || 0 || 0 || | 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 1 |} On voit que les deux bits de poids faibles correspondent à la sortie de l'encodeur activé par l'entrée. Si le premier encodeur est activé, c'est lui qui fournit les bits de poids faibles. Inversement, si c'est le second encodeur qui a un résultat non-nul, c'est lui qui fournit les bits de poids faible. Notons que seul un des deux encodeurs a une sortie non-nulle à la fois : soit le premier a une sortie non-nulle, soit c'est le second, mais c'est impossible que ce soit les deux en même temps. Cela permet de déduire quelle opération permet de mixer les deux résultats : un simple OU logique suffit. Car, pour rappel, 0 OU X donne X, quelque que soit le X en question. Les bits de poids faible du résultat se calculent en faisant un OU entre les deux résultats des encodeurs. Ensuite, il faut déterminer comment fixer le bit de poids fort du résultat. Il vaut 0 si le premier encodeur a une entrée non-nulle, et 1 si c'est le premier encodeur qui a une entrée non-nulle. Pour cela, il suffit de vérifier si les bits de poids forts, associés au premier encodeur, contiennent un 1. Si c'est le cas, alors on met la troisième sortie à 1. [[File:Encodeur fabriqué à partir d'encodeurs plus petits.png|centre|vignette|upright=2|Encodeur fabriqué à partir d'encodeurs plus petits.]] Notons que cette procédure, à savoir faire un OU entre les sorties de deux encodeurs simples, puis faire un OU pour calculer le troisième bit, marche pour tout encodeur de taille quelconque. À vrai dire, le circuit obtenu plus haut d'un encodeur 4 vers 2 est conçu ainsi, mais en combinant deux encodeurs 2 vers 1. La procédure consiste à ajouter trois portes OU à deux encodeurs. Mais ceux-ci sont eux-même composés de portes OU associées à des encodeurs plus petits, et ainsi de suite. On peut poursuivre ainsi jusqu’à tomber sur des encodeurs 4 vers 2, qui sont eux-mêmes composés de deux portes OU. Au final, on se retrouve avec un circuit conçu uniquement à partir de portes OU. Notons qu'il est possible de simplifier le circuit obtenu avec la procédure en fusionnant des portes OU. Si on simplifie vraiment au maximum, le circuit consiste alors en une porte OU à plusieurs entrées par sortie, chacune étant connectée à certaines entrées bien précises. Pour un encodeur 8 vers 3, la simplification du circuit devrait donner ceci : [[File:8-3 Encoder.gif|centre|vignette|upright=1.5|Encodeur 8 vers 3.]] ==L'encodeur à priorité== L''''encodeur à priorité''' est un dérivé du circuit encodeur, vu dans la section précédente. La différence ne se situe pas dans le nombre d'entrée ou de sortie, ni même dans son interface extérieure. Comme pour l'encodeur normal, l'encodeur à priorité possède <math>2^N</math> entrées numérotées de 0 à <math>2^N - 1</math> et N sorties. Une autre manière plus intuitive de le dire est qu'il possède N entrées et <math>\log_2{N}</math> sorties. Pas de changement de ce point de vue. La différence entre encodeur simple et encodeur à priorité tient dans leur fonctionnement, dans le calcul qu'ils font. Avec un encodeur normal, on a supposé que seul un bit d'entrée pouvait être à 1, les autres étant systématiquement à 0. Si cette condition est naturellement remplie dans certains cas d’utilisation, ce n'est pas le cas dans d'autres. L'encodeur à priorité est un encodeur amélioré dans le sens où il donne un résultat valide même quand plusieurs bits d'entrée sont à 1. Il donne donc un résultat pour n'importe quel nombre passé en entrée. Mais avant de passer aux explications, un peu de terminologie utile. Dans ce qui suit, nous aurons à utiliser des expressions du type "le 1 de poids faible", "le 1 de poids fort" et quelques autres du même genre. Quand nous parlerons du 1 de poids faible, nous voudrons parler du premier 1 que l'on croise dans un nombre en partant de sa droite. Par exemple, dans le nombre 0110 1000, le 1 de poids faible est le quatrième bit. Quant au "1 de poids fort", c'est le premier 1 que l'on croise quand on parcourt le nombre à partir de sa gauche. Dans le cas le plus fréquent, l'encodeur à priorité prend en entrée un nombre et donne la position du 1 de poids fort. Mais dans d'autres cas, l'encodeur à priorité donne la position du 1 de poids faible. Il existe des équivalents, mais qui trouvent cette fois-ci les zéros de poids fort/faible, mais nous n'en parlerons pas dans ce chapitre. ===L'encodeur à priorité conçu à partir de sa table de vérité=== Il est possible de concevoir l'encodeur à priorité à partir de sa table de vérité, mais les méthodes des minterms ou des maxterms ne donnent pas de très bons résultats. Notons que ces encodeurs ont souvent une nouvelle entrée notée V, qui indique si la sortie est valide, et qui indique qu'au moins une entrée est à 1. Elle vaut 1 si au moins une entrée est à 1, 0 si toutes les entrées sont à 0. À titre d'exemple, la table de vérité d'un encodeur à priorité 4 vers 2 est illustré ci-dessous. Le signe X signifie que le bit peut prendre la valeur 0 ou 1 sans que cela change quoique ce soit à l'entrée. {|class="wikitable" |- ! E3 !! E2 !! E1 !! E0 !! !! S1 !! S0 !! V |- | 0 || 0 || 0 || 0 || || 0 || 0 || 0 |- | 0 || 0 || 0 || 1 || || 0 || 0 || 1 |- | 0 || 0 || 1 || X || || 0 || 1 || 1 |- | 0 || 1 || X || X || || 1 || 0 || 1 |- | 1 || X || X || X || || 1 || 1 || 1 |} Les équations logiques obtenues sont donc les suivantes : : <math>V = E3 + E2 + E1 + E0</math> : <math>S0 = E3 + (\overline{E3} . \overline{E2} . E1)</math> : <math>S1 = E3 + ( \overline{E3} . E2 )</math> On voit quelle est la logique de chaque équation. Pour chaque ligne de la table de vérité, il faut vérifier si les bits de poids fort sont à 0, suivi par un 1, les bits de poids faible après le 1 étant oubliées. Pour le bit de validité, il suffit de faire un OU entre toutes les entrées. Les deux dernières équations se simplifient en : : <math>S0 = E3 + (\overline{E2} . E1)</math> : <math>S1 = E3 + E2</math>, Le circuit obtenu est le suivant : [[File:Pr encoder 4x2.png|centre|vignette|upright=1.5|Encodeur à priorité 4 vers 2.]] La table de vérité d'un encodeur à priorité 8 vers 3 est illustré ci-dessous. Le signe X signifie que le bit peut prendre la valeur 0 ou 1 sans que cela change quoique ce soit à l'entrée. [[File:Encoder.JPG|centre|vignette|upright=2|Table de vérité d'un encodeur à priorité 8 vers 3.]] Utiliser la table de vérité a des défauts. Premièrement, ce n'est pas la meilleure des solutions pour des circuits avec un grand nombre d'entrée. Faire cela donne des tables de vérité rapidement importantes, mêmes pour des encodeurs avec peu de sorties. Le circuit final utilise beaucoup de portes logiques comparé aux autres méthodes. Les solutions alternatives que nous allons voir dans ce qui suit permettent de résoudre ces deux problèmes en même temps. ===Les encodeurs à priorité récursifs=== Une première solution consiste à créer un gros encodeur à base d'encodeurs plus petits.L'idée de découper le nombre d'entrée en morceaux séparés, chaque morceau étant traité par un encodeur à priorité distinct des autres. Les résultats des différents encodeurs sont ensuite combinés pour donner le résultat final. Naturellement, il est préférable d'utiliser plusieurs exemplaires d'un même encodeur, c'est à dire que pour une entrée de 256 bits, il vaut mieux utiliser soit deux décodeurs 7 vers 128, soit quatre décodeurs 6 vers 64, etc. La construction est similaire à celle vue dans le chapitre précédent, dans la section sur les encodeurs. La différence est que le OU entre les sorties des encodeurs est remplacé par un multiplexeur. Une version générale est illustrée ci-dessous. On voit que les encodeurs ont une sortie de résultat de X bits notée idx et une sortie de validité notée vld. La sortie de validité finale se calcule en combinant les sorties de validité de chaque encodeur. La sortie est par définition à 1 tant qu'un seul encodeur a une sortie non-nulle, donc quand un seul encodeur a un bit de validité à 1. En clair, c'est un simple OU entre les bits de validité. Reste à déterminer la sortie de donnée, celle qui donne la position du 1 de poids fort. On peut dire que si l'on utilise des encodeurs avec N bits de sortie, alors les N bits de poids faible du résultat seront donnés par le premier encodeur avec une sortie non-nulle. Les résultats de chaque encodeur donnent doncles X bits de poids faible, un seul résultat devant être sélectionné. Le résultat à sélectionner est le premier à avoir un résultat non-nul, donc à avoir un bit de validité à 1. En clair, on peut déterminer quel est le bon encodeur, le bon résultat, en analysant les bits de validité. Mieux : d'après ce qui a été dit, on peut deviner que l'analyse réalisée correspond à trouver la position du premier encodeur à avoir un bit de validité à 1. En clair, c'est l'opération réalisée par un encodeur à priorité lui-même. Tout cela permet de déterminer les N bits de poids faible, amis les autres bits, ceux de poids fort, sont encore à déterminer. Pour cela, on peut remarquer que ceux-ci sont eux-même fournit par l'encodeur à priorité qui commande le MUX. [[File:PE-recursion.svg|centre|vignette|upright=2|Construction d'un encodeur à priorité à partir d'encodeur à priorité plus petits.]] Notons qu'avec cette méthode, il est possible, mais pas très intuitif, de fabriquer un encodeur configurable, capable de se comporter soit comme un encodeur de type ''Find Highest Set'', soit de type ''Find First Set''. L'implémentation la plus simple demande de modifier le circuit qui combine les résultats pour qu'il soit configurable et puisse faire les deux opérations à la demande. ===L'encodeur à priorité avec un circuit d'isolation du 1 de poids fort/faible=== Une autre solution part d'un encodeur normal, auquel on ajoute un circuit qui se charge de sélectionner un seul des bits passé sur son entrée. Le circuit de gestion des priorités a pour fonction de trouver sélectionner un bit et de mettre les autres 1 à 0. Suivant le circuit de priorité considéré, le bit sélectionné est soit le 1 de poids fort, soit le 1 de poids faible. Dans certains cas, le circuit de priorité est configurable et peut trouver l'un ou l'autre suivant ce qu'on lui demande. Dans ce qui va suivre, nous allons partir du principe que l'on souhaite avoir un encodeur qui trouve le 1 de poids fort, sauf indication contraire. [[File:Encodeur à priorité.png|centre|vignette|upright=2|Encodeur à priorité.]] Une méthode assez pratique découpe le circuit de gestion des priorité en petites briques de bases, reliées les unes à la suite des autres. L'idée est que les briques de base sont connectées de manière à propager un signal de mise à zéro. Si une brique détecte un 1, elle envoie un signal aux briques précédentes/suivantes, qui leur dit de mettre leur sortie à zéro. Ce faisant, une fois le premier 1 trouvé, on est certain que les autres bits précédents/suivants sont mis à zéro. Suivant les connexions des briques de base, on peut obtenir soit un encodeur qui effectue l'opération ''Find First Set'', soit encodeur de type ''Find Highest Set'' et réciproquement. En fait, suivant que les briques soient reliées de droite à gauche ou de gauche à droite, on obtiendra l'un ou l'autre de ces deux encodeurs. [[File:Circuit de gestion des priorités.png|centre|vignette|upright=2|Circuit de gestion des priorités.]] Chaque brique de base peut soit recopier le bit en entrée, soit le mettre à zéro. Pour décider quoi faire, elle regarde le signal d'entrée RAZ (''Remise A Zéro''). Si le bit RAZ vaut 1, la sortie est mise à zéro automatiquement. Dans le cas contraire, le bit passé en entrée est recopié. De plus, chaque brique de base doit fournir un signal de remise à zéro RAZ à destination de la brique suivante. Ce signal RAZ de sortie est mis à 1 dans deux cas : soit si le bit d'entrée vaut, soit quand le signal d'entrée RAZ est à 1. Si vous cherchez à la concevoir à partir d'un table de vérité, vous obtiendrez ceci : {| |[[File:Brique de base du circuit de gestion des priorités d'un encodeur à priorité.png|vignette|Brique de base du circuit de gestion des priorités d'un encodeur à priorité.]] |[[File:Circuit de gestion des priorité - Circuit de la brique de base.png|vignette|upright=1.5|Circuit de gestion des priorité - Circuit de la brique de base.]] |} Le circuit complet d'un encodeur à priorité peut être déduit facilement à partir des raisonnements précédents. Après quelques simplifications, on peut obtenir le circuit suivant. On voit qu'on a ajouté une ligne de briques RAZ à l'encodeur 8 vers 3 vu plus haut. [[File:Koder priorytetowy.jpg|centre|vignette|upright=2|Encodeur à priorités]] Le défaut de cette méthode est que le circuit de gestion des priorité est assez lent. Dans le pire des cas, le signal de remise à zéro traverse toutes les briques de base, soit autant qu'il y a de bits d'entrée. Si chaque brique de base met un certain temps, le temps mis pour que le circuit de priorité fasse son travail est proportionnel au nombre de bits de l'entrée. Cela n'a l'air de rien, mais cela peut prendre un temps rédhibitoire pour les circuits de haute performance, destinés à fonctionner à haute fréquence. Pour ces circuits, on préfère que le temps de calcul soit proportionnel au logarithme du nombre de bits d'entrée, un temps proportionnel étant considéré comme trop lent, surtout pour des opérations simples comme celles étudiées ici. Une version légèrement différente de ce circuit est utilisée dans le processeur ARM1, un des tout premiers processeur ARM. L'encodeur à priorité était bidirectionnel, à savoir capable de déterminer soit la place du 1 de poids faible, soit du 1 de poids fort. Pour ceux qui veulent en savoir plus, et qui ont déjà un bagage solide en architecture des ordinateurs, voici un lien à ce sujet : : [https://www.righto.com/2016/01/more-arm1-processor-reverse-engineering.html More ARM1 processor reverse engineering: the priority encoder ] <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de masquage | prevText=Les circuits de masquage | next=Les circuits incrémenteurs/décrémenteurs | nextText=Les circuits incrémenteurs/décrémenteurs }} </noinclude> ezyhk8453cytjx0y8uvj3tqwttdqbyg Fonctionnement d'un ordinateur/Les circuits de décalage et de rotation 0 75477 768071 763713 2026-06-18T16:55:24Z Mewtow 31375 /* Le barrel shifter de l'Intel 386 */ 768071 wikitext text/x-wiki Dans ce chapitre, nous allons voir des opérations appelées les décalages et les rotations. Nous allons voir ce que sont ces opérations, puis les nombreux circuits qui permettent d'implémenter ces opérations. Mais expliquons d'abord les différentes opérations de décalage et de rotation. ==Les opérations de décalage== Les ''décalages'' décalent un nombre de un ou plusieurs rangs vers la gauche, ou la droite. Il existe plusieurs opérations de décalage différentes et on peut les classer en plusieurs types. Dans les grandes lignes, on distingue les rotations, les décalages logiques et les décalages arithmétiques. Elles se distinguent sur plusieurs points, les principaux étant les suivants : * ce qu'on fait des bits qui sortent du nombre lors du décalage ; * comment on remplit les vides qui apparaissent lors du décalage ; * la manière dont est géré le signe du nombre décalé. [[File:Décalages, gestion des bits entrants et sortants.png|vignette|Décalages, gestion des bits entrants et sortants]] Pour comprendre les deux premiers points, prenons l'exemple ci-contre. L'exemple montre le décalage de deux rangs vers la droite, d'un opérande de 8 bits valant 01011101. On obtient 010111 : les deux bits de poids forts sont vides et les deux bits de poids faible (01) sortent du nombre. Et cela vaut pour tout décalage : d'un côté le décalage fait sortir des bits du nombre, de l'autre certains bits sont inconnus ce qui laisse des vides dans le nombre. Si on décale de n rangs, alors cela laissera n vides et fera sortir n bits. Ces deux points, la gestion des vides et des bits sortants, sont assez liés. ===Le différents types de décalages=== Au-delà de la distinction assez intuitive entre les décalages vers la gauche et vers la droite, parlons de ce qu'on fait des bits qui sortent du nombre lors du décalage. Que fait-on de ces bits ? La première solution est de les faire rentrer de l'autre côté, de les remettre au début du nombre décalé. L'opération en question est alors appelée une '''rotation'''. Il existe des rotations à droite et à gauche. {| |MSB : bit de poids fort (Most Significant Bit) LSB : bit de poids faible (Least Significant Bit) | |[[File:Rotate left.svg|vignette|Rotation à gauche.]] |[[File:Rotate right.svg|vignette|Rotation à droite.]] |} L'autre solution est d'oublier les bits sortants. L’opération est alors appelée un '''décalage''', qui peut être soit un décalage logique, soit un décalage arithmétique. Le fait que l'on oublie les bits sortants fait que les vides ne sont pas remplis et qu'il faut trouver de quoi les combler. Et c'est là qu'on peut faire la distinction entre décalages logiques et arithmétiques. Avec un '''décalage logique''', les vides sont remplis par des zéros, aussi bien pour un décalage à gauche et un décalage à droite. {| |[[File:Rotate left logically.svg|vignette|Décalage logique à gauche.]] |[[File:Rotate right logically.svg|vignette|Décalage logique à droite.]] |} [[File:Shift Arithmetic Right.svg|vignette|Décalage arithmétique à droite.]] Avec un '''décalage arithmétique''', la situation est différente pour un décalage à gauche et à droite. Le principe des décalages arithmétique est qu'ils conservent le bit de signe de l'opérande décalé (qui est supposé être signé), contrairement aux autres décalages. Pour un décalage à droite, les vides dans les vides de poids forts sont remplis par le bit de signe. Ce remplissage est une sorte d'extension de signe, ce qui fait que la conservation du signe est automatique. [[File:Shift Left and Shift Arithmetic Left.svg|vignette|Décalage arithmétique à gauche qui ne conserve pas le bit de signe.]] Pour un décalage à gauche, les vides sont remplis par des zéros, comme pour un décalage logique. Mais pour ce qui est de la conservation du bit de signe, c'est plus compliqué. On a deux écoles : la première ne conserve pas le bit de signe, la seconde le fait. Dans le premier cas, le décalage est identique à un décalage logique à gauche. Dans le second cas, le bit de signe n'est pas concerné par le décalage et il se produit une forme particulière de débordement d'entier. L'utilité principale des opérations de décalage est qu'elles permettent de faire simplement des multiplications ou divisions par une puissance de 2. Un décalage logique/arithmétique correspond à une multiplication ou division entière par 2^n : multiplication pour les décalages à gauche, division pour les décalages à droite. Les décalages logiques fonctionnent seulement pour les entiers non signés, alors que les décalages arithmétiques fonctionnent sur les entiers signés. Le fait est qu'un décalage logique ne préserve pas le bit de signe. [[File:Modulo et quotient d'une division par une puissance de deux en binaire.png|centre|vignette|upright=2.5|Modulo et quotient d'une division par une puissance de deux en binaire]] ===Les arrondis lors des décalages=== Les décalages à droite entraînent l'apparition d{{'}}''arrondis''. Lorsqu'on effectue un décalage à droite, les bits qui sortent du résultat sont perdus. L’équivalent en décimal est que les chiffres après la virgule sont perdus, ce qui arrondit le résultat. Mais cet arrondi dépend de la représentation des nombres utilisé. Pour comprendre pourquoi, il faut faire un rapide rappel sur les types d'arrondis en décimal. En décimal, on peut arrondir de deux manières : soit on arrondit à l'entier au-dessus, soit on arrondi à l'entier au-dessous. Par exemple, prenons la division 29/4, qui a pour résultat 7.25. Cela donne 7 dans le premier cas et 8 dans le second. Pour un résultat négatif, c'est la même chose, mais le fait que le signe soit inversé change la donne. Par exemple, prenons le résultat de -29 / 4, soit -7.25. On peut l'arrondir soit à -7, soit à -8. En combinant les deux cas négatifs avec les deux cas positifs, on se trouve face à quatre possibilités : * l'arrondi vers la plus basse valeur absolue (vers zéro), qui donne respectivement 7 et -7 dans l'exemple précédent. * l'arrondi vers la plus basse valeur (vers moins l'infini), qui donne -8 et 7 dans l'exemple précédent ; * l'arrondi vers la plus haute valeur (vers plus l'infini), qui donne -7 et 8 dans l'exemple précédent ; * l'arrondi vers la plus haute valeur absolue (vers l'infini), qui donne 8 et -8 dans l'exemple précédent. En binaire, c'est la même chose. Par exemple, 11100,1010 peut s'arrondir en 11100 ou en 11101, suivant qu'on arrondisse vers le bas ou vers le haut, et la même chose est possible pour les nombres négatifs. Vu que les bits sortants sont simplement éliminés, on pourrait croire que cela correspond à un arrondi vers zéro (vers la valeur inférieure). C'est bien le cas pour les décalages logiques, peu importe la représentation, l'arrondi se fait vers zéro (vu que tous les nombres sont traités comme positifs). Mais pour les décalages arithmétiques, tout dépend de la représentation binaire utilisée. L'arrondi se fait bien vers zéro en complément à 1, mais pas en complément à deux, où l'arrondi se fait à la valeur inférieure, vers moins l'infini. Précisons que ces arrondis n'ont lieu que si le résultat du décalage n'est pas exact. Pour un décalage d'un rang, à savoir une division par deux, seuls les nombres impairs donnent un arrondi, pas les nombres pairs. De manière générale, pour un décalage de n rangs, les nombres divisibles par 2^n ne donnent pas d'arrondi, alors que les autres si. ===Les débordements d'entiers lors des décalages=== Les décalages peuvent aussi causer des ''débordements d'entier''. Pour rappel un débordement d'entier est une situation où le résultat d'un calcul devient trop gros pour être codé. Pour donner un exemple, prenons une situation équivalente mais en décimal. Par exemple supposons que l'ordinateur sur lequel vous travailler manipule des données codées sur 5 chiffres décimaux, pas plus. Si on prend le nombre 4512, le décalage à gauche d'un cran donne 45120, qui tient sur 5 chiffres : on n'a pas de débordement. Mais si je prends le nombre 97426, un décalage à gauche d'un cran donne 974260, ce qui ne tient pas dans 5 chiffres : on a un débordement d’entier. Celui-ci se traduit par le fait qu'un chiffre non-nul sorte du nombre. La même chose a lieu en binaire, avec les décalages à gauche : si au moins un bit non-nul sorte à gauche, c'est un débordement d'entier. La manière habituelle de gérer les débordements d'entiers est simplement de ne rien faire, mais de prévenir qu'un débordement a eu lieu. Pour cela, le circuit qui effectue le décalage a une sortie qui indique qu'un débordement a eu lieu lors du décalage. Cette sortie fournit un simple bit qui vaut 1 en cas de débordement et 0 sinon (ou l'inverse). Une autre solution est de corriger le débordement, mais elle est utilisée uniquement pour les opérations arithmétiques, pas pour les décalages. Toujours est-il que déterminer l’occurrence d'un débordement n'est pas compliqué. Pour les décalages logiques, il suffit de prendre les bits sortants et de vérifier qu'un au moins d'entre eux vaut 1. Une simple porte OU sur les bits sortants fait l'affaire. Pour les décalages arithmétiques, il faut aussi tenir compte de la présence du bit de signe. Si le nombre décalé est positif, seuls des zéros doivent sortir, la présence d'un 1 indiquant un débordement d'entier. Pour un nombre négatif, c'est l'inverse : seuls des 1 doivent sortir (du fait des règles d'extension de signe), alors que l’occurrence d'un zéro trahit un débordement d'entier. Pour résumer le tout, les bits sortants sont censés être égaux au bit de signe, un débordement a eu lieu dans le cas contraire. L’occurrence d'un débordement se détermine en décomposant le décalage en une succession de décalages de 1 bit. Si un seul de ces décalages de 1 rang altère le bit de signe (change sa valeur), alors on a un débordement. Il est possible de déterminer l’occurrence d'un débordement en analysant l'opérande, sans même avoir à faire le décalage. Pour un décalage vers la gauche de <math>n</math> rangs, on sait que les bits sortants sont les <math>n</math> bits de poids fort de l'opérande. En clair, on peut déterminer si un débordement a lieu en sélectionnant seulement les <math>n</math> bits de poids fort de l'opérande. Pour cela, on peut simplement prendre l'opérande et lui appliquer un masque adéquat. Par exemple, prenons le cas d'un débordement pour un décalage logique, qui a lieu si au moins un bit sortant est à 1. Il suffit de prendre l'opérande, conserver les <math>n</math> rangs bits de poids fort et mettre les autres à zéro, puis faire un ET entre les bits du résultat. La même logique prévaut pour les décalages arithmétiques, même s'il faut faire quelques adaptations. [[File:Calcul du bit de débordement pour un décalage à gauche de trois rangs.png|centre|vignette|upright=2|Calcul du bit de débordement pour un décalage à gauche de trois rangs.]] Toujours est-il que le calcul des débordements peut se faire en parallèle du décalage, ce qui est utile. Précisons que le masque se calcule dans un circuit à part, qui ressemble beaucoup à un encodeur. Le masque calculé peut être utilisé sur certains circuits de décalages, pour transformer des rotations en décalage logiques, par exemple. Mais nous verrons cela plus tard. ==Les décaleurs et rotateurs élémentaires== [[File:Décaleur - interface.png|vignette|Décaleur - interface]] Pour commencer, nous allons voir deux types de circuits : les '''décaleurs''' qui effectuent un décalage (logique ou arithmétique, peu importe) et les '''rotateurs''' qui effectuent une rotation. Les deux circuits sont conceptuellement séparés, même s’ils se ressemblent. Faire la distinction sera utile dans la suite du cours. Leur interface est la même pour tous les décaleurs et rotateurs élémentaires. On doit fournir l'opérande à décaler et le nombre de rangs qu'on veut décaler en entrée, et on récupère l'opérande décalé en sortie. Nous allons d'abord voir comment créer un décaleur. Pour cela, on peut faire une remarque simple : décaler de 6 rangs, c'est équivalent à décaler de 4 rangs et redécaler le tout de 2 rangs. Même chose pour 7 rangs : cela consiste à décaler de 4 rangs, redécaler de 2 rangs et enfin redécaler d'un rang. En suivant l'idée jusqu'au bout, on peut créer un décaleur à partir de décaleurs plus simples, reliés en cascade, qu'on active ou désactive suivant le nombre de rangs. Les décaleurs élémentaires décalent par 1, 2, 4, 8, etc ; bref : par une puissance de 2. La raison à cela est que le nombre de rangs par lequel on va devoir décaler est un nombre codé en binaire, qui s'écrit donc sous la forme d'une somme de puissances de deux. Le énième bit du nombre de rang servira à actionner le décaleur par 2^n. [[File:Décaleur logique - principe.png|centre|vignette|upright=2|Décaleur logique - principe]] La même logique s'applique pour les rotateurs, la seule différence étant qu'il faut remplacer les décaleurs par 1, 2, 4, 8, etc ; par des rotateurs par 1, 2, 4, 8, etc. Reste à savoir comment créer ces décaleurs qu'on peut activer ou désactiver à la demande. Surtout que le circuit n'est pas le même selon que l'on parle d'un décalage logique, d'un décalage arithmétique ou d'une rotation. Néanmoins, tous les circuits de décalage/rotation sont fabriqués avec des multiplexeurs à deux entrées et une sortie. ===Le circuit décaleur logique=== Commençons par étudier le cas du décalage logique par 4 rangs à droite. La sortie vaudra soit le nombre tel qu'il est passé en entrée (le décaleur est inactif), soit le nombre décalé de 4 rangs. Ainsi, si je prends un nombre A, composé des bits a7, a6, a5, a4, a3, a2, a1, a0 ; (cités dans l'ordre), le résultat sera : * soit le nombre composé des chiffres a7, a6, a5, a4, a3, a2, a1, a0 (on n'effectue pas de décalage) ; * soit le nombre composé des chiffres 0, 0, 0, 0, a7, a6, a5, a4 (on effectue un décalage par 4). Chaque bit de sortie peut prendre deux valeurs, qui valent soit zéro, soit un bit du nombre d'entrée. On peut donc utiliser un multiplexeur pour choisir quel bit envoyer sur la sortie. Par exemple, pour le choix du bit de poids fort du résultat, celui-ci vaut soit a7, soit 0 : il suffit d’utiliser un multiplexeur prenant le bit a7 sur son entrée 1, et un 0 sur son entrée 0. [[File:Décaleur par 4.png|centre|vignette|upright=2|Exemple d'un décaleur par 4.]] Le tout peut être adapté pour créer des décaleurs par 1, par 2, par 8, etc. Il suffit de faire la même chose pour tous les autres bits, et le tour est joué. En utilisant des décaleurs basiques par 4, 2 et 1 bit, on obtient le circuit suivant : [[File:Décaleur logique 8 bits.png|centre|vignette|upright=2|Décaleur logique 8 bits.]] ===Le circuit décaleur arithmétique=== Les décalages arithmétiques sont basés sur le même principe, à une différence près : on n'envoie pas un zéro dans les bits de poids fort, mais le bit de signe (le bit de poids fort du nombre d'entrée). Un décaleur arithmétique ressemble beaucoup à un décaleur logique, la seule différence étant que c'est le bit de poids fort qui est relié aux entrées des multiplexeurs, là où c'était le zéro avec le décaleur logique. Par exemple, reprenons un nombre A, composé des bits a7, a6, a5, a4, a3, a2, a1, a0 ; (cités dans l'ordre). La sortie d'un décaleur arithmétique par 4 sera : * soit le nombre composé des chiffres a7, a6, a5, a4, a3, a2, a1, a0 (on n'effectue pas de décalage) ; * soit le nombre composé des chiffres a7, a7, a7, a7, a7, a6, a5, a4 (on effectue un décalage arithmétique par 4). [[File:Décaleur arithmétique par 4.png|centre|vignette|upright=2|Exemple d'un décaleur arithmétique par 4]] En combinant des décaleurs basiques par 4, 2 et 1 bits, on obtient le circuit suivant : [[File:Décaleur arithmétique 8 bits.png|centre|vignette|upright=2|Décaleur arithmétique 8 bits]] ===Le circuit rotateur=== Les rotations sont elles aussi basées sur le même principe, sauf que ce sont les bits de poids faible qu'on injecte dans les bits de poids forts, au lieu d'un zéro ou du bit de signe. Le circuit est donc le même, sauf que les connexions ne sont pas identiques. Là où il y avait un zéro sur les entrées des multiplexeurs, on doit envoyer le bon bit de poids faible. Par exemple, reprenons un nombre A, composé des bits a7, a6, a5, a4, a3, a2, a1, a0 ; (cités dans l'ordre). La sortie d'un rotateur arithmétique par 4 sera : * soit le nombre composé des chiffres a7, a6, a5, a4, a3, a2, a1, a0 (on n'effectue pas de décalage) ; * soit le nombre composé des chiffres a3, a2, a1, a0, a7, a6, a5, a4 (on effectue un décalage arithmétique par 4). ==Les ''barell shifters'' unidirectionnels== [[File:Barrel shifter - interface.png|vignette|Barrel shifter - interface]] Dans ce qui précède, on a appris à créer un circuit qui fait des décalages logiques, un autre pour les décalages arithmétiques et un autre pour les rotations. Il nous reste à voir les '''décaleurs-rotateurs''', aussi appelés des '''''barrel shifters''''', qui sont capables de faire à la fois des décalages et des rotations. Certains décaleur-rotateurs sont capables de faire des rotations et des décalages logiques, d'autres savent aussi réaliser les décalages arithmétiques en plus. Un tel circuit a la même interface qu'un décaleur, sauf qu'on rajoute une entrée qui précise quelle opération faire. Cette entrée indique s'il faut faire un décalage logique, un décalage arithmétique ou une rotation. Précisons dès maintenant qu'il faut faire la différence entre un ''barrel shifter'' unidirectionnel et un ''barrel shifter'' bidirectionnel. La différence entre les deux tient dans le sens possible des décalages. Le ''barrel shifter'' unidirectionnel ne peut faire que des décalages à gauche ou que des décalages à droite, mais pas les deux. À l'inverse, un ''barrel shifter'' bidirectionnel peut faire des décalages à droite et à gauche, suivant ce qu'on lui demande. Dans cette section, nous allons nous concentrer sur les ''barrel shifters'' unidirectionnels, qui font des décalages/rotations vers la droite. Les explications seront valides aussi pour des décalages/rotations à gauche, avec quelques petites modifications triviales. Il existe trois grandes méthodes pour fabriquer un décaleur-rotateur. * La manière la plus naïve est de prendre un décaleur logique, un décaleur arithmétique et un rotateur, et de prendre le résultat adéquat suivant l’opération voulue. Le choix du bon résultat est effectué par une couche de multiplexeur adaptée. Mais cette solution est inutilement gourmande en multiplexeurs. Après tout, les trois circuits se ressemblent et partagent une même structure. * Une autre solution, bien plus économe en multiplexeurs, élimine ces redondances en fusionnant les trois circuits en un seul. Elle part d'un circuit qui effectue des décalages logiques, auquel on ajoute des multiplexeurs pour le rendre capable de faire aussi les décalages arithmétiques et les rotations. * La dernière méthode part d'un rotateur et on lui ajoute de quoi faire des décalages logiques. ===Le décaleur-rotateur à base de multiplexeurs=== Avec la seconde méthode, on part d'un circuit qui effectue des décalages logiques, auquel on ajoute des multiplexeurs pour le rendre capable de faire aussi les décalages arithmétiques et les rotations. Ces nouveaux multiplexeurs ne font que choisir les bits à envoyer sur les entrées des décaleurs. Par exemple, prenons un décalage/rotation par 4 crans. La seule différence entre décalage logique, arithmétique et rotation est ce qu'on met sur les 4 bits de poids fort : un 0 pour un décalage logique, le bit de poids fort pour un décalage arithmétique et les 4 bits de poids faible pour une rotation. Pour choisir entre ces trois valeurs, il suffit de rajouter des multiplexeurs. Nous allons d'abord ajouter des multiplexeurs pour prendre en charge les rotations, un peu de la même manière qu'on modifie un décaleur logique pour lui faire faire aussi des décalages arithmétiques. Pour cela, prenons un décaleur par 4 et étudions les 4 bits de poids fort. Suivant le type de décalage, on doit envoyer soit un zéro, soit le bit de poids faible adéquat sur certaines entrées. Ce choix peut être réalisé par un multiplexeur, tant qu'il est commandé correctement. En clair, il suffit d'ajouter un ou plusieurs multiplexeurs pour chaque décaleur élémentaire par 1, 2, 4, etc. Ces multiplexeurs choisissent quoi envoyer sur l'entrée de l'ancienne couche : soit un 0 (décalage logique), soit le bit de poids faible (rotation). Notons qu'on doit utiliser un multiplexeur par entrée, contrairement au décaleur complet. La raison est qu'un décalage arithmétique envoie toujours le même bit dans les entrées de poids fort, alors qu'une rotation envoie un bit différent sur chaque entrée de poids fort, ce qui demande un multiplexeur par entrée. [[File:Décaleur-rotateur par 4.png|centre|vignette|upright=2|Décaleur-rotateur par 4.]] Il est possible d'étendre le décaleur logique pour lui permettre de faire des décalages arithmétiques. Pour cela, même recette que dans le cas précédent. Encore une fois, suivant le type de décalage, on doit envoyer soit un zéro, soit le bit de poids fort sur certaines entrées. Il est possible d'utiliser un seul multiplexeur dans ce cas précis, car on envoie le même bit sur les entrées de poids fort. [[File:Exemple avec un décaleur par 4.png|centre|vignette|upright=2|Exemple avec un décaleur par 4.]] En combinant des décaleurs basiques par 4, 2 et 1 bits, on obtient un circuit qui fait tous les types de décalages. Pas étonnant que ce circuit soit nommé un '''décaleur complet'''. Notons qu'on peut se contenter d'un seul mutiplexeur pour tout le ''barrel shifter'', en utilisant le câblage astucieusement. Après tout, le choix entre 0 ou bit de poids fort est le même pour toutes les entrées concernées. Autant ne le faire qu'une seule fois et connecter toutes les entrées concernées au multiplexeur. [[File:Décaleur complet 8 bits.png|centre|vignette|upright=2|Décaleur complet 8 bits]] En utilisant les deux modifications en même temps, on se retrouve avec un ''barrel-shifter'' complet, capable de faire des décalages et rotations sur 4 bits. [[File:Circuit de rotation partiel.png|centre|vignette|upright=2|Circuit de rotation partiel.]] ===Les ''mask barrel shifters''=== Les ''mask barrel shifters'' sont des décaleurs-rotateurs basés autour d'un rotateur, qui est modifié afin de supporter les décalages logiques/arithmétiques. L'idée est de faire une rotation et de corriger le résultat si c'est un décalage qui est demandé. La correction à effectuer dépend du type de décalage demandé, suivant qu'il soit logique ou arithmétique. Pour un décalage logique, il suffit de mettre les n bits de poids fort à zéro pour un décalage de n bits vers la droite (inversement, les n bits de poids faible pour un décalage vers la gauche). Et pour mettre des bits de poids fort à zéro sous une certaine condition, on doit utiliser un masque qui est calculé par un circuit dédié. Le circuit de calcul du masque est un encodeur modifié, qu'on peut concevoir avec les techniques des chapitres précédents. Le circuit qui combine le masque avec le résultat de la rotation est composé d'une couche de portes ET et d'une couche de multiplexeurs. La couche de portes ET applique le masque sur le résultat du rotateur. Les multiplexeurs choisissent entre le résultat du rotateur et le résultat avec masque appliqué. Les multiplexeurs sont commandés par un bit de commande qui indique s'il faut faire un décalage ou une rotation. [[File:Décaleur-rotateur basé sur un masque.png|centre|vignette|upright=1.5|Décaleur-rotateur basé sur un masque.]] ==Les ''barrel shifters'' bidirectionnels (à double sens de décalage/rotation)== Le circuit précédent est capable d'effectuer des décalages et rotations, mais seulement vers la droite. On peut évidemment concevoir un circuit similaire capable de faire des décalages/rotations vers la gauche, mais il est intéressant d'essayer de créer un circuit capable de faire les deux. Un tel circuit est appelé un '''''barrel shifter'' bidirectionnel'''. Notons qu'on doit obligatoirement fournir un bit qui indique dans quelle direction faire le décalage. Précédemment, nous avons vu qu'il existe deux méthodes pour créer un ''barrel shifter''. La première se base sur un décaleur auquel on ajoute de quoi faire les rotations, alors que l'autre se base sur l'application d'un masque en sortie d'un rotateur. Dans ce qui va suivre, nous allons voir comment ces deux types de circuits peuvent être rendus bidirectionnels. [[File:Barrel shifter bidirectionnel - interface.png|centre|vignette|upright=2|Barrel shifter bidirectionnel - interface]] ===Les ''barrel shifters'' bidirectionnels basé sur des multiplexeurs=== Commençons par voir comment rendre bidirectionnel un ''barrel shifter'' basé sur des multiplexeurs. Pour rappel, ces derniers sont basés sur un décaleur qu'on rend capable de faire des rotations en ajoutant des multiplexeurs. Une première solution est d'utiliser des '''''barrel shifters'' bidirectionnels série''', série signifiant que les deux sens sont calculés en série, l'un après l'autre. Ils sont composés de décaleurs qui sont capables de faire des décalages/rotations vers la gauche et vers la droite. De tels décaleurs peuvent se concevoir de diverses façons, mais la plus simple se base sur le principe qui veut qu'un décaleur est composé de décaleurs de 1, 2, 4, 8 bits, etc. Chaque décaleur est en double : une version qui décale vers la gauche, et une autre qui décale vers la droite. Lors d'un décalage vers la droite, les décaleurs élémentaire à gauche sont désactivés alors que les décaleurs vers la droite sont actifs (et réciproquement lors d'un décalage à gauche). Le bit qui indique la direction du décalage est envoyé à chaque décaleur et lui indique s'il doit décaler ou non. [[File:Décaleur bidirectionnel.png|centre|vignette|upright=2|Décaleur bidirectionnel]] Une autre solution, bien plus simple, est de prendre un décaleur/rotateur vers la gauche et un autre vers la droite, et de prendre la sortie adéquate en fonction de l'opération demandée. Le choix du résultat se fait encore une fois avec une couche de multiplexeurs. Le résultat est ce qu'on appelle un '''''barrel shifter'' bidirectionnel parallèle''', parallèle signifiant que les deux sens sont calculés en parallèle, en même temps. Notons que cette solution ressemble beaucoup à la précédente. À vrai dire, si on prend la première solution et qu'on regroupe ensemble les décaleur/rotateurs allant dans la même direction, on retombe sur un circuit presque identique à un ''barrel shifter'' bidirectionnel parallèle. Les deux techniques précédentes utilisent beaucoup de portes logiques et il est possible de faire bien plus efficace. L'idée est simplement d'inverser l'ordre des bits avant de faire le décalage ou la rotation, puis de remettre le résultat dans l'ordre. Par exemple, pour faire un décalage à gauche, on inverse les bits du nombre à décaler, on fait un décalage à droite, puis on remet les bits dans l'ordre originel, et voilà ! Pour cela, il suffit de prendre un décaleur/rotateur à droite, et d'ajouter deux circuits qui inversent l'ordre des bits : un avant le décaleur/rotateur, un après. Ce circuit d'inversion est une simple couche de multiplexeurs. Le résultat est ce qu'on appelle un '''''barrel shifter'' bidirectionnel à inversion de bits'''. [[File:Barrel shifter à inversion de bits.png|centre|vignette|upright=1.5|Barrel shifter à inversion de bits.]] ===Le décaleur-rotateur bidirectionnel basé sur des masques=== Dans cette section, nous allons voir concevoir un rotateur bidirectionnel avec des masques. Pour cela, il faut juste créer un rotateur bidirectionnel et utiliser des masques pour obtenir des décalages. Pour créer le rotateur bidirectionnel, nous allons devoir étudier ce qui se passe quand on enchaine deux rotations successives. N'allons pas par quatre chemins : l'enchainement de deux rotations successives donne un résultat qui aurait pu être obtenu en ne faisant qu'une seule rotation. Par exemple, faire une rotation à droite par 5 rangs suivie d'une rotation à droite de 8 rangs est équivalent à faire une rotation à droite de 5+8 rangs, soit 13 rangs. Le résultat issu de la succession de deux rotations est identique à celui d'une ''rotation équivalente''. Et on peut calculer le nombre de rangs de la rotation équivalente à partir des rangs des deux rotations initiales. Pour cela, il suffit d'additionner les rangs en question. La logique est la même quand on enchaine des rotations à droite et à gauche. Il suffit de compter les rangs d'une rotation en les comptant positifs pour une rotation à droite et négatifs pour une rotation à gauche. Par exemple, une rotation de -5 rangs sera une rotation à gauche de 5 rangs, alors qu'une rotation de 10 rangs sera une rotation à droite de 10 rangs. On pourrait faire l'inverse, mais prenons cette convention pour l'explication qui suit. Toujours est-il qu'avec cette convention, l'addition des rangs donne le bon résultat pour la rotation équivalente. Par exemple, si je fais une rotation à droite de 15 rangs et une rotation à gauche de 6 rangs, le résultat sera une rotation de 15-6 rangs : c'est équivalent à une rotation à droite de 9 rangs. Faisons dès maintenant remarquer quelque chose d'important. Prenons un nombre de n bits. Avec un peu de logique et quelques expériences, on remarque facilement qu'une rotation par <math>n</math> ne fait rien, dans le sens où les bits reviennent à leur place initiale. Une rotation par <math>n</math> est donc égale à pas de rotation du tout, ce qui est équivalent à faire une rotation par zéro rangs. Pour le moment, ce détail nous permet de gérer le cas où l'addition de deux rangs donne un résultat supérieur à <math>n</math>. Par exemple, prenons une rotation par 56 rangs pour un nombre de 9 bits. La division nous dit que 56 = 9*6 + 2. En clair, faire un décalage par 56 rangs est équivalent à faire 6 rotations totales par 9, suivie d'une rotation par 2 rangs. Les rotations par 9 ne comptant pas, cela revient en fait à faire une rotation par 2 rangs. Le même raisonnement fonctionne dans le cas général, et revient à faire ce qu'on appelle une '''addition modulo n'''. C'est à dire qu'une fois le résultat de l'addition connu, on le divise par <math>n</math> et l'on garde le reste de la division. Avec cette méthode, le nombre de rangs de la rotation équivalente est compris entre 0 et <math>n-1</math>. : ''Les additions modulo n seront notées comme suit : <math>(a+b)\mod n</math>.'' Armé de ces explications, on peut maintenant expliquer comment fonctionne le rotateur bidirectionnel. L'idée derrière ce circuit est de remplacer une rotation à droitepar une rotation à gauche équivalente (ou inversement, mais nous allons supposer que le rotateur fait des rotations vers la gauche). Dans ce qui suit, nous utiliserons la notation suivante : <math>r_\text{équivalent}</math> est le nombre de rangs de la rotation équivalente, <math>n</math> la taille du nombre à décaler et <math>r</math> le nombre de rangs du décalage initial. En soi, ce n'est pas compliqué de trouver une rotation équivalente : une rotation à droite de <math>r</math> rangs est équivalente à une rotation de <math>r + n</math> rangs, à une rotation de <math>r + 2 \times n</math> rangs, et de manière générale à toute rotation de <math>r + k \times n</math> rangs. La raison est que les rotations par n ne comptent pas, elles sont éliminées par la division par <math>n</math>. Pour résumer, on a : : <math>r_\text{équivalent} = (r \pm k \times n)\mod n</math> Ls propriétés des calculs modulo n font que cela marche aussi quand on retranche n. Les bizarreries de l'arithmétique modulaire font que, quand on fait les additions modulo n, on peut remplacer tout nombre positif r par <math>r \pm k \times n</math> sans changer les résultats. Mais tous les cas possibles ne nous intéressent pas. En effet, on sait que le nombre de rangs de la rotation équivalente est compris entre 0 et <math>n-1</math>. Le résultat que l'on recherche doit donc être compris entre 0 et <math>n-1</math>. Et seul un cas respecte cette contrainte : celui où l'on retranche n une seule fois. On a alors : : <math>r_\text{équivalent} = r - n</math> L'équation nous dit qu'il est possible de remplacer une rotation à droite par une rotation à gauche équivalente. Par exemple, sur 8 bits et pour une rotation à droite de 6 bits, on a <math>r_\text{équivalent} = 6 - 8 = -2</math>. En clair, la rotation équivalente est ici une rotation à gauche de 2 crans. Vous pouvez essayer avec d'autres exemples, vous trouverez la même chose. Par exemple, sur 16 bits, une rotation à gauche de 3 rangs est équivalente à une rotation à droite de 13 rangs. Le calcul ci-dessus peut être simplifié en utilisant quelques astuces. Sur la plupart des ordinateurs, n est égal à 8, 16, 32, 64, ou toute autre nombre de la forme <math>2^n</math>. Les cas où n vaut 3, 7, 14 ou autres sont tellement rares que l'on peut les considérer comme anecdotiques. De plus, <math>r</math> est compris entre 0 et <math>n-1</math>. On peut donc coder le rang sur un nombre bien précis de bits, tel que n est la valeur haute de débordement (en clair, n-1 est la plus grande valeur codable, n entraine un débordement d'entier). Grâce à cela, on peut coder le nombre de rangs en complément à un ou en complément à deux. Rappelons que ces deux représentations des nombres utilisent l'arithmétique modulaire, c'est à dire que l'addition et la soustraction se font modulo n, et que leur principe est de représenter tout n négatif par un n positif équivalent. Ainsi, tout <math>r_\text{équivalent}</math> négatif est codé par un <math>r</math> positif équivalent. Et dans ces représentations, on a obligatoirement <math>r - n = - r</math>. En appliquant cette formule dans l'équation précédente, on a : : <math>r_\text{équivalent} = - r</math> Reprenons l'exemple d'une rotation à gauche de 2 crans pour un nombre de 8 bits, ce qui est équivalent à une rotation de 6 crans à droite: on a bien 6 = -2 en complément à deux. Reste à faire le calcul ci-dessus par le circuit de rotation. En complément à un, le calcul de l'opposé d'un nombre consiste simplement à inverser les bits de <math>r_\text{initial}</math>. En conséquence, le circuit est plus simple en complément à un. Le calcul du nombre de rangs demande juste un inverseur commandable, qu'on sait fabriquer depuis quelques chapitres. [[File:Rotateur bidirectionnel en complèment à un.png|centre|vignette|upright=2|Rotateur bidirectionnel en complément à un.]] En complément à deux, le calcul est le suivant : : <math>r_\text{équivalent} = \overline{r_\text{initial}} + 1</math> On pourrait utiliser un circuit pour faire l'addition, mais il y a une autre manière plus simple de faire. L'idée est simplement de prendre le circuit en complément à un et d'y ajouter de quoi corriger le résultat final. En clair, on fait le calcul comme en complément à un, mais la rotation effectuée ne sera pas équivalente, du fait du +1 dans le calcul. Ce +1 indique simplement qu'il faut décaler le résultat obtenu d'un cran supplémentaire. Pour cela, on ajoute un rotateur d'un cran à la fin du circuit. [[File:Rotateur bidirectionnel en complément à deux.png|centre|vignette|upright=2|Rotateur bidirectionnel en complément à deux.]] On peut transformer ce circuit en décaleur-rotateur en appliquant la méthode vue plus haut, à savoir en appliquant un masque en sortie du rotateur. Le circuit obtenu est le suivant : [[File:Décaleur rotateur bidirectionnel basé sur un masque.png|centre|vignette|upright=2|Décaleur rotateur bidirectionnel basé sur un masque.]] ==Le ''barrel shifter'' de l'Intel 386== Le ''barrel shifter'' de l'Intel 386 est différent des ''barrel shifter'' vus précédemment. Il gère nativement décalages, rotations, et quelques autres opérations. Il a pour particularité de faire toutes ses opérations à partir de décalages à droite. Et pour que cela fonctionne, il manipule ses opérandes d'une manière assez inédite. Pour comprendre pourquoi, précisons que l'Intel 386 est le tout premier processeur 32 bits d'Intel. Intuitivement, on se dirait que son ''barrel shifter'' prend un opérande de 32 bits, et fournit une sortie de 32 bits. Mais la réalité est qu'il prend un opérande de 64 bits, répartie dans deux registres de 32 bits chacun. Le ''barrel shifter'' est de 64 bits. La sortie du circuit correspond aux 32 bits de poids faible du résultat du décalage. {|class="wikitable" |- ! Registre 32 bits !! Registre 32 bits |- | colspan="2" | ''Barrel Shifter'' hybride 64 - 32 bits |- ! colspan="2" | Sortie 32 bits |} Ce décaleur hybride 64-32 bits était composé de deux sous-circuits placés en série. Le premier décale le résultat par paquets de 4 rangs, à savoir de 0, 4, 8, 12, 16, 20, 24 ou 28 rangs. Le second décale le résultat du premier de 0, 1, 2 ou 3 rangs. Faire ainsi économise des transistors comparé à un ''barrel shifter'' usuel, du moins pour un ''barrel shifter'' hybride 64-32 bits. Et malgré cela, le ''barrel shifter'' faisait environ 2000 transistors, ce qui était énorme pour l'époque. Pour comparer, le processeur 6502 de Motorola tout entier faisait le double. Pour un décalage à droite logique, le décalage se fait normalement. Les 32 bits de poids fort sont remplis par des zéros, les 32 bits de poids faible sont remplis avec l'opérande à décaler. Les décalages arithmétiques se font d'une manière similaire, la seule différence étant que les 32 bits de poids fort sont remplis avec le bit de signe. Pour un décalage à gauche, la situation est inversée. L'opérande est placé dans les 32 bits de poids fort, alors que les zéros sont dans les 32 bits de poids fort. Le ''barrel shifter'' fait un décalage à droite, qui émule le décalage à gauche. Pour un décalage à gauche de N rangs, il est émulé par un décalage à droite de 32 − N rangs. Pour les rotations, les 32 bits de poids fort sont remplis avec l'opérande, idem avec les bits de poids faible. Les rotations à droite se font avec un simple décalage à droite, les rotations à gauche se font avec le même décalage mais le nombre de rangs est altéré de la même manière qu'avec les décalages à droite. {|class="wikitable" |- ! ! 32 bits de poids fort !! 32 bits de poids faible ! Nombre de rangs du décalage |- ! Décalage à droite logique (N rangs) | 0 || Opérande | N |- ! Décalage à droite arithmétique (N rangs) | Bit de signe x32 || Opérande | N |- ! Décalage à gauche (N rangs) | Opérande || 0 | 32 - N |- ! Rotation à droite (N rangs) | Opérande || Opérande | N |- ! Rotation à gauche (N rangs) | Opérande || Opérande | 32 − N |} L'avantage d'un tel circuit est qu'il facilite l'implémentation de certaines opérations qu'on n'a pas encore abordées, comme des rotations avec retenue, ou l'opération ''Bit Test''. Le processeur gérait aussi nativement des décalages sur 64 bits, deux instructions étaient prévues pour. Ce n'était pas très utile pour un processeur 32 bits, mais l'implémentation était aisée, alors pourquoi pas ? <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les compteurs à rétroaction | prevText=Les compteurs à rétroaction | next=Les circuits pour l'addition et la soustraction | nextText=Les circuits pour l'addition et la soustraction }} </noinclude> bn93fvz1wto3s4sqydbkpudifrbl5cy 768130 768071 2026-06-19T01:06:51Z Mewtow 31375 /* Le barrel shifter de l'Intel 386 */ 768130 wikitext text/x-wiki Dans ce chapitre, nous allons voir des opérations appelées les décalages et les rotations. Nous allons voir ce que sont ces opérations, puis les nombreux circuits qui permettent d'implémenter ces opérations. Mais expliquons d'abord les différentes opérations de décalage et de rotation. ==Les opérations de décalage== Les ''décalages'' décalent un nombre de un ou plusieurs rangs vers la gauche, ou la droite. Il existe plusieurs opérations de décalage différentes et on peut les classer en plusieurs types. Dans les grandes lignes, on distingue les rotations, les décalages logiques et les décalages arithmétiques. Elles se distinguent sur plusieurs points, les principaux étant les suivants : * ce qu'on fait des bits qui sortent du nombre lors du décalage ; * comment on remplit les vides qui apparaissent lors du décalage ; * la manière dont est géré le signe du nombre décalé. [[File:Décalages, gestion des bits entrants et sortants.png|vignette|Décalages, gestion des bits entrants et sortants]] Pour comprendre les deux premiers points, prenons l'exemple ci-contre. L'exemple montre le décalage de deux rangs vers la droite, d'un opérande de 8 bits valant 01011101. On obtient 010111 : les deux bits de poids forts sont vides et les deux bits de poids faible (01) sortent du nombre. Et cela vaut pour tout décalage : d'un côté le décalage fait sortir des bits du nombre, de l'autre certains bits sont inconnus ce qui laisse des vides dans le nombre. Si on décale de n rangs, alors cela laissera n vides et fera sortir n bits. Ces deux points, la gestion des vides et des bits sortants, sont assez liés. ===Le différents types de décalages=== Au-delà de la distinction assez intuitive entre les décalages vers la gauche et vers la droite, parlons de ce qu'on fait des bits qui sortent du nombre lors du décalage. Que fait-on de ces bits ? La première solution est de les faire rentrer de l'autre côté, de les remettre au début du nombre décalé. L'opération en question est alors appelée une '''rotation'''. Il existe des rotations à droite et à gauche. {| |MSB : bit de poids fort (Most Significant Bit) LSB : bit de poids faible (Least Significant Bit) | |[[File:Rotate left.svg|vignette|Rotation à gauche.]] |[[File:Rotate right.svg|vignette|Rotation à droite.]] |} L'autre solution est d'oublier les bits sortants. L’opération est alors appelée un '''décalage''', qui peut être soit un décalage logique, soit un décalage arithmétique. Le fait que l'on oublie les bits sortants fait que les vides ne sont pas remplis et qu'il faut trouver de quoi les combler. Et c'est là qu'on peut faire la distinction entre décalages logiques et arithmétiques. Avec un '''décalage logique''', les vides sont remplis par des zéros, aussi bien pour un décalage à gauche et un décalage à droite. {| |[[File:Rotate left logically.svg|vignette|Décalage logique à gauche.]] |[[File:Rotate right logically.svg|vignette|Décalage logique à droite.]] |} [[File:Shift Arithmetic Right.svg|vignette|Décalage arithmétique à droite.]] Avec un '''décalage arithmétique''', la situation est différente pour un décalage à gauche et à droite. Le principe des décalages arithmétique est qu'ils conservent le bit de signe de l'opérande décalé (qui est supposé être signé), contrairement aux autres décalages. Pour un décalage à droite, les vides dans les vides de poids forts sont remplis par le bit de signe. Ce remplissage est une sorte d'extension de signe, ce qui fait que la conservation du signe est automatique. [[File:Shift Left and Shift Arithmetic Left.svg|vignette|Décalage arithmétique à gauche qui ne conserve pas le bit de signe.]] Pour un décalage à gauche, les vides sont remplis par des zéros, comme pour un décalage logique. Mais pour ce qui est de la conservation du bit de signe, c'est plus compliqué. On a deux écoles : la première ne conserve pas le bit de signe, la seconde le fait. Dans le premier cas, le décalage est identique à un décalage logique à gauche. Dans le second cas, le bit de signe n'est pas concerné par le décalage et il se produit une forme particulière de débordement d'entier. L'utilité principale des opérations de décalage est qu'elles permettent de faire simplement des multiplications ou divisions par une puissance de 2. Un décalage logique/arithmétique correspond à une multiplication ou division entière par 2^n : multiplication pour les décalages à gauche, division pour les décalages à droite. Les décalages logiques fonctionnent seulement pour les entiers non signés, alors que les décalages arithmétiques fonctionnent sur les entiers signés. Le fait est qu'un décalage logique ne préserve pas le bit de signe. [[File:Modulo et quotient d'une division par une puissance de deux en binaire.png|centre|vignette|upright=2.5|Modulo et quotient d'une division par une puissance de deux en binaire]] ===Les arrondis lors des décalages=== Les décalages à droite entraînent l'apparition d{{'}}''arrondis''. Lorsqu'on effectue un décalage à droite, les bits qui sortent du résultat sont perdus. L’équivalent en décimal est que les chiffres après la virgule sont perdus, ce qui arrondit le résultat. Mais cet arrondi dépend de la représentation des nombres utilisé. Pour comprendre pourquoi, il faut faire un rapide rappel sur les types d'arrondis en décimal. En décimal, on peut arrondir de deux manières : soit on arrondit à l'entier au-dessus, soit on arrondi à l'entier au-dessous. Par exemple, prenons la division 29/4, qui a pour résultat 7.25. Cela donne 7 dans le premier cas et 8 dans le second. Pour un résultat négatif, c'est la même chose, mais le fait que le signe soit inversé change la donne. Par exemple, prenons le résultat de -29 / 4, soit -7.25. On peut l'arrondir soit à -7, soit à -8. En combinant les deux cas négatifs avec les deux cas positifs, on se trouve face à quatre possibilités : * l'arrondi vers la plus basse valeur absolue (vers zéro), qui donne respectivement 7 et -7 dans l'exemple précédent. * l'arrondi vers la plus basse valeur (vers moins l'infini), qui donne -8 et 7 dans l'exemple précédent ; * l'arrondi vers la plus haute valeur (vers plus l'infini), qui donne -7 et 8 dans l'exemple précédent ; * l'arrondi vers la plus haute valeur absolue (vers l'infini), qui donne 8 et -8 dans l'exemple précédent. En binaire, c'est la même chose. Par exemple, 11100,1010 peut s'arrondir en 11100 ou en 11101, suivant qu'on arrondisse vers le bas ou vers le haut, et la même chose est possible pour les nombres négatifs. Vu que les bits sortants sont simplement éliminés, on pourrait croire que cela correspond à un arrondi vers zéro (vers la valeur inférieure). C'est bien le cas pour les décalages logiques, peu importe la représentation, l'arrondi se fait vers zéro (vu que tous les nombres sont traités comme positifs). Mais pour les décalages arithmétiques, tout dépend de la représentation binaire utilisée. L'arrondi se fait bien vers zéro en complément à 1, mais pas en complément à deux, où l'arrondi se fait à la valeur inférieure, vers moins l'infini. Précisons que ces arrondis n'ont lieu que si le résultat du décalage n'est pas exact. Pour un décalage d'un rang, à savoir une division par deux, seuls les nombres impairs donnent un arrondi, pas les nombres pairs. De manière générale, pour un décalage de n rangs, les nombres divisibles par 2^n ne donnent pas d'arrondi, alors que les autres si. ===Les débordements d'entiers lors des décalages=== Les décalages peuvent aussi causer des ''débordements d'entier''. Pour rappel un débordement d'entier est une situation où le résultat d'un calcul devient trop gros pour être codé. Pour donner un exemple, prenons une situation équivalente mais en décimal. Par exemple supposons que l'ordinateur sur lequel vous travailler manipule des données codées sur 5 chiffres décimaux, pas plus. Si on prend le nombre 4512, le décalage à gauche d'un cran donne 45120, qui tient sur 5 chiffres : on n'a pas de débordement. Mais si je prends le nombre 97426, un décalage à gauche d'un cran donne 974260, ce qui ne tient pas dans 5 chiffres : on a un débordement d’entier. Celui-ci se traduit par le fait qu'un chiffre non-nul sorte du nombre. La même chose a lieu en binaire, avec les décalages à gauche : si au moins un bit non-nul sorte à gauche, c'est un débordement d'entier. La manière habituelle de gérer les débordements d'entiers est simplement de ne rien faire, mais de prévenir qu'un débordement a eu lieu. Pour cela, le circuit qui effectue le décalage a une sortie qui indique qu'un débordement a eu lieu lors du décalage. Cette sortie fournit un simple bit qui vaut 1 en cas de débordement et 0 sinon (ou l'inverse). Une autre solution est de corriger le débordement, mais elle est utilisée uniquement pour les opérations arithmétiques, pas pour les décalages. Toujours est-il que déterminer l’occurrence d'un débordement n'est pas compliqué. Pour les décalages logiques, il suffit de prendre les bits sortants et de vérifier qu'un au moins d'entre eux vaut 1. Une simple porte OU sur les bits sortants fait l'affaire. Pour les décalages arithmétiques, il faut aussi tenir compte de la présence du bit de signe. Si le nombre décalé est positif, seuls des zéros doivent sortir, la présence d'un 1 indiquant un débordement d'entier. Pour un nombre négatif, c'est l'inverse : seuls des 1 doivent sortir (du fait des règles d'extension de signe), alors que l’occurrence d'un zéro trahit un débordement d'entier. Pour résumer le tout, les bits sortants sont censés être égaux au bit de signe, un débordement a eu lieu dans le cas contraire. L’occurrence d'un débordement se détermine en décomposant le décalage en une succession de décalages de 1 bit. Si un seul de ces décalages de 1 rang altère le bit de signe (change sa valeur), alors on a un débordement. Il est possible de déterminer l’occurrence d'un débordement en analysant l'opérande, sans même avoir à faire le décalage. Pour un décalage vers la gauche de <math>n</math> rangs, on sait que les bits sortants sont les <math>n</math> bits de poids fort de l'opérande. En clair, on peut déterminer si un débordement a lieu en sélectionnant seulement les <math>n</math> bits de poids fort de l'opérande. Pour cela, on peut simplement prendre l'opérande et lui appliquer un masque adéquat. Par exemple, prenons le cas d'un débordement pour un décalage logique, qui a lieu si au moins un bit sortant est à 1. Il suffit de prendre l'opérande, conserver les <math>n</math> rangs bits de poids fort et mettre les autres à zéro, puis faire un ET entre les bits du résultat. La même logique prévaut pour les décalages arithmétiques, même s'il faut faire quelques adaptations. [[File:Calcul du bit de débordement pour un décalage à gauche de trois rangs.png|centre|vignette|upright=2|Calcul du bit de débordement pour un décalage à gauche de trois rangs.]] Toujours est-il que le calcul des débordements peut se faire en parallèle du décalage, ce qui est utile. Précisons que le masque se calcule dans un circuit à part, qui ressemble beaucoup à un encodeur. Le masque calculé peut être utilisé sur certains circuits de décalages, pour transformer des rotations en décalage logiques, par exemple. Mais nous verrons cela plus tard. ==Les décaleurs et rotateurs élémentaires== [[File:Décaleur - interface.png|vignette|Décaleur - interface]] Pour commencer, nous allons voir deux types de circuits : les '''décaleurs''' qui effectuent un décalage (logique ou arithmétique, peu importe) et les '''rotateurs''' qui effectuent une rotation. Les deux circuits sont conceptuellement séparés, même s’ils se ressemblent. Faire la distinction sera utile dans la suite du cours. Leur interface est la même pour tous les décaleurs et rotateurs élémentaires. On doit fournir l'opérande à décaler et le nombre de rangs qu'on veut décaler en entrée, et on récupère l'opérande décalé en sortie. Nous allons d'abord voir comment créer un décaleur. Pour cela, on peut faire une remarque simple : décaler de 6 rangs, c'est équivalent à décaler de 4 rangs et redécaler le tout de 2 rangs. Même chose pour 7 rangs : cela consiste à décaler de 4 rangs, redécaler de 2 rangs et enfin redécaler d'un rang. En suivant l'idée jusqu'au bout, on peut créer un décaleur à partir de décaleurs plus simples, reliés en cascade, qu'on active ou désactive suivant le nombre de rangs. Les décaleurs élémentaires décalent par 1, 2, 4, 8, etc ; bref : par une puissance de 2. La raison à cela est que le nombre de rangs par lequel on va devoir décaler est un nombre codé en binaire, qui s'écrit donc sous la forme d'une somme de puissances de deux. Le énième bit du nombre de rang servira à actionner le décaleur par 2^n. [[File:Décaleur logique - principe.png|centre|vignette|upright=2|Décaleur logique - principe]] La même logique s'applique pour les rotateurs, la seule différence étant qu'il faut remplacer les décaleurs par 1, 2, 4, 8, etc ; par des rotateurs par 1, 2, 4, 8, etc. Reste à savoir comment créer ces décaleurs qu'on peut activer ou désactiver à la demande. Surtout que le circuit n'est pas le même selon que l'on parle d'un décalage logique, d'un décalage arithmétique ou d'une rotation. Néanmoins, tous les circuits de décalage/rotation sont fabriqués avec des multiplexeurs à deux entrées et une sortie. ===Le circuit décaleur logique=== Commençons par étudier le cas du décalage logique par 4 rangs à droite. La sortie vaudra soit le nombre tel qu'il est passé en entrée (le décaleur est inactif), soit le nombre décalé de 4 rangs. Ainsi, si je prends un nombre A, composé des bits a7, a6, a5, a4, a3, a2, a1, a0 ; (cités dans l'ordre), le résultat sera : * soit le nombre composé des chiffres a7, a6, a5, a4, a3, a2, a1, a0 (on n'effectue pas de décalage) ; * soit le nombre composé des chiffres 0, 0, 0, 0, a7, a6, a5, a4 (on effectue un décalage par 4). Chaque bit de sortie peut prendre deux valeurs, qui valent soit zéro, soit un bit du nombre d'entrée. On peut donc utiliser un multiplexeur pour choisir quel bit envoyer sur la sortie. Par exemple, pour le choix du bit de poids fort du résultat, celui-ci vaut soit a7, soit 0 : il suffit d’utiliser un multiplexeur prenant le bit a7 sur son entrée 1, et un 0 sur son entrée 0. [[File:Décaleur par 4.png|centre|vignette|upright=2|Exemple d'un décaleur par 4.]] Le tout peut être adapté pour créer des décaleurs par 1, par 2, par 8, etc. Il suffit de faire la même chose pour tous les autres bits, et le tour est joué. En utilisant des décaleurs basiques par 4, 2 et 1 bit, on obtient le circuit suivant : [[File:Décaleur logique 8 bits.png|centre|vignette|upright=2|Décaleur logique 8 bits.]] ===Le circuit décaleur arithmétique=== Les décalages arithmétiques sont basés sur le même principe, à une différence près : on n'envoie pas un zéro dans les bits de poids fort, mais le bit de signe (le bit de poids fort du nombre d'entrée). Un décaleur arithmétique ressemble beaucoup à un décaleur logique, la seule différence étant que c'est le bit de poids fort qui est relié aux entrées des multiplexeurs, là où c'était le zéro avec le décaleur logique. Par exemple, reprenons un nombre A, composé des bits a7, a6, a5, a4, a3, a2, a1, a0 ; (cités dans l'ordre). La sortie d'un décaleur arithmétique par 4 sera : * soit le nombre composé des chiffres a7, a6, a5, a4, a3, a2, a1, a0 (on n'effectue pas de décalage) ; * soit le nombre composé des chiffres a7, a7, a7, a7, a7, a6, a5, a4 (on effectue un décalage arithmétique par 4). [[File:Décaleur arithmétique par 4.png|centre|vignette|upright=2|Exemple d'un décaleur arithmétique par 4]] En combinant des décaleurs basiques par 4, 2 et 1 bits, on obtient le circuit suivant : [[File:Décaleur arithmétique 8 bits.png|centre|vignette|upright=2|Décaleur arithmétique 8 bits]] ===Le circuit rotateur=== Les rotations sont elles aussi basées sur le même principe, sauf que ce sont les bits de poids faible qu'on injecte dans les bits de poids forts, au lieu d'un zéro ou du bit de signe. Le circuit est donc le même, sauf que les connexions ne sont pas identiques. Là où il y avait un zéro sur les entrées des multiplexeurs, on doit envoyer le bon bit de poids faible. Par exemple, reprenons un nombre A, composé des bits a7, a6, a5, a4, a3, a2, a1, a0 ; (cités dans l'ordre). La sortie d'un rotateur arithmétique par 4 sera : * soit le nombre composé des chiffres a7, a6, a5, a4, a3, a2, a1, a0 (on n'effectue pas de décalage) ; * soit le nombre composé des chiffres a3, a2, a1, a0, a7, a6, a5, a4 (on effectue un décalage arithmétique par 4). ==Les ''barell shifters'' unidirectionnels== [[File:Barrel shifter - interface.png|vignette|Barrel shifter - interface]] Dans ce qui précède, on a appris à créer un circuit qui fait des décalages logiques, un autre pour les décalages arithmétiques et un autre pour les rotations. Il nous reste à voir les '''décaleurs-rotateurs''', aussi appelés des '''''barrel shifters''''', qui sont capables de faire à la fois des décalages et des rotations. Certains décaleur-rotateurs sont capables de faire des rotations et des décalages logiques, d'autres savent aussi réaliser les décalages arithmétiques en plus. Un tel circuit a la même interface qu'un décaleur, sauf qu'on rajoute une entrée qui précise quelle opération faire. Cette entrée indique s'il faut faire un décalage logique, un décalage arithmétique ou une rotation. Précisons dès maintenant qu'il faut faire la différence entre un ''barrel shifter'' unidirectionnel et un ''barrel shifter'' bidirectionnel. La différence entre les deux tient dans le sens possible des décalages. Le ''barrel shifter'' unidirectionnel ne peut faire que des décalages à gauche ou que des décalages à droite, mais pas les deux. À l'inverse, un ''barrel shifter'' bidirectionnel peut faire des décalages à droite et à gauche, suivant ce qu'on lui demande. Dans cette section, nous allons nous concentrer sur les ''barrel shifters'' unidirectionnels, qui font des décalages/rotations vers la droite. Les explications seront valides aussi pour des décalages/rotations à gauche, avec quelques petites modifications triviales. Il existe trois grandes méthodes pour fabriquer un décaleur-rotateur. * La manière la plus naïve est de prendre un décaleur logique, un décaleur arithmétique et un rotateur, et de prendre le résultat adéquat suivant l’opération voulue. Le choix du bon résultat est effectué par une couche de multiplexeur adaptée. Mais cette solution est inutilement gourmande en multiplexeurs. Après tout, les trois circuits se ressemblent et partagent une même structure. * Une autre solution, bien plus économe en multiplexeurs, élimine ces redondances en fusionnant les trois circuits en un seul. Elle part d'un circuit qui effectue des décalages logiques, auquel on ajoute des multiplexeurs pour le rendre capable de faire aussi les décalages arithmétiques et les rotations. * La dernière méthode part d'un rotateur et on lui ajoute de quoi faire des décalages logiques. ===Le décaleur-rotateur à base de multiplexeurs=== Avec la seconde méthode, on part d'un circuit qui effectue des décalages logiques, auquel on ajoute des multiplexeurs pour le rendre capable de faire aussi les décalages arithmétiques et les rotations. Ces nouveaux multiplexeurs ne font que choisir les bits à envoyer sur les entrées des décaleurs. Par exemple, prenons un décalage/rotation par 4 crans. La seule différence entre décalage logique, arithmétique et rotation est ce qu'on met sur les 4 bits de poids fort : un 0 pour un décalage logique, le bit de poids fort pour un décalage arithmétique et les 4 bits de poids faible pour une rotation. Pour choisir entre ces trois valeurs, il suffit de rajouter des multiplexeurs. Nous allons d'abord ajouter des multiplexeurs pour prendre en charge les rotations, un peu de la même manière qu'on modifie un décaleur logique pour lui faire faire aussi des décalages arithmétiques. Pour cela, prenons un décaleur par 4 et étudions les 4 bits de poids fort. Suivant le type de décalage, on doit envoyer soit un zéro, soit le bit de poids faible adéquat sur certaines entrées. Ce choix peut être réalisé par un multiplexeur, tant qu'il est commandé correctement. En clair, il suffit d'ajouter un ou plusieurs multiplexeurs pour chaque décaleur élémentaire par 1, 2, 4, etc. Ces multiplexeurs choisissent quoi envoyer sur l'entrée de l'ancienne couche : soit un 0 (décalage logique), soit le bit de poids faible (rotation). Notons qu'on doit utiliser un multiplexeur par entrée, contrairement au décaleur complet. La raison est qu'un décalage arithmétique envoie toujours le même bit dans les entrées de poids fort, alors qu'une rotation envoie un bit différent sur chaque entrée de poids fort, ce qui demande un multiplexeur par entrée. [[File:Décaleur-rotateur par 4.png|centre|vignette|upright=2|Décaleur-rotateur par 4.]] Il est possible d'étendre le décaleur logique pour lui permettre de faire des décalages arithmétiques. Pour cela, même recette que dans le cas précédent. Encore une fois, suivant le type de décalage, on doit envoyer soit un zéro, soit le bit de poids fort sur certaines entrées. Il est possible d'utiliser un seul multiplexeur dans ce cas précis, car on envoie le même bit sur les entrées de poids fort. [[File:Exemple avec un décaleur par 4.png|centre|vignette|upright=2|Exemple avec un décaleur par 4.]] En combinant des décaleurs basiques par 4, 2 et 1 bits, on obtient un circuit qui fait tous les types de décalages. Pas étonnant que ce circuit soit nommé un '''décaleur complet'''. Notons qu'on peut se contenter d'un seul mutiplexeur pour tout le ''barrel shifter'', en utilisant le câblage astucieusement. Après tout, le choix entre 0 ou bit de poids fort est le même pour toutes les entrées concernées. Autant ne le faire qu'une seule fois et connecter toutes les entrées concernées au multiplexeur. [[File:Décaleur complet 8 bits.png|centre|vignette|upright=2|Décaleur complet 8 bits]] En utilisant les deux modifications en même temps, on se retrouve avec un ''barrel-shifter'' complet, capable de faire des décalages et rotations sur 4 bits. [[File:Circuit de rotation partiel.png|centre|vignette|upright=2|Circuit de rotation partiel.]] ===Les ''mask barrel shifters''=== Les ''mask barrel shifters'' sont des décaleurs-rotateurs basés autour d'un rotateur, qui est modifié afin de supporter les décalages logiques/arithmétiques. L'idée est de faire une rotation et de corriger le résultat si c'est un décalage qui est demandé. La correction à effectuer dépend du type de décalage demandé, suivant qu'il soit logique ou arithmétique. Pour un décalage logique, il suffit de mettre les n bits de poids fort à zéro pour un décalage de n bits vers la droite (inversement, les n bits de poids faible pour un décalage vers la gauche). Et pour mettre des bits de poids fort à zéro sous une certaine condition, on doit utiliser un masque qui est calculé par un circuit dédié. Le circuit de calcul du masque est un encodeur modifié, qu'on peut concevoir avec les techniques des chapitres précédents. Le circuit qui combine le masque avec le résultat de la rotation est composé d'une couche de portes ET et d'une couche de multiplexeurs. La couche de portes ET applique le masque sur le résultat du rotateur. Les multiplexeurs choisissent entre le résultat du rotateur et le résultat avec masque appliqué. Les multiplexeurs sont commandés par un bit de commande qui indique s'il faut faire un décalage ou une rotation. [[File:Décaleur-rotateur basé sur un masque.png|centre|vignette|upright=1.5|Décaleur-rotateur basé sur un masque.]] ==Les ''barrel shifters'' bidirectionnels (à double sens de décalage/rotation)== Le circuit précédent est capable d'effectuer des décalages et rotations, mais seulement vers la droite. On peut évidemment concevoir un circuit similaire capable de faire des décalages/rotations vers la gauche, mais il est intéressant d'essayer de créer un circuit capable de faire les deux. Un tel circuit est appelé un '''''barrel shifter'' bidirectionnel'''. Notons qu'on doit obligatoirement fournir un bit qui indique dans quelle direction faire le décalage. Précédemment, nous avons vu qu'il existe deux méthodes pour créer un ''barrel shifter''. La première se base sur un décaleur auquel on ajoute de quoi faire les rotations, alors que l'autre se base sur l'application d'un masque en sortie d'un rotateur. Dans ce qui va suivre, nous allons voir comment ces deux types de circuits peuvent être rendus bidirectionnels. [[File:Barrel shifter bidirectionnel - interface.png|centre|vignette|upright=2|Barrel shifter bidirectionnel - interface]] ===Les ''barrel shifters'' bidirectionnels basé sur des multiplexeurs=== Commençons par voir comment rendre bidirectionnel un ''barrel shifter'' basé sur des multiplexeurs. Pour rappel, ces derniers sont basés sur un décaleur qu'on rend capable de faire des rotations en ajoutant des multiplexeurs. Une première solution est d'utiliser des '''''barrel shifters'' bidirectionnels série''', série signifiant que les deux sens sont calculés en série, l'un après l'autre. Ils sont composés de décaleurs qui sont capables de faire des décalages/rotations vers la gauche et vers la droite. De tels décaleurs peuvent se concevoir de diverses façons, mais la plus simple se base sur le principe qui veut qu'un décaleur est composé de décaleurs de 1, 2, 4, 8 bits, etc. Chaque décaleur est en double : une version qui décale vers la gauche, et une autre qui décale vers la droite. Lors d'un décalage vers la droite, les décaleurs élémentaire à gauche sont désactivés alors que les décaleurs vers la droite sont actifs (et réciproquement lors d'un décalage à gauche). Le bit qui indique la direction du décalage est envoyé à chaque décaleur et lui indique s'il doit décaler ou non. [[File:Décaleur bidirectionnel.png|centre|vignette|upright=2|Décaleur bidirectionnel]] Une autre solution, bien plus simple, est de prendre un décaleur/rotateur vers la gauche et un autre vers la droite, et de prendre la sortie adéquate en fonction de l'opération demandée. Le choix du résultat se fait encore une fois avec une couche de multiplexeurs. Le résultat est ce qu'on appelle un '''''barrel shifter'' bidirectionnel parallèle''', parallèle signifiant que les deux sens sont calculés en parallèle, en même temps. Notons que cette solution ressemble beaucoup à la précédente. À vrai dire, si on prend la première solution et qu'on regroupe ensemble les décaleur/rotateurs allant dans la même direction, on retombe sur un circuit presque identique à un ''barrel shifter'' bidirectionnel parallèle. Les deux techniques précédentes utilisent beaucoup de portes logiques et il est possible de faire bien plus efficace. L'idée est simplement d'inverser l'ordre des bits avant de faire le décalage ou la rotation, puis de remettre le résultat dans l'ordre. Par exemple, pour faire un décalage à gauche, on inverse les bits du nombre à décaler, on fait un décalage à droite, puis on remet les bits dans l'ordre originel, et voilà ! Pour cela, il suffit de prendre un décaleur/rotateur à droite, et d'ajouter deux circuits qui inversent l'ordre des bits : un avant le décaleur/rotateur, un après. Ce circuit d'inversion est une simple couche de multiplexeurs. Le résultat est ce qu'on appelle un '''''barrel shifter'' bidirectionnel à inversion de bits'''. [[File:Barrel shifter à inversion de bits.png|centre|vignette|upright=1.5|Barrel shifter à inversion de bits.]] ===Le décaleur-rotateur bidirectionnel basé sur des masques=== Dans cette section, nous allons voir concevoir un rotateur bidirectionnel avec des masques. Pour cela, il faut juste créer un rotateur bidirectionnel et utiliser des masques pour obtenir des décalages. Pour créer le rotateur bidirectionnel, nous allons devoir étudier ce qui se passe quand on enchaine deux rotations successives. N'allons pas par quatre chemins : l'enchainement de deux rotations successives donne un résultat qui aurait pu être obtenu en ne faisant qu'une seule rotation. Par exemple, faire une rotation à droite par 5 rangs suivie d'une rotation à droite de 8 rangs est équivalent à faire une rotation à droite de 5+8 rangs, soit 13 rangs. Le résultat issu de la succession de deux rotations est identique à celui d'une ''rotation équivalente''. Et on peut calculer le nombre de rangs de la rotation équivalente à partir des rangs des deux rotations initiales. Pour cela, il suffit d'additionner les rangs en question. La logique est la même quand on enchaine des rotations à droite et à gauche. Il suffit de compter les rangs d'une rotation en les comptant positifs pour une rotation à droite et négatifs pour une rotation à gauche. Par exemple, une rotation de -5 rangs sera une rotation à gauche de 5 rangs, alors qu'une rotation de 10 rangs sera une rotation à droite de 10 rangs. On pourrait faire l'inverse, mais prenons cette convention pour l'explication qui suit. Toujours est-il qu'avec cette convention, l'addition des rangs donne le bon résultat pour la rotation équivalente. Par exemple, si je fais une rotation à droite de 15 rangs et une rotation à gauche de 6 rangs, le résultat sera une rotation de 15-6 rangs : c'est équivalent à une rotation à droite de 9 rangs. Faisons dès maintenant remarquer quelque chose d'important. Prenons un nombre de n bits. Avec un peu de logique et quelques expériences, on remarque facilement qu'une rotation par <math>n</math> ne fait rien, dans le sens où les bits reviennent à leur place initiale. Une rotation par <math>n</math> est donc égale à pas de rotation du tout, ce qui est équivalent à faire une rotation par zéro rangs. Pour le moment, ce détail nous permet de gérer le cas où l'addition de deux rangs donne un résultat supérieur à <math>n</math>. Par exemple, prenons une rotation par 56 rangs pour un nombre de 9 bits. La division nous dit que 56 = 9*6 + 2. En clair, faire un décalage par 56 rangs est équivalent à faire 6 rotations totales par 9, suivie d'une rotation par 2 rangs. Les rotations par 9 ne comptant pas, cela revient en fait à faire une rotation par 2 rangs. Le même raisonnement fonctionne dans le cas général, et revient à faire ce qu'on appelle une '''addition modulo n'''. C'est à dire qu'une fois le résultat de l'addition connu, on le divise par <math>n</math> et l'on garde le reste de la division. Avec cette méthode, le nombre de rangs de la rotation équivalente est compris entre 0 et <math>n-1</math>. : ''Les additions modulo n seront notées comme suit : <math>(a+b)\mod n</math>.'' Armé de ces explications, on peut maintenant expliquer comment fonctionne le rotateur bidirectionnel. L'idée derrière ce circuit est de remplacer une rotation à droitepar une rotation à gauche équivalente (ou inversement, mais nous allons supposer que le rotateur fait des rotations vers la gauche). Dans ce qui suit, nous utiliserons la notation suivante : <math>r_\text{équivalent}</math> est le nombre de rangs de la rotation équivalente, <math>n</math> la taille du nombre à décaler et <math>r</math> le nombre de rangs du décalage initial. En soi, ce n'est pas compliqué de trouver une rotation équivalente : une rotation à droite de <math>r</math> rangs est équivalente à une rotation de <math>r + n</math> rangs, à une rotation de <math>r + 2 \times n</math> rangs, et de manière générale à toute rotation de <math>r + k \times n</math> rangs. La raison est que les rotations par n ne comptent pas, elles sont éliminées par la division par <math>n</math>. Pour résumer, on a : : <math>r_\text{équivalent} = (r \pm k \times n)\mod n</math> Ls propriétés des calculs modulo n font que cela marche aussi quand on retranche n. Les bizarreries de l'arithmétique modulaire font que, quand on fait les additions modulo n, on peut remplacer tout nombre positif r par <math>r \pm k \times n</math> sans changer les résultats. Mais tous les cas possibles ne nous intéressent pas. En effet, on sait que le nombre de rangs de la rotation équivalente est compris entre 0 et <math>n-1</math>. Le résultat que l'on recherche doit donc être compris entre 0 et <math>n-1</math>. Et seul un cas respecte cette contrainte : celui où l'on retranche n une seule fois. On a alors : : <math>r_\text{équivalent} = r - n</math> L'équation nous dit qu'il est possible de remplacer une rotation à droite par une rotation à gauche équivalente. Par exemple, sur 8 bits et pour une rotation à droite de 6 bits, on a <math>r_\text{équivalent} = 6 - 8 = -2</math>. En clair, la rotation équivalente est ici une rotation à gauche de 2 crans. Vous pouvez essayer avec d'autres exemples, vous trouverez la même chose. Par exemple, sur 16 bits, une rotation à gauche de 3 rangs est équivalente à une rotation à droite de 13 rangs. Le calcul ci-dessus peut être simplifié en utilisant quelques astuces. Sur la plupart des ordinateurs, n est égal à 8, 16, 32, 64, ou toute autre nombre de la forme <math>2^n</math>. Les cas où n vaut 3, 7, 14 ou autres sont tellement rares que l'on peut les considérer comme anecdotiques. De plus, <math>r</math> est compris entre 0 et <math>n-1</math>. On peut donc coder le rang sur un nombre bien précis de bits, tel que n est la valeur haute de débordement (en clair, n-1 est la plus grande valeur codable, n entraine un débordement d'entier). Grâce à cela, on peut coder le nombre de rangs en complément à un ou en complément à deux. Rappelons que ces deux représentations des nombres utilisent l'arithmétique modulaire, c'est à dire que l'addition et la soustraction se font modulo n, et que leur principe est de représenter tout n négatif par un n positif équivalent. Ainsi, tout <math>r_\text{équivalent}</math> négatif est codé par un <math>r</math> positif équivalent. Et dans ces représentations, on a obligatoirement <math>r - n = - r</math>. En appliquant cette formule dans l'équation précédente, on a : : <math>r_\text{équivalent} = - r</math> Reprenons l'exemple d'une rotation à gauche de 2 crans pour un nombre de 8 bits, ce qui est équivalent à une rotation de 6 crans à droite: on a bien 6 = -2 en complément à deux. Reste à faire le calcul ci-dessus par le circuit de rotation. En complément à un, le calcul de l'opposé d'un nombre consiste simplement à inverser les bits de <math>r_\text{initial}</math>. En conséquence, le circuit est plus simple en complément à un. Le calcul du nombre de rangs demande juste un inverseur commandable, qu'on sait fabriquer depuis quelques chapitres. [[File:Rotateur bidirectionnel en complèment à un.png|centre|vignette|upright=2|Rotateur bidirectionnel en complément à un.]] En complément à deux, le calcul est le suivant : : <math>r_\text{équivalent} = \overline{r_\text{initial}} + 1</math> On pourrait utiliser un circuit pour faire l'addition, mais il y a une autre manière plus simple de faire. L'idée est simplement de prendre le circuit en complément à un et d'y ajouter de quoi corriger le résultat final. En clair, on fait le calcul comme en complément à un, mais la rotation effectuée ne sera pas équivalente, du fait du +1 dans le calcul. Ce +1 indique simplement qu'il faut décaler le résultat obtenu d'un cran supplémentaire. Pour cela, on ajoute un rotateur d'un cran à la fin du circuit. [[File:Rotateur bidirectionnel en complément à deux.png|centre|vignette|upright=2|Rotateur bidirectionnel en complément à deux.]] On peut transformer ce circuit en décaleur-rotateur en appliquant la méthode vue plus haut, à savoir en appliquant un masque en sortie du rotateur. Le circuit obtenu est le suivant : [[File:Décaleur rotateur bidirectionnel basé sur un masque.png|centre|vignette|upright=2|Décaleur rotateur bidirectionnel basé sur un masque.]] ==Le ''barrel shifter'' de l'Intel 386== Le ''barrel shifter'' de l'Intel 386 est différent des ''barrel shifter'' vus précédemment. Il gère nativement décalages, rotations, et quelques autres opérations. Il a pour particularité de faire toutes ses opérations à partir de décalages à droite. Et pour que cela fonctionne, il manipule ses opérandes d'une manière assez inédite. Pour comprendre pourquoi, précisons que l'Intel 386 est le tout premier processeur 32 bits d'Intel. Intuitivement, on se dirait que son ''barrel shifter'' prend un opérande de 32 bits, et fournit une sortie de 32 bits. Mais la réalité est qu'il prend un opérande de 64 bits, répartie dans deux registres de 32 bits chacun. Le ''barrel shifter'' est de 64 bits. La sortie du circuit correspond aux 32 bits de poids faible du résultat du décalage. {|class="wikitable" |- ! Registre 32 bits !! Registre 32 bits |- | colspan="2" | ''Barrel Shifter'' hybride 64 - 32 bits |- ! colspan="2" | Sortie 32 bits |} Ce décaleur hybride 64-32 bits était composé de deux sous-circuits placés en série. Le premier décale le résultat par paquets de 4 rangs, à savoir de 0, 4, 8, 12, 16, 20, 24 ou 28 rangs. Le second décale le résultat du premier de 0, 1, 2 ou 3 rangs. Faire ainsi économise des transistors comparé à un ''barrel shifter'' usuel, du moins pour un ''barrel shifter'' hybride 64-32 bits. Et malgré cela, le ''barrel shifter'' faisait environ 2000 transistors, ce qui était énorme pour l'époque. Pour comparer, le processeur 6502 de Motorola tout entier faisait le double. Pour un décalage à droite logique, le décalage se fait normalement. Les 32 bits de poids fort sont remplis par des zéros, les 32 bits de poids faible sont remplis avec l'opérande à décaler. Les décalages arithmétiques se font d'une manière similaire, la seule différence étant que les 32 bits de poids fort sont remplis avec le bit de signe. Pour un décalage à gauche, la situation est inversée. L'opérande est placé dans les 32 bits de poids fort, alors que les zéros sont dans les 32 bits de poids fort. Le ''barrel shifter'' fait un décalage à droite, qui émule le décalage à gauche. Pour un décalage à gauche de N rangs, il est émulé par un décalage à droite de 32 − N rangs. Pour les rotations, les 32 bits de poids fort sont remplis avec l'opérande, idem avec les bits de poids faible. Les rotations à droite se font avec un simple décalage à droite, les rotations à gauche se font avec le même décalage mais le nombre de rangs est altéré de la même manière qu'avec les décalages à droite. {|class="wikitable" |- ! ! 32 bits de poids fort !! 32 bits de poids faible ! Nombre de rangs du décalage |- ! Décalage à droite logique (N rangs) | 0 || Opérande | N |- ! Décalage à droite arithmétique (N rangs) | Bit de signe x32 || Opérande | N |- ! Décalage à gauche (N rangs) | Opérande || 0 | 32 - N |- ! Rotation à droite (N rangs) | Opérande || Opérande | N |- ! Rotation à gauche (N rangs) | Opérande || Opérande | 32 − N |} L'avantage d'un tel circuit est qu'il facilite l'implémentation de certaines opérations qu'on n'a pas encore abordées, comme des rotations avec retenue, ou l'opération ''Bit Test''. Le processeur gérait aussi nativement des décalages sur 64 bits, deux instructions étaient prévues pour. Ce n'était pas très utile pour un processeur 32 bits, mais l'implémentation était aisée, alors pourquoi pas ? <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres à décalage à rétroaction linéaire | prevText=Les registres à décalage à rétroaction linéaire | next=Les circuits pour l'addition et la soustraction | nextText=Les circuits pour l'addition et la soustraction }} </noinclude> 5jsk9jax1wrgj75zd8fje8g17ib2m4m Vocabulaire anglais-français à l'intention des apprenants avancés/G 0 78012 768163 767573 2026-06-19T06:50:32Z Elnon 41284 Compléments 768163 wikitext text/x-wiki {{../Index}} === G === * Ga. : abr. de Georgia, (la) Géorgie * gab (n) : papotage, bavardage, bavassage (péj.) - to have the gift of the gab : avoir du bagout, avoir de la faconde, avoir la langue bien pendue * gab (v) (intr.) : papoter, bavarder, bavasser * gabble (v) (intr.) : jacasser, bredouiller * gable (n) : (Arch.) pignon (d’une maison) - crow-stepped gable : pignon à redents, pignon à pas de moineau * gad about (v) (intr.) (fam.) : se balader, vadrouiller * gadget (n) : gadget * gadget-laden (ac) : plein(e) de gadgets, fourmillant de gadgets - gadget-laden car : voiture (f) fourmillant de gadgets * gadgetry (n ind. sing.) : babioles (f pl.), machins (pl.), gadgets (pl.) - to be obsessed by gadgetry : ne s’intéresser qu’aux gadgets * gaffe (n) (fa) : gaffe (f), bourde (f), bévue (f) - diplomatic gaffe : gaffe diplomatique * gaffer (n) (fa) : 1/ (Ciné., Télé) éclairagiste, chef électricien, chef électro (fam.) ; 2/ (brit.) (arg.) contremaître, patron ; 3/ (brit.) vieil homme, vieux (n) (gaffeur se dit blunderer pour le nom ou blundering pour l’adjectif) * gage (n) : jauge (f) * gage (v) (tr.) : jauger * gagging (n) baillonnement (syn. muzzling) - media gagging : baillonnement des médias * gagman (n) (pl. gagmen) : auteur de gags * gain (n) : gain, hausse (f), augmentation (f), plus-value (f) - gains in quality : gains en qualité - ill-gotten gains : biens mal acquis - productivity gains : gains de productivité * gain (v) (tr.) : acquérir, obtenir, gagner - to gain acceptance as… : être de plus en plus reconnu comme étant… * gainful (a) : 1/ rémunéré(e) ; 2/ rémunérateur/-trice, lucratif/-ive * gainly (a) : gracieux/-euse, beau, belle (anton. ungainly) * gait (n) : démarche (f) - an assured gait : une démarche assurée * galactic (n) : galactique * galaxy (n) (pl. galaxies) : 1/ galaxie (f) - elliptical galaxy : galaxie elliptique - lenticular galaxy : galaxie lenticulaire - spiral galaxy : galaxie spirale ; 2/ (fig.) pléiade (f) * gale (n) (fa) : 1/ coup de vent, rafale (f) (de vent) ; 2/ tempête (f), grain * gall (n) : 1/ bile (f) - gall bladder : vésicule biliaire (f) ; 2/ fiel, amertume (f) * gall (v) (tr.) : exaspérer * gallant (a) (fa) : brave, courageux/-euse * gallantry (n) (fa) : bravoure (f) * gallery (n) (pl. galleries) : galerie (f)- art gallery : galerie d’art * galliard (n) : gallion * Gallic (a) : gaulois(e), bien français(e) * gallicisation (brit.) / gallicization (amér.) (n) : francisation (f) (de termes étrangers) * gallicise (brit.) / gallicize (amér.) (v) (tr.) : franciser (des termes étrangers) * galling (a) : 1/ (au propre) irritant(e) ; 2/ (fig.) vexant(e), exaspérant(e) ; 3/ [tir, feu] nourri(e), intense * galling (n) : 1/ action d’irriter ; 2/ écorchure (f) * gallivant (about) (v) (intr.) : vadrouiller, courir - to gallivant around the world : vadrouiller de par le monde, parcourir le monde * gallows (n) (pl. gallows) : potence (f), gibet * galore (adv.) : à gogo, en abondance * galoshes (n pl.) (brit.) : caoutchoucs (pl.) (pour protéger les chaussures) * galvanize (brit.) / galvanize (amér.) (v) (tr.) : galvaniser (prop. et fig.) * gamble (v) (tr. et intr.) : jouer (de l’argent) * gambling (n) : (le) jeu, (les) jeux (d'argent) - gambling debt : dette de jeu * gambrel (n) : - gambrel shed : abri à toiture mansardée, abri à toit brisé * game (n) : 1/ jeu - ball game : jeu de ballon - abandonware games : (Jeux vidéo) jeux abandonnés, jeux délaissés, jeux d'hier - electronic games : jeux électroniques - escape game : jeu d’évasion - tabletop games : jeux de table - video games : jeux vidéo - game level : niveau dans un jeu - game show : jeu télévisé ; 2/ partie (f), match - to play a carom billiards game : faire une partie de billard français - the deciding game : la belle - end game : a/ (aux échecs) partie finale (f), finale (f) ; b/ dénoument (aussi endgame) - football games : parties de ballon rond - soccer game : match de foot - game changer (fig.) : élément qui change la donne, renversemnt des choses, renversement de situation - game ender (fig.) : élément qui met un terme à une situation ; 3/ jeu (au sens de tactique, méthode) - confidence game (abr. con game) : abus de confiance - I know your little game : Je sais à quoi tu joues, Je sais où tu veux en venir ; 4/ gibier * game (a) : partant(e) (for sth, pour qch) * gameability (n) : jouabilité (f) (syn. playability) * gameable (a) : jouable (syn. playable) * gamekeeper (n) : garde-chasse (masc.) * gameplay (n) : 1/ scénario de jeu, intrigue (f) - action-oriented gameplay : scénario de jeu tourné vers l’action (aussi action gameplay) ; 2/ déroulement du jeu - the gameplay will remain the same whether you choose one gender over the other : le choix en matière de genre n’a pas d’incidence sur le déroulemnt du jeu ; 3/ action (f), feu de l’action - during gameplay : dans le feu de l’action ; 4/ façon de jouer, jeu - [console] to revolutionize gameplay : [console] révolutionner la façon de jouer - rules and methods of gameplay : règles et techniques de jeu - gameplay time : temps passé à jouer, temps consacré au jeu - Monitor your child’s gameplay time : Contrôlez le temps consacré au jeu par votre enfant * gamer (n) : (Jeux vidéo) joueur - casual gamer : joueur occasionnel - hardcore gamer : joueur passionné, mordu des jeux vidéo, hyperjoueur (off.) - mid-core gamer : joueur modéré (var. core gamer) - professional gamer : joueur professionnel (var. pro gamer) * gamesmanship (n) : emploi de ruses pour gagner au jeu, machiavélisme au jeu, manipulation du joueur adverse * gaming (n) : 1/ (le) jeu (l’activité) - hardcore gaming : pratique intensive des jeux vidéo - video gaming : (la) pratique des jeux vidéo ; 2/ (les) jeux (les produits) * gammon (n) (brit.) : jambon fumé * gang (n) : 1/ bande (organisée) (f) - armed gang : bande armée - gang bang : partouze (f) - gang rape : viol en bande, viol collectif, viol en réunion ; 2/ (Mus.) bande, troupe (f) (de musiciens de rap) - gang raping : (le) viol collectif, (les) viols collectifs (pl.) * gang bang (v) (intr.) : partouzer * gang banger (n) : partouzeur, partouzeuse * gangplank (n) : (Naut.) passerelle (f) * gangster (n) : bandit, truand * gang up (v) (intr) : 1/ s’unir, s’allier ; 2/ - to gang up on sb : se liguer contre qn * gangway (n) : passerelle (f) - Haul off the gangway! : Retirez la passerelle ! * gantry (n) (pl. gantries) : pont roulant, portique - gantry robot : robot portique * gaol (n) (brit.) : prison (f) (ortho. amér. jail) * gap (n) : 1/ trou, vide ; 2/ brèche (f) ; 3/ blanc, espace (f.) ; 4/ écart, fossé - credibility gap : fossé entre déclarations et réalité, manque de crédibilité ; 5/ trou, lacune (f) * gape (v) (intr.) : regarder bouche bée (at sth, qch) * gaping (a) : béant(e) * garage (n) : garage - to put the car in the garage : ranger la voiture au garage - parking garage (brit.) : parking à étages - garage sale (amér.) : vide-grenier (masc.) - yard sale (amér.) : vide-grenier * garage (v) (tr.) : rentrer (une voiture) au garage - Would you garage my Daimler for me please? : Vous voulez bien rentrer ma Daimler au garage ? * garantor (n) : garant - guarantors of peace : garants de la paix * garb (n) : (hum.) costume * garbage (n ind. sing.) (amér.) : ordures (f pl.), détritus (pl.) - to take out the garbage : sortir la poubelle - garbage can : poubelle (f) - garbage man : éboueur * garble (v) (tr.) : rendre confus, rendre incompréhensible (words, etc., des mots, etc.) * garden (n) : jardin - the Garden of Eden : le jardin d’Eden - botanical garden : jardin botanique - hop garden : houblonnière (f) - kitchen garden : jardin potager - garden gnome : nain de jardin - garden party : réception en plein air - garden path / pathway : allée de jardin - garden tree : arbre de jardin - ornemental garden pavilion : fabrique de jardin * gardening (n) : horticulture, jardinage - a spot of gardening : un brin de jardinage - gardening magazine : revue d’horticulture, revue de jardinage * garish (n) : voyant(e), criard(e) * garland (n) : 1/ guirlande (f) ; 2/ collier de fleurs ; 3/ couronne de fleurs * garland (v) (tr.) : 1/ enguirlander ; 2/ offrir un collier de fleurs à (qn) ; 3/ poser une couronne de fleurs sur la tête de (qn) * garlic (n) : ail - clove of garlic : gousse d’ail - garlic press : presse-ail (masc.) * garment (n) : vêtement, habit - garment technologist : technicien de confection * garner (v) (tr.) : engranger, accumuler, amasser * garret (n) : mansarde (f) * garter (n) : (selon le cas) jarretière (f), jarretelle (f) (de femme), fixe-chaussette (masc.) - garter belt (amér.) : porte-jarretelle (masc.) * gas (n) (pl. gases) : gaz - fuel gases : gaz combustibles - HHO gas : vapeur d’eau - laughing gas : gaz hilarant, oxyde nitreux - liquefied natural gas : gaz naturel liquéfié - natural gas : gaz naturel - gas cooker : gazinière (f) - gas holder : gazomètre (aussi gasholder) - gas lighting : éclairage au gaz (aussi gas light) - gas lighter : allume-feu (masc.) - gas mask : masque à gaz - gas works : usine à gaz * gas (n) (tronc. de gasoline) (amér.) (fa) : essence (f) - gas mart : station service (f) - gas mileage : consommation d’essence - gas station : station à essence * Gascony (n pr.) : (la) Gascogne * gas-fired (ac) : à gaz - gas-fired boiler : chaudière à gaz * gash (n) (pl. gashes) : entaille (f), balafre (f) * gash (v) (tr.) : entailler, balafrer * gasholder (n) : gazomètre (aussi gas holder - gasometer) * gasket (n) : joint de culasse * gaslight (n) : lueur d’une lampe à gaz * gaslight (v) (amér.) (tr.) : manipuler, enfumer (fam.), mener en bateau (fam.) - to gaslight people into getting jabbed needlessly : manipuler les gens pour qu’ils se fassent piquer inutilement * gaslighting (n) (amér.) : détournement cognitif (voir entrée gas), enfumage (fam.) * gas-lit (ac) : éclairé(e) au gaz * gasometer (n) : gazomètre - to fall of a gasometer : tomber du haut d’un gasomètre * gasp (v) (intr.) : haleter, suffoquer * gate (n) : 1/ entrée (f) (de ville) ; 2/ grille (f) - safety gate : grille de sécurité ; 3/ vanne (f) ; 4/ - tail gate : hayon (de voiture) * gatecrash (v) : (tr.) resquiller à (un événement payant) ; (intr.) resquiller ; 2/ (intr.) s’inviter à (une soirée), se pointer sans invitation à (une soirée) - Sorry to gatecrash! : Excusez-moi de m’inviter, Désolé de venir sans invitation * gatecrasher (n) : 1/ resquilleur (à un événement payant) ; 2/ personne qui s’invite à une soirée, personne qui vient sans invitation (à une soirée), intrus(e) * gated (a) : [quartier, résidence] sécurisé(e) - gated community : résidence fermée (f) * gate-keeper / gatekeeper (n) : 1/ portier, gardien ; 2/ garde-barrière ; 3/ contrôleur d’accès - media gatekeeper : (Médias) contrôleur de l’information * gate-keeping / gatekeeping (n) : 1/ contrôle de l’accès, filtrage à l’entrée ; 2/ (Médias) contrôle, filtrage (de ce qui sera dans le journal ou à l’antenne) * gather (v) : (tr.) rassembler, réunir ; (intr.) se réunir, se rassembler * gatherer (n) : cueilleur/-euse, ramasseur/-euse - mushroom gatherer : ramasseur de champignons * gathering (n) : 1/ cueillette (f), ramassage - grape gathering : vendange (f) ; 2/ recueil, collecte - information gathering : collecte d’informations ; 2/ réunion (f) - a happy hour gathering : un cinq à sept * gaudy (a) : voyant(e), criard(e) (f) * gauge (n) : jauge (f), indicateur - feeler gauge : jauge d'épaisseur - post-process gauge : jauge placée en fin d'opération * gauge (v) (tr.) : mesurer, étalonner, évaluer * gauging (n) : relèvement de cotes - gauging data : valeurs relevées (f pl.) * gaunt (a) : décharné(e) * gauntlet (n) : gantelet - to throw down the gaunlet : lancer un défi * gauze (n) : gaze (f) * gavel (n) : marteau (de juge, de commissaire-priseur) * gawd (n) (ortho. fam. de god) : - for gawd’s sake : pour l’amour de dieu - gawd blimey! : bon dieu ! * gawk (v) (intr.) : regarder bouche bée (at sth, qch) * gawker (n) : badaud, badaude * gaze (n) (fa) : regard fixe * gaze (v) (intr.) (at) : regarder (plutôt passivement), regarder fixement, contempler * gaze around (v) (intr.) : regarder autour de soi * gazillion (a) : (un) paquet de, (des) tonnes de - a gazillion starships : une myriade d’astronefs * gay (a) : 1/ gai(e) ; 2/ homosexuel(le) - the gay press : la presse homosexuelle * GCSE (n) (init. de General Certificate of Secondary Education : certificat général de l'enseignement secondaire) (14-16 ans) = le Brevet - to take GCSEs in English, Mathematics and Science : préparer le Brevet en anglais, mathématiques et sciences - to publish GCSE results : publier les résultats du Brevet - to receive the results of one's GCSEs : recevoir ses résultats au Brevet * gear (n) (fam.) : 1/ roue dentée - gears : engrenage ; 2/ vitesse (f) - to shift into the fifth gear : passer la cinquième (vitesse) - gear box : boîte de vitesses (aussi gearbox) - gear lever : levier de vitesses ; 3/ (ind. sing.) attirail, équipement, matériel, matos (fam.) - landing gear : (Aéro.) train d’atterrissage ; 4/ (ind. sing.) affaires personnelles (f pl.), frusques (pl.) (péj.), barda (fam.) * gear (v) (tr.) : 1/ to gear sth with sth : équiper qch de qch ; 2/ - to gear sth to sth : adapter qch à qch ; 3/ (surtout à la forme passive) - to be geared towards sth : être orienté vers qch, être axé sur qch - The project is geared to the construction of affordable housing : Le projet est axé sur la construction de logements abordables * gearbox (n) : boîte de vitesses (aussi gear box) * gear up (v) (intr.) : passer à la vitesse supérieure * gee (interj.) (amér.) : ça alors ! * geezer (n) (arg. brit.) : mec (arg.), gonze (arg.) * geezer (n) (brit.) (var. ortho. de geyser) : chauffe-eau (masc.) * gel (n) : (la substance) gel - antibacterial gel : gel antibactérien * gen (n) (tronc. de generation : génération) : se rencontre en composition - 5th-gen fighter : chasseur de 5e génération * gender (n) (fa) : 1/ genre (grammatical) ; 2/ sexe (masculin, féminin) - to change one’s gender : changer de sexe - female gender : sexe féminin - male gender : sexe masculin - gender analysis : analyse sociospécifique - gender bias : sexisme - gender equality : égalité femmes-hommes - gender studies : étude des rapports sociaux entre les sexes * gender-based (ac) : déterminé(e) par le sexe * gendered (a) : marqué(e) par une différentiation selon le sexe, fondé(e) sur le sexe, sexospécifique * gender-neutral (ac) : non sexiste, épicène - gender-neutral terminology : terminologie épicène * gene (n) : gène - gene therapy : thérapie génique (f) * genealogical (a) : généalogique - genetic genealogy : généalogie génétique (f) - genealogical tree : arbre généalogique * genealogist (n) : généalogiste * genealogy (n) : généalogie (f) - genealogy expert : expert en généalogie * general (a) : 1/ général(e) - general strike : grève générale ; 2/ - the general public : le grand public ; 3/ - general partner : commandité (n) ; 4/ généraliste - general practitioner (brit.) : médecin généraliste, généraliste, médecin traitant, omnipraticien * general (n) : général (n) - armchair general : général de salon, général en pantoufles, stratège en chambre * general-interest (ac) : généraliste (anton. special-interest, spécialisé(e), spécialiste) * generalisable (brit.) / generalizable (amér.) : généralisable * generalise (brit.) / generalize (amér.) (v) (tr. et intr.) : généraliser * generally (adv.) : généralement - Generally, … (a m p) (t d p) : En règle générale, …, En général, … * Generally speaking, ... (a m p) (t d p) : 1/ Très généralement, … ; 2/ D'un point de vue général ..., Sur un plan général, … * General Motors (n pr.) : General Motors * General Motors Corp. (n pr.) : la société General Motors * general-purpose (ac) : polyvalent(e) (anton. special-purpose) * generate (v) (tr.) : engendrer, provoquer, produire, susciter (éviter l’anglic. « générer ») * generated (pp) : (en compo.) créé(e) par, engendré(e) par * generating (n) : production (f), fabrication (f) - fake news generating : fabrication de fausses nouvelles * generation (n) : 1/ création (f), production (f) - electricity generation : production d’électricité - image creation : création d’images ; 2/ génération (f) (âge) * generator (n) : générateur - application generator : (BdD) générateur d’applications - impulse generator : générateur d’impulsions - report generator : (Impression) éditeur de rapports, générateur d’états * generosity (n) : 1/ générosité (f), nature généreuse (f) ; 2/ (pl. generosities) acte généreux * generous (a) : généreux/-euse * generously (adv.) : 1/ généreusement ; 2/ largement * genetic (n) : génétique - genetic genealogy : généalogie génétique (f) * genetically (adv.) : génétiquement * genetically-altered (ac) : modifié(e) génétiquement * genetically engineered (ac) : obtenu(e) par génie génétique * genetically modified (ac) : modifié(e) génétiquement, génétiquement modifié(e) (anglic.) - genetically modified organisms (GMO) : organismes génétiquement modifiés (OGM) * genetics (n sing.) : (la) génétique * genial (a) : jovial(e) * genie (n) : génie (l’esprit) - The genie is out of the bottle : Le génie est sorti de sa lampe * genital (a) : génital(e) * genitals (n pl.) : organes génitaux, parties génitales (f pl.), parties (f pl.) (fam.) * genitive (a) : (Gram.) au génitif * genitive (n) : (Gram.) (le) génitif, (le) cas possessif * genius (n) (pl. geniuses) : 1/ (la personne) (un) génie (m)- It doesn’t take a genius to figure that out : Il ne faut pas être un génie pour comprendre ça ; 2/ (la spécificité d’une nation) (le) génie - French genius for the art of living : Le génie français de l’art de vivre * genocidal (a) : génocidaire * genocide (n) : génocide * genocider (n) : génocidaire (n) * genome (n) : génome - genome studies : (l’)étude du génome, (les) études sur le génome * genre (n) : 1/ (Art) genre - the rock and roll genre : le genre rock and roll - genre film : film de genre (var. amér. genre movie) ; 2/ type - TV genres : types d'émission télé * genteel (a) : (iron.) distingué(e) * gentle (a) (fa) : doux/-ouce, paisible - gentle music : musique douce * gentleman (n) (pl. gentlemen) : gentilhomme * gentlemanly (a) : galant(e) * gentleness (n) : douceur (f) * gently (adv.) (fa) : doucement, en douceur - Go gently! : Vas-y / Allez-y doucement !, Vas-y / Allez-y mollo ! (fam.) * gentrification (n) : embourgeoisement * gentrify (v) (tr.) : embourgeoiser - to gentrify oneself : s’embourgeoiser * gents (n sing.) (brit.) : toilettes (f pl.) (pour les) hommes - Could you tell me where the gents is? : Pourriez-vous me dire où se trouvent les Messieurs ? * genuine (a) : 1/ sincère, vrai(e) (syn. sincere) ; 2/ authentique (syn. authentic), original(e) * genuinely (adv.) : 1/ sincèrement ; 2/ authentiquement * geographer (n) : géographe (n) (m/f) * geographical (a) : géographique * geographically (adv.) : géographiquement * geographically dispersed (ac) : éparpillé(e) géographiquement - geographically dispersed networks : réseaux éparpillés géographiquement * geography (n) : (Éduc.) (la) géographie - War is how Americans learn geography : C’est par la guerre que les Américains apprennent la géographie - history and geography : (l’)histoire-géographie (f) * geolocate (v) (tr.) : géolocaliser (par GPS) * geolocation (n) : géolocalisation (f) (par GPS) * geological (a) : géologique * geologically (adv.) : géologiquement * geologist (n) : géologue (n) (m/f) * geology (n) : géologie (f) * geomagnetic (a) géomagnétique - geomagnetic storm : tempête géomagnétique * geometrical (a) : géométrique * geometrically (adv) : géométriquement * geometry (n) : géométrie (f) * geopolitical (a) : géopolitique * geopolitics (n) (sing.) : (la) géopolitique * Georgia (n pr.) : (la) Géorgie (le pays) * Georgia (n pr.) : (la) Géorgie / Georgie (un État des États-Unis d’Amérique) * Georgian (a) : géorgien(ne) (sans maj.) * Georgian (n pr.) : Géorgien (le ressortissant), Géorgienne (la ressortissante) * geotrack (n) : géolocalisation (f) - to run a geotrack : faire une géolocalisation * geotrack (v) (tr.) : géolocaliser - to geotrack an IP address : géolocaliser une adresse IP * germ (n) : microbe * German (a) : allemand(e) (sans maj.) - German measles : rubéole (f) * German (n pr.) : Allemand(e) (la nationalité) - West Germans : Allemands de l’Ouest * German (n) : allemand (la langue) * German-trained (ac) : formé(e) en Allemagne - German-trained engineer : ingénieur formé en Allemagne * Germany (n pr.) : (l’)Allemagne (f) - the former East Germany : l’ancienne Allemagne de l’Est - the former West Germany : l’ancienne Allemagne de l’Ouest * germinate (v) : (tr.) faire germer ; (intr.) germer * germ-laden (ac) : plein(e) de microbes, chargé(e) de microbes - germ-laden air : air chargé de microbes - germ-laden surfaces : surfaces où grouillent les microbes * germless (a) : stérile * gestate (v) (intr.) : être en gestation * gestural (a) ; gestuel(le) - gestural abstraction : (l’)abstraction gestuelle, (l’)action painting * gesture (n) : geste, mouvement * gesture (v) (intr.) : faire un geste, faire des gestes * get (v) (got, got) : 1/ (tr.) recevoir ; 2/ (tr.) obtenir, trouver - I got that : J’ai trouvé ça - to get a loan : obtenir un prêt - to get a return on one’s capital investments : rentabiliser ses investissements - to get a summer placement : trouver un stage d’été - to get oneself sth : se procurer qch ; 3/ (tr.) aller chercher ; 4/ (tr.) to get + c.o.d. + inf. avec to : faire + inf. + c.o.d. : - to get a device to work (Inf.) : faire marcher un périphérique - to get sb to do sth : persuader qn de faire qch ; 5/ (tr.) to get + c.o.d. + ppa : faire + inf. + c.o.d. - to get one’s hair cut : se faire couper les cheveux ; 6/ (intr.) to get + adj. : devenir + adj. ; 7/ (intr.) to get + part. passé : se faire + inf. - to get nicked : se faire prendre - to get robbed : se faire voler (son argent, ses papiers) ; 8/ (intr.) arriver, parvenir - to get from ... to : passer de ... à - to get into… : s’introduire dans … - to get into a dressing gown : enfiler une robe de chambre ; 9/ (tr.) mener (quelque part) - That will get you nowhere : Cela ne te mènera nulle part ; 10/ (tr.) comprendre, saisir, piger (fam.) - Do you still not get it! : Tu ne comprends toujours pas ? / Vous ne comprenez toujours pas ? - I got that : J’ai (bien) compris ; 11/ (expressions) - I’ll get it! : (on frappe à la porte, le téléphone sonne, etc.) : Je m’en occupe !, Je m’en charge ! * get along (v) (got, got) (intr.) : s’entendre bien (with sb, avec qn) * getaway (n) : évasion (f), fuite (f) * get back (v) (got, got) : 1/ (tr.) reprendre - to get one’s breath back : reprendre son souffle ; 2/ (intr.) revenir (to sth, à qch), retourner (implique une idée d’effort) (to sth, à qch) - Let's get back to the subject! : Revenons à nos moutons ! (fam.) - to get back home : retourner chez soi, rentrer chez soi * get by (v) (got, got) (intr.) : se débrouiller * get down (v) (got, got) (intr.) : - to get down to work : se mettre à l’ouvrage - to get down to it : s’y mettre * get-go (n) : début, départ - straight from the get-go : dès le début, dès le départ * get in (v) (got, got) (tr.) : 1/ - to get in a word : glisser un mot ; 2/ rentrer (hay, du foin, etc.) * get out (v) (got, got) : (tr.) sortir ; (intr.) sortir - get-out clause : clause d’exception * get past (v) (got, got) (tr.) : passer (malgré un obstacle) - [car] to mount the pavement to get past : [voiture] monter sur le trottoir pour pouvoir passer * get up (v) (got, got) : 1/ (tr.) lever (qn) (le matin) : (intr.) se lever (le matin) ; 2/ (intr.) se mettre debout, se lever ; 3/ (tr.) habiller (qn) - to get oneself up : s’habiller * get-up (brit.) / getup (amér.) (n) : accoutrement, fringues (f pl.) * geyser (n) (fa p) : 1/ geyser ; 2/ chauffe-bains * GFC (n pr.) (init. de (the) Great Financial Crisis : (la) Grande crise financière de 2008) * Ghana (n pr.) : (le) Ghana * Ghanaian (a) : ghanéen(ne) (sans maj.) * Ghanaian (n pr.) : Ghanéen (le ressortissant), Ghanéenne (la ressortissante) * ghee (n) ghi, beurre clarifié * ghastly (a) : effrayant(e), épouvantable * ghetto (n) (pl. ghettos) : ghetto * ghettoise (brit.) / ghettoize (amér.) (v) (tr.) : ghettoiser * ghost (n) : fantôme - ghost crab : crabe fantôme - ghost rocket : fusée fantôme (f) (au-dessus de la Scandinavie, de 1937 à 1946) - ghost town : ville fantôme (f) - ghost writer : nègre littéraire, prête-plume (masc.) * ghost-write (vc) : (tr.) - to ghost-write papers for students : écrire des dissertations pour des étudiants ; (intr.) - to be ghost-writing for sb : être le nègre littéraire de qn, prêter sa plume à qn * giant (n) : géant, colosse - pharma giant : géant pharmaceutique * giant (a) : géant(e) - giant leap : bond gigantesque * gibberish (n) : baragouin, charabia * gibe (n) (var. ortho jibe) : moquerie (f), sarcasme * gibe (v) (intr.) (var. orho. jibe) : railler - to gibe at sth/sb : se moquer de qch/qn * giddiness (n) étourdissement, vertiges (pl.) * giddy (a) : 1/ pris(e) de vertige, étourdi(e) - to be or feel giddy : avoir le vertige ; 2/ vertigineux/-euse * gift (n) : 1/ don (de la nature) - to have the gift of the gab : avoir du bagou ; 2/ don - They thanked him for his generous gift : Ils le remercièrent de son don généreux ; 3/ présent, cadeau - Consider it a gift : C’est un cadeau de la maison - arms laden with gifts : bras chargés de cadeaux - gift shop : a/ magasin de cadeaux, b/ boutique de souvenirs * gifted (a) : doué(e) - [student] to be gifted : [élève] avoir des facilités - academically gifted : doué pour les études * gig (n) : 1/ cabriolet ; 2/ canot ; 3/ concert - to play a gig : donner un concert ; 4/ (arg.) boulot - (the) gig economy : (l’)économie du travail à la demande, (les) emplois précaires (pl.) - gig worker : travailleur à la demande, travailleur temporaire, pigiste, salarié occasionnel * giggle (n) : gloussement, rire bête - to have a fit of the giggles : avoir le fou rire * giggle (v) (intr.) : glousser, rire bêtement * gild (v) (tr.) : dorer, recouvrir d’or * gills (n pl.) (n) : ouïes (f pl.) * gillie (n) (Écosse) : 1/ suivant (d’un chef de clan) ; 2/ serviteur * gilt (a) : doré(e) * gilt (n) : dorure (f) * gimme (fam.) (contr. de give me) * gimmick (n) : 1/ truc, bidule (syn. object) ; 2/ tour (masc.), stratagème (syn. trick) * gimmickry (n ind. sing.) : 1/ trucs (pl.), bidules (pl.) ; 2/ tours (masc. pl.) * gimmicky (a) : qui donne une impression de « gadget », qui fait « gadget » * ginger (n) : gingembre * gingerbread (n) : pain d'épice * ginger-haired (ac) : aux cheveux roux * gingerly (adv.) : avec précaution * girder (n) : poutre (f) * girdle (n) : ceinture (f) - a girdle of chastity : une ceinture de chasteté * girl (n) : 1/ (jeune) fille - my dream girl : la fille de mes rêves - the golden girl : a/ l’enfant chérie, b/ l’enfant prodige ; 2/ (Éduc.) élève (féminine) - day girl : externe (n) (f) - old girl (G.-B.) : ancienne élève ; 3/ fille - cigarette girl : vendeuse de cigarettes - escort girl : accompagnatrice en soirée * girl-friendly (ac) : 1/ bon(ne) pour les jeunes filles - This place really isn’t girl-friendly : C’est pas pour les filles ici ; 2/ soucieux/-euse de l’intérêt des jeunes filles * girlie / girly (a) (fam.) : de jeune fille, de fillette, de gamine, de femme, féminin(e) - girly magazine : revue de charme, revue érotique (f) - a girly man : un efféminé - a very girly handwriting : une écriture de fille * girlish (a) : puéril(e) (pour une fille) * girth (n) : 1/ sangle de selle (f) ; 2/ tour de taille (masc.) ; 3/ corpulence (f) * gist (n) : idée générale (f), sens général - to get the gist : comprendre l’essentiel (of, de) * git (n) (arg. brit.) (vulg.) : con, connard (vulg.) * give (n) : élasticité (f) (d’une surface) * give (v) (gave, given) (tr. et intr.) : donner * give back (v) (gave, given) (tr.) : rendre, restituer * give in (v) (gave, given) (intr.) : céder * given (pp de to give) * given (prép.) : étant donné * given that (loc. conj. de cause) : étant donné que, comme * give or take (sth) (loc. prép.) : à (qch) près - give or take a few days : à quelques hours près * give or take (loc. adv.) : plus ou moins, à peu près, environ * give out (v) (gave, given) (intr.) : [organe] céder, lâcher - My voice gave out : Je n’ai plus de voix * giver (n) : 1/ donneur, donateur ; 2/ personne généreuse (f) * give up (v) (gave, given) (tr. et intr.) : abandonner, renoncer, laisser tomber (fam.) * glacier (n) : glacier (de montagne) - glacier retreat : recul des glaciers * glad (a) : content(e) * glade (n) : clairière (f) * gladly (adv.) : 1/ avec plaisir, volontiers ; 2/ avec joie * glam (a) (abr. de glamorous : plein de charme, séduisant(e)) * glamorise (brit.) / glamorize (amér.) (v) (tr.) : rendre attrayant, rendre séduisant (aussi glamourise/-ize) * glamorous (a) : charmant(e), captivant(e), enchanteur/-euse, séduisant(e), fascinant(e) * glamour (brit.) / glamor (amér.) (n) : charme, attrait, enchantement * glamping (n) (contr. de glamorous camping) : hébergement insolite (roulotte, yourte, arbre) * glance (n) : rapide coup d’œil, regard rapide * glance (v) (intr.) : 1/ [projectile] arriver de biais - to glance aside : dévier ; 2/ jeter un coup d’œil - to glance over one’s shoulder : regarder par dessus son épaule, se retourner * glance off (v) (intr.) : [projectile] ricocher * gland (n) : glande (f) - gland trouble : troubles glandulaires (pl.) * glare (n) : 1/ lumière éblouissante (f) ; 2/ regard furieux - the glare of publicity : les feux de la publicité * glare (v) (intr.) : 1/ éblouir ; 2/ lancer un regard furieux * glaring (a) : aveuglant(e) - glaring sun : soleil aveuglant * glass (n) : 1/ verre (le matériau) - glass float : boule de pêche (f) - frosted glass : verre dépoli - glass door : porte vitrée (f), porte-fenêtre (f) - glass works : verrerie (f) (l’usine) ; 2/ (pl. glasses) verre (le récipent) - glass of wine : verre de vin - wine glass : verre à vin - man-sized glass : grand verre ; 3/ (pl. glasses) lunettes (f pl.) - smart glasses : lunettes connectées * glassblower (n) : souffleur de verre, verrier * glassed-in (ppa) : vitré(e) - glassed-in areas : espaces vitrés * glassware (n ind. sing.) : verrerie (f) * glasswort (n) : salicorne (f) * Glaswegian (a) : de Glasgow * Glaswegian (n pr.) : habitant de Glasgow * glaze (n) : 1/ glaçure (f), vernis (d’une céramique) ; 2/ vitre (f) * glaze (v) (tr.) : 1/ vernisser (du grès) ; 2/ glacer (paper, du papier) ; 3/ vitrer (une fenêtre) * glazed (ppa) : 1/ vernissé(e)- glazed software : grès vernissé ; 2/ glacé(e) - glazed paper : papier glacé * glazier (n) : vitrier * glazing (n) : vitrage - double glazing : double vitrage * gleam (n) : lueur (f) * gleaming (a) : luisant(e), étincelant(e), resplendissant(e) * glean (v) (tr.) : 1/ (Agric.) glaner ; 2/ (fig.) glaner, grapiller * gleaner (n) : glaneur * gleanings (n pl.) : glanes (f pl.) * glee (n) : allégresse * gleeful (a) : jubilant(e) * gleefully (adv.) : en jubilant * glen (n) : vallon * glib (a) : [lettre, réponse] désinvolte * glibly (adv.) : 1/ avec aisance ; 2/ avec désinvolture * glimpse (n) : aperçu - to catch a glimpse of sth : apercevoir qch * glint (n) : 1/ éclair ; 2/ étincelle (f) * glint (v) (intr.) : luire, étinceler * glisten (v) (intr.) : luire, briller, [eau] scintiller, [étoffe] chatoyer * glistening (a) : [eau] scintillant(e), [étoffe] chatoyant(e) * glitch (n) (pl. glitches) : 1/ (Électron.) parasite, signal perturbé ; 2/ (fam.) imperfection, dysfonctionnement, problème (technique) * glitter (n) : paillettes (pl.) * glitter (v) (intr.) : scintiller, étinceler, [yeux] briller * glittering (a) : scintillant(e), étincelant(e), [yeux] brillant(e) * gloat (v) (intr.) : jubiler, exulter (over, à l’idée de) * gloating (a) : [sourire] triomphant * glob (n) : 1/ goutte visqueuse (f), boule visqueuse ; 2/ globule * global (a) (fa p) : 1/ global(e) ; 2/ mondial(e), de la planète, planétaire, terrestre - [war] to go global : [guerre] devenir planétaire, s’étendre à toute la planète - the global economy : l'économie mondiale (f) - global player : multinationale (n f) - global sourcing : approvisionnement dans le monde entier - the global village : le village planétaire - global warming : réchauffement de la planète, réchauffement planétaire * globalisation (brit.) / globalization (amér.) (n) (fa) : mondialisation (f) * globally (adv.) (fa p) : 1/ globalement ; 2/ à l'échelle mondiale, dans le monde entier * globe (n) (fa p) : 1/ globe ; 2/ (the globe) (la) planète * Globish (n) : (le) globish (variante simplifiée de l'anglais, censée être employée internationalement) * gloom (n) : 1/ obscurité (f), ténèbres (pl.) ; 2/ mélancolie (f) (syn. melancholy) - gloom merchant : Cassandre * gloomily (adv.) : d’un air sombre, tristement * gloomy (a) : sombre, triste * glorification (n) : glorification (f) * glorify (v) (tr.) : glorifier * glory (n) (pl. glories) : gloire (f) - glory days : a/ jours de gloire, jours glorieux - We’ve seen some glory days : On a connu des jours glorieux ; b/ bon vieux temps - the glory days of the 1960s : le bon vieux temps des années 1960 * glory to + nom (interj.) : gloire à + nom - Glory to our President! : Gloire à notre président ! * gloss (n) : 1/ lustre ; 2/ glose (f), commentaire * glossary (n) (pl. glossaries) : glossaire - glossary of special terms : glossaire de termes spécialisés * glossy (a) : brillant(e) - glossy magazine : revue luxueuse (f) (sur papier glacé) * glossy (n) (pl. glossies) (abr. de glossy magazine) : revue luxueuse (f) (sur papier glacé) (syn. amér. slick) * glove (n) : gant - to take off the gloves (fig.) : enlever les gants, ne plus prendre de gants, tomber la veste - fingerless glove : mitaine (f) - oven glove : manique (f) - glove box (brit.) : boîte à gants (d’une auto) - glove compartment (amér.) : boîte à gants (d’une auto) * glovelette (n) : mitaine (f) * glow (n) : lueur (f), rougeoiement * glow (v) (intr.) : luire, rougeoyer * glowing (a) : 1/ luisant(e), lumineux/-euse, rougeoyant(e) ; 2/ (fig.) [individu] rayonnant(e) ; 3/ [couleur] éclatant(e) * glucose (n) : glucose * glue (n) : colle (f) * glue (v) (tr.) : coller * glueing (n) : collage * gluey (a) : gluant(e), visqueux/-euse * glum (a) : morose, abattu(e), triste * glumly (adv.) : d’un air morose, d’un air abattu * glut (n) : pléthore (f) * glutton (n) : glouton(ne) * gluttonous (a) : glouton(ne), goulu(e), vorace * GM (n pr.) (init. de General Motors, constructeur d’automobiles américain) : GM * GMO (n) (init. de genetically modified organisms : organismes génétiquement modifiés, anglic.) : OGM * gnarl (n) : nœud (dans le bois) * gnarl (v) (tr.) : tordre * gnarly (a) 1/ noueux/-euse ; 2/ (amér.) super, génial(e) * gnaw (v) (intr.) (at) : ronger * gnome (n) : gnome - garden gnome : nain de jardin * go (n) : - Here’s a go! : En voilà une aventure ! - It’s all the go : Cela fait fureur (syn. It’s all the rage) - It’s no go ! : Rien à faire !, Pas moyen ! - It’s quite the go : C’est le dernier cri * go (v) (went, gone) : 1/ (intr.) aller - I don’t wanna go : Je veux pas y aller - Let’s go and stock up! : Allons faire nos provisions ! - to go to and fro : aller et venir, faire les cent pas ; 2/ (intr.) to go + préposition : - to go + against : to go against the popular will : aller à l’encontre de la volonté populaire ; to go + for : - to go for a spin : aller faire en tour en voiture - to go for a stroll : aller faire un tour - to go for a swim : aller nager, aller se baigner - to go for sb : s'en prendre à qn ; to go + into : - [satellite] to go into orbit : [satellite] se placer en orbite - to go into production : passer à la production - to go into service : entrer en service ; to go + on : - to go on a diet : se mettre à suivre un régime - to go on an errand : faire une commission - to go on a spending spree : faire des achats extravagants - to go on holidays : partir en vacances - [crowd] to go on the rampage : [foule] se déchaîner, saccager tout sur son passage - to go on outings : faire des excursions ; to go + through : - to go through a bad patch : connaître des moments difficiles ; to go + to : - to go to prison : aller en prison - to go to prom : aller au bal de promo - to go to the pictures (brit.) : aller au cinéma (syn. amér. to go to the movies) - (fig.) to go to work : se mettre à l’ouvrage, passer à l’action - to go to great lengths : se donner beaucoup de mal (pour faire qch) ; 3/ (intr.) - to go for sth : aimer qch, être amateur de qch - I go for steak and chips : J’aime bien le steak frites ; 4/ (intr.) to go + gérondif : - to go begging : pratiquer la mendicité - to go sightseeing : faire du tourisme ; 5/ (intr.) s’en aller - I’m going : Je m’en vais - to go home : allez chez soi, rentrer chez soi - I’m going home : Je rentre chez moi ; 6/ to go + adj. : devenir + adj. - to go airborne : (au propre) prendre son envol, prendre de l’altitude ; (au figuré) devenir aérien, s’étendre aux airs - to go astray : s’égarer - to go awry : [plan, etc.] mal tourner - to go ballistic over sth : prendre qch très mal - to go bankrupt : faire faillite - to go berserk : a/ [individu] devenir fou/folle, pêter les plombs, disjoncter ; b/ [machine] s’emballer - to go broke : se retrouver sans le sou - to go bust : faire faillite - to go commercial : passer au stade de l'exploitation commerciale - to go daft : perdre la boule - Let’s go Dutch : Chacun paye sa part - to go global : devenir planétaire, s’étendre à toute la planète - to go public : s’introduire en bourse - to go unaired : être passé sous silence - to go unnoticed : n’être remarqué(e) par personne, passer inaperçu(e) - to go viral : se propager comme une traînée de poudre - to go wrong : aller mal, se détraquer ; 7/ y aller - Don’t go too hard! : N’y vas pas trop fort! * go about (v) (went, gone) : 1/ (tr.) s’occuper de - to go about one’s business : vaquer à ses occupations ; 2/ (tr.) se mettre à - How shall I go about it : Comment dois-je m’y prendre ? ; 3/ (intr.) sortir (aller dans des réceptions, etc.) * goad on (v) (tr.) : aiguillonner * go ahead (v) (intr.) : y aller - Go ahead! : Vas-y ! * go-ahead (ac) : qui va de l’avant, dynamique, entreprenant(e), actif/-ive * goal (n) : but, objectif, fin (f) - to achieve a goal : atteindre un objectif (syn. to reach a goal) - to set a goal : fixer un but * goat (n) : chèvre (f) * go away (v) (went, gone) (intr.) : - Don’t go away, I’ll be back! : Ne pars pas / Ne partez pas, je reviens ! * go back (v) (went, gone) (intr.) : retourner - When do you go back there? : Quand est-ce que retournes la-bas ? - to go back home : retourner chez soi * gob (n) : 1/ (brit.) bouche (f), gueule (f) (vulg.) - Shut your great big gob! : Ferme ta grande gueule ! ; 2/ crachat, cramiot (vulg.), molard / mollard (vulg.) * gob (v) (prét. et pp gobbed) : cracher, cramioter (vulg.), molarder / mollarder (vulg.) * gobble (v) (tr.) : engouffrer, engloutir (de la nourriture, de l’argent, de l’énergie, etc.) * gobbledegook (n) (fam.) : charabia (var. ortho. gobbledygook) * gobbler (n) : 1/ personne ou chose qui engloutit (des ressources), gouffre (au fig.) - cock gobbler : avaleur/-euse de bites - energy gobbler : gouffre à énergie - food gobbler : gouffre à nourriture; 2/ dindon * gobble up (v) (tr.) : engouffrer, engloutir (de la nourriture, de l’argent, de l’énergie, etc.) * go-between (n) : intermédiaire (n) * goblet (n) (fa) : 1/ coupe (f) (sans anse) ; 2/ timbale (f) (en métal) * gobo (n) : (Cin.) pare-lumière (masc.) * god (n) : 1/ dieu, divinité (f) ; 2/ (God) : Dieu - act of God : cas de force majeure, agent extérieur, cause naturelle (f), fléau naturel - God bless you! : Que Dieu vous bénisse ! - In God we trust (sur les dollars) : Nous avons foi en Dieu - God works in mysterious ways : Les voies du seigeur sont impénétrables - Thanks be to God! : Dieu merci ! * godchild (n) (pl. godchildren) : filleul(e) (n) * goddess (n) (pl. goddesses) : déesse (f) * godfather (n) : parrain * god-fearing (ac) : très croyant(e) * god-given (ac) : 1/ tombé du ciel, qui est un don de Dieu / du Ciel ; 2/ inné(e) * godless (a) : athée - godless communism : (le) communisme athée * godmother (n) : marraine (f) * Godspeed / godspeed (n) (arch.) : - Godspeed! : Bon voyage ! * goer (n) : (en compo.) adepte (m/f), habitué(e) - cinema goer : spectateur, habitué (n) des salles (syn. film goer, picture goer) - gym goer : adepte des salles de gym * goggle (v) (intr.) : regarder en roulant de gros yeux (at sth, qch) * going (n) : action d’aller, allure (f), marche (f) - That is very good going: C’est là une très bonne allure, c’est là aller bon pas - Make a break while the going is good : Faites une pause tant qu’il est encore temps * going-away (mod.) de départ - going-away party : fête de départ (f), pot de départ (fam.) * goings-on (n pl.) : 1/ faits et gestes (pl.), agissements (pl.), manigances (f pl.) (péj.) - These are fine goings-on! : C’est du beau ! ; 2/ ce qui se passe, événements (pl.) * gold (n) : or - black gold : or noir - gold panning : orpaillage - gold producer : producteur d’or * gold-backed (ac) : garanti(e) par un dépôt d’or, appuyé(e) sur l’or - gold-backed currency : monnaie-or (f) * golden (a) : 1/ doré(e), d’or - the Golden Age of science fiction : l'âge d'or de la science-fiction - the golden days of aviation : l’âge d’or de l’aviation - Have golden dreams! : Fais de beaux rêves !, Faites de beaux rêves ! ; 2/ préféré(e) - the golden child : a/ l’enfant chéri ; b/ l’enfant prodige - the golden girl : a/ l’enfant chérie, b/ l’enfant prodige ; 3/ [moment, occasion (f)] en or, révé(e) - the golden moment : l’occasion rêvée * gold-plated / goldplated (ac/a) : plaqué(e) or * golf (n) : (Sport) (le) golf - golf resort : terrain de golf, domaine de golf, complexe de golf * golfer (n) : golfeur, golfeuse * golly (interj.) : chic alors ! * gone (pp de to go) * gone (ppa) : - She is eight months gone : Elle en est à son huitième mois de grossesse * goner (n) (arg.) : personne qui est fichue / foutue - I thought I was a goner : J’ai cru que j’étais fichu / mon compte était bon / c’était la fin * gonna : contr. de going to * gonzo (a) (amér.) 1/ (fam.) bizarre, très particulier/-ière ; 2/ (Presse) ultra-subjectif/-ive, gonzo - gonzo journalism : journalisme ultra-subjectif (méthode d’investigation popularisée par Hunter S. Thompson) * gonzo (n) (pl. gonzos) (amér.) : journaliste ultra-subjectif, journaliste gonzo * good (a) : 1/ bon(ne) ; 2/ bon(ne), satisfaisant(e) - good condition : bon état - good idea : bonne idée (f) ; 3/ (amér.) - No thanks, I’m good : Non merci, j’ai ce qu’il faut ; 4/ - good to go? : Paré(e) ? * good (adv.) : bien - I feel good : je me sens bien * good (n) : 1/ (le) bien (au sens moral) - to return good for evil : rendre le bien pour le mal - for the good of humanity : pour le bien de l’humanité - That would do the world of good for him : Cela lui ferait un bien infini - for good : pour de bon ; 2/ - It's no good + forme -ing : Ça ne sert à rien de + inf. - to be any good : servir à qch, être utile * good and ready (paire adj.) : bien disposé(e) et prêt(e), bien décidé(e) et prêt(e), fin prêt, fin prête - I will leave when I am good and ready : Je partirai quand je serai fin prêt - to be good and ready to leave : être bien disposé et prêt au départ, être décidé et prêt à partir * good-humoured (ac) : [individu] facile à vivre, qui a bon caractère * goodies (pl.) : bonnes choses (f pl.), gâteries (f pl.) (syn. sweet things) * good-looking (ac) : beau/belle * good-natured (ac) : débonnaire * goodness (n) : 1/ bonté (f) ; 2/ (euphémisme pour God, Dieu) - I wish to goodness… : Si seulement… - my Goodness : mon Dieu - Thank Goodness! : Dieu merci ! * good-neighbourly (ac) : de bon voisinage - good-neighbourly relations : rapports de bon voisinage * good-quality (ac) : de bonne qualité * goods (n pl.) : 1/ marchandises (f pl.) - ship laden with goods : navire chargé de marchandises - to export goods : exporter des marchandises - goods elevator (amér.) : monte-charge - goods lift (brit.) : monte-charge - goods vehicle : véhicule utilitaire, poids lourd ; 2/ biens (pl.), produits (pl.) - brown goods : (l’)électronique grand public - capital goods : biens d’équipement - consumer goods : biens de consommation - custom-produced goods : biens fabriqués à la demande - finished goods : produits finis - mass-produced goods : biens produits en masse - producer goods : biens d’équipement - short-dated goods : produits sur le point d’expirer - white goods : a/ (le) linge de lit ; b/ (les) (gros) appareils électroménagers, (l’)électroménager, (le) blanc * goods-producing (ac) : de production de biens - goods-producing industries : industries de biens de consommation * goody-goody (n) : modèle de vertu, sainte-nitouche (f) (fam. et péj.) * go off (v) (went, gone) (intr.) : 1/ exploser - The ammo dump went off : Le dépôt de munitions explosa ; 2/ [alarme] se déclencher, sonner ; 3/ partir - the electric power went off : l’électricité s’éteignit * goofy (a) (amér.) : qui a deux dents de lapin - She’s goofy : Elle a deux dents de lapin * goo goo ga ga (onomatopées) : (langage enfantin) areuh areuh * gook (n) (amér.) (péj.) : 1/ soldat nord-vietnamien ; 2/ face de citron * goon (n) (fam.) : 1/ cinglé (n) ; 2/ homme de main * goose (n) (pl. geese) : 1/ oie (f) (l’animal) - wild goose : oie sauvage - goose pimples : chair de poule (syn. gooseflesh) ; 2/ (n. ind. sing.) oie (la viande) ; 3/ (expression) - to be / to go on a wild goose chase : courir après la lune * gooseflesh (n) : chair de poule (syn. goose pimples) - That gives me gooseflesh : Ça me file la chair de poule * gooseneck (n) : col de cygne (la forme) * goose step / goosestep (n) : pas de l’oie, pas cadencé - to goosestep one’s way to power : marcher au pas cadencé et atteindre le pouvioir * goosestep (v) (intr.) : marcher au pas de l’oie, défiler au pas de l’oie (aussi to goose-step) * goosestepper (n) : 1/ personne marchant au pas de l’oie ; 2/ (fig.) Nazi * Gordian (a) : gordien(ne) - to cut the Gordian knot : trancher le nœud gordien * gore (n) : sang versé - gore film : film sanguinolent, film grandguignolesque (syn. gore movie) * gorge (v) : (tr.) gaver - to gorge oneself : se gaver (on, de) ; (intr.) se gaver, s’empifrer (péj.), se goinfrer (péj.) (on, de) - to gorge oneself on junk food : se goinfrer de mauvaise bouffe * gorgeous (a) : 1/ [homme ou femme] superbe, splendide ; 2/ [chose] magnifique, formidable * gorno (n) (amalgame de gory et de porno) : film de tortures * gorse (n) : ajonc(s) * gory (a) : 1/ sanglant(e) (syn. bloody) - gory film film sanguinolent ; 2/ [details] (fig.) horrible - in gory detail : dans toute son horreur * gossamer (n ind. sing.) : 1/ fils de la vierge (pl.) ; 2/ gaze (f) ; 3/ étoffe transparente (f) * gossamer (a) : léger, impalpable, fragile (comme un toile d’araignée) * gossip (n) : 1/ commérage - a piece of gossip : un potin ; 2/ commère (f) * gossip (v) (intr.) : bavarder (about, sur), cancaner (about, sur) * go-slow (n) (brit.) : grève perlée (f) (syn. slowdown , amér.) * got (prét. et pp de to get) * gotta : contr. de got to * gotten (pp amér. de to get) * gourmet (a) : gastronomique - gourmet food : mets gastronomiques (pl.) - gourmet food shop : épicerie fine (f) (var. amér. gourmet food store) * gout (n) : goutte (f) (la maladie) * govern (v) (tr.) : gouverner * government (n) : 1/ gouvernement (l’activité), administration (f) ; 2/ gouvernement (l’organisme) - to head a government : être à la tête d’un gouvernement - puppet government : gouvernement fantoche - government bond : obligation d'État, bon du Trésor - government propaganda : propagande gouvernementale - government spending : dépenses publiques (f pl.) * government-subsidised/-ized (ac) : subventionné(e) par le gouvernement - government-subsidised consortium : consortium subventionné par le gouvernement * governor (n) : gouverneur * governorate (n) : governorat * governorship (n) : fonctions (f pl.) de gouverneur * gown (n) : robe (f) - ball gown : robe de bal - dressing gown (brit.) : a/ robe de chambre, b/ peignoir (de bain) * goy (n) : goy, non-Juif / non-Juive * G.P. (n) (init. de general practitioner) (brit.) : médecin généraliste, généraliste, médecin traitant, omnipraticien * GPS (n) (init. de global positioning system) : système de localisation GPS * grab (n) : 1/ vol - to be up for grabs : être à saisir, être bon à prendre ; 2/ grappin * grab (v) (tr.) : empoigner, agripper, se saisir de, saisir - to grab a circular saw : empoigner une scie circulaire * grabber (n) : 1/ (au plur. grabbers) pince de préhension (pour ramasser les papiers gras, les saletés) ; 2/ (personne) accapareur - land grabber : accapeur de terres ; 3/ (Presse) article qui attire l’attention, nouvelle qui retient l’attention - headline grabber : nouvelle faisant les gros titres, gros titre * grace (n) : 1/ grâce (f) ; 2/ délai de grâce - grace period : délai de grâce ; 3/ bénédicité, grâces (pl.) * grace (v) (tr.) : 1/ embellir ; 2/ honorer * graceful (a) : gracieux/-euse * gracefully (adv.) : 1/ gracieusement, avec grâce ; 2/ avec dignité * gracefully come down (vc) (intr.) : (Av.) faire un atterrissage en douceur, atterrir sans incident * grade (n) (fa) : 1/ niveau - You don't make the grade : Vous n'êtes pas au niveau requis ; 2/ (amér.) classe (f) (de sixième, etc.) - to repeat a grade : redoubler une année - to skip a grade : sauter une classe - the eighth grade : la quatrième - the eleventh grade : la première - the ninth grade : la troisième - the seventh grade : la (classe de) cinquième (numérotation différente) - the sixth grade : la sixième - the tenth grade : la seconde - the twelfth grade : la terminale ; 3/ (svt au pl. grades) (amér.) note scolaire (f) - to receive a grade for a subject : avoir une note pour une matière - What grade did you get? – I got a B : Quelle note as-tu eue ? – J'ai eu 15 - a fail grade : l'échec - a pass grade : la réussite - to manage average grades : avoir des notes moyennes - to overstate students’ grades : gonfler les notes des étudiants - grade book : cahier de notes (du professeur) - grade inflation : (le) gonflement des notes * grade (v) (tr.) : 1/ (tr.) classer ; 2/ (tr.) (amér.) noter (des élèves) ; (intr.) noter - to grade hard : noter sec * grading (n) : 1/ classement ; 2/ notation (f) (des élèves) - unfair grading : notation injuste - grading policy : style de notation, régime de notation - grading system : système de notation * gradually (adv.) : progressivement * graduate (a) : de deuxième cycle - graduate school : institut d’études supérieures * graduate (n) : 1/ - high school graduate : bachelier/-ière ; 2/ licencié(e), diplômé(e) universitaire * graduate (v) (fa) (intr.) : obtenir son diplôme, finir ses études * graduation (n) (fa p) : 1/ obtention de diplôme ; 2/ remise de diplômes (au lycée ou à la fac) - graduation ceremony : cérémonie de remise des diplômes - graduation party : fête de fin d’études, soirée de fin d’études * graf (n) (tronc. de paragraph, paragraphe, avec simplification orthographique) - nut graf pivot, idée maîtresse (d’un article de fond, d’un reportage) * graffiti (n ind. sing.) : graffitis (pl.) - a piece of graffiti : un graffiti * graffiti (v) (tr.) : mettre des graffitis sur * graffiti-laden (ac) : couvert(e) de graffitis - graffiti-laden background : arrière-plan barbouillé de graffitis * graffiti-resistant (ac) : anti-graffitis - graffiti-resistant coating : revêtement anti-graffitis * graft (n) (brit.) : travail pénible, boulot pénible - hard graft : boulot * graft (v) (tr.) : greffer * Grail (n pr.) : Graal - the Holy Grail : le Saint Graal * grain (n) : 1/ (n ind. sing) (amér.) céréales (f pl.) ; 2/ (pl.) (amér.) grains : grains (de céréales) ; 3/ grain (de sel, de sable) ; 4/ (n ind. sing.) fil (du bois) * grammar (n) : grammaire (f) * grammarian (n) : grammairien, grammairienne * grammatical (a) : grammatical(e) * grammatically (adv.) : sur le plan grammatical * gramophone (n) : gramophone * granary (n) (pl. granaries) : grenier (à céréales) * grand (a) (fa) : 1/ grandiose, splendide, majestueux/-euse - in the grand scheme of things : dans le grand ordre des choses ; 2/ solennel(le) ; 3/ sensationnel(le), formidable ; 4/ - grand larceny : vol de grande envergure, vol qualifié * grand (n) : 1/ (brit.) mille livres ; 2/ (amér.) mille dollars * grand (n) : piano à queue * grandeur (n) : grandeur (f) (au sens de prestige) - faded grandeur : (la) grandeur passée * grandfather (n) : grand-père - paternal grandfather : grand-père paternel, grand-père du côté parternel - grandfather clock : horloge de parquet * grandiloquence (n) : grandiloquence (f) * grandiloquent (a) : grandiloquent(e) * grandiloquently (adv.) : avec grandiloquence, sur un ton grandiloquent * grandly (adv.) : 1/ majestueusement - to live grandly : mener grand train, vivre sur un grand pied ; 2/ solennellement, en grande pompe * grandma (n) : bonne-maman (f), mémé (f) (fam.) * grandmother (n) : grand-mère (f), mémé (fam.) * grandniece (n) : petite-nièce (f) * grandpa (n) : bon papa * grandstand (n) : tribune (f) * grandstand (v) (intr.) : 1/ jouer pour la galerie ; 2/ faire l’intéressant(e) * grandstanding (n) : grands discours (pl.), esbroufe (f) * granola (n ind. sing.) : muesli, musli - (amér.) a granola person : un écolo – (amér.) granola people : (des) écolos) * granola (a) : écolo (a) * granola (n) (pl. granolas) (tronc. de granola person) : écolo (n) * grant (n) : subvention (f), bourse (f) * grant (v) (tr.) : 1/ (sth) accorder (qch) ; 2/ (sb) accorder à (qn) ; 3/ reconnaître, admettre * granted (ppa) : qui a été donné(e), acquis(e) - to take sth for granted : trouver qch de tout à fait naturel, considérer qch comme allant de soi - to take it for granted that… : trouver normal que… - to be taken for granted : aller de soi, être couramment admis(e) * granted (that) (loc. conj.) : il est vrai que, d’accord * granting (that) (loc. conj.) : en admettant que, si l’on admet * Granting (that) (loc. conj.) (t d p) : Mettons que * grantsmanship (n) (hum.) : recherche d’aides financières, art d’obtenir des subventions * grape (n) : raisin - grape juice : jus de raisin - grape picker : vendangeur * grapevine (n) : 1/ vigne à raisin ; 2/ (fig.) téléphone arabe - on the grapevine : par le téléphone arabe * graph (n) : graphique, diagramme - bar graph : diagramme à barres * graphene (n) : graphène * graphene-free (ac) : exempt(e) de graphène, sans graphène - graphene-free mask : masque sans graphène * graphically oriented (ac) : (Inf.) à base graphique - graphically oriented user interface : interface à base graphique * graphics (n) : 1/ (sing.) (le) graphisme - computer graphics : (l’)infographie (f) - graphics tablet : tablette graphique (Inf.) - graphics programmer : programmeur-infographiste ; 2/ (pl.) graphiques, dessins, images (f pl.) - computer graphics : images infographiques (pl.), images informatiques (pl.) - digital graphics : dessins numériques * grapple (v) (intr.) : se colleter (with, avec) * grappling (n) : lutte à mains nues * grasp (n) : 1/ étreinte (f) ; 2/ compréhension (f) * grasp (v) (tr.) : agripper, étreindre, saisir, se saisir de, empoigner * grass (n) : 1/ herbe (f) - buffalo grass (amér.) : herbe à bison (voir aussi 2/) - grass snake : couleuvre (f) ; 2/ gazon - to cut the grass : tondre le gazon - buffalo grass (amér.) : gazon américain (ne formant pas de mottes) - grass trimmer : coupe-bordure (masc.) ; 3/ marijuana (f), herbe (f) * grass (v) (intr.) : fournir des indications (on sb, sur qn), rapporter (on sb, sur qn), cafarder (on sb, sur qn) * grasshopper (n) : sauterelle (f) * grassland (n) : prairies (f pl.) * grassroots (n) (amér.) : (l’)électorat de base, (la) base * grass up (v) (tr.) (arg. brit.) : dénoncer qn, moucharder qn * grassy (a) : herbeux/-euse, gazonné(e), engazonné(e) - the grassy knoll : le talus herbeux (à Dallas, d’où lors de l’assassinat du président américain Kennedy) - grassy median : terre-plein central engazonné (d’autoroute) * grate (v) (tr.) : 1/ (tr.) râper ; 2/ (intr.) grincer, crisser ; 3/ (intr.) être agaçant(e), être énervant(e) - That voice grates on me : Cette voix-là me tape sur les nerfs * grateful (a) : reconnaissant(e) (anton. ungrateful) * gratefully (adv.) : avec gratitude * grater (n) : râpe (f) * gratify (v) (tr.) : satisfaire * grating (n) : grillage * grave (n) (fa) : tombe (f) - to be as silent as a grave : être muet comme une tombe, être muet comme une carpe - mass grave : charnier, fosse commune (f) - unnamed grave : tombe anonyme * gravel (n) : gravier - gravel road : route de gravier (f), chemin de gravier * gravelly (a) : 1/ recouvert de gravier, contenant du gravier, graveleux ; 2/ (Mus.) [voix] rocailleux/-euse - gravelly voice : voix rocailleuse (f) * graveyard (n) : cimetière - auto graveyard : cimetière de bagnoles * gravitation (n) : gravitation (f) * gravitational (a) : gravitationnel(le) - gravitational field : champ gravitationnel * gravity (n) (fa p) : 1/ gravité (f), sérieux (n) ; 2/ gravitation (f), pesanteur (f), gravité (f) - the earth's gravity : l'attraction terrestre (f) - centre of gravity : centre de gravité - force of gravity : gravitation - lack of gravity : absence de pesanteur * gravy (n) : 1/ jus de viande ; 2/ sauce (f) - gravy boat : saucière (f) ; 3/ profit, bénéfice - gravy train : gros lot, bon filon * gray (a) : voir grey (a) * graying (a) : grisonnant(e) * grayling (n) : ombre (masc.) (le poisson) * graze (v) : 1/ (intr.) paître, brouter ; 2/ (tr.) raser, effleurer, frôler * grazer (n) : 1/ animal qui broute, brouteur ; 2/ personne qui grignote, grignoteur * grazier (n) : emboucheur, herbager * grazing (a) : rasant(e) * grazing (n) : dépaissance (f), paissance (f) (du bétail) - grazing land : lieu de dépaissance, zone de pâturage - grazing season : saison de dépaissance * grease (n) : graisse (f) - elbow grease : huile de coude * grease (v) (tr.) : graisser * greasing (n) : graissage, lubrification (f) - centralised greasing : lubrification centralisée * great (a) : 1/ grand(e), important(e) ; 2/ formidable (fam.), super (fam.) - It's great! : C'est formidable ! - That would be great, thanks! : Ça serait super, merci ! * great (interj.) : formidable !, super !, génial ! * Great Britain (n pr.) : (la) Grande-Bretagne * greater (a) (compar. de supériorité de great) : plus grand(e) - the Greater Manchester Police : la police du grand Manchester * greatest (a) (superl. de supériorité de great) : le plus grand, la plus grande * Great Financial Crisis (the) : (la) Grande crise financière de 2008 * great grandma (n) arrière-grand-mère (f) * great great grandma (n) arrière arrière-grand-mère (f) * greatly (adv.) : grandement - to praise greatly : encenser, porter aux nues * Greece (n pr.) : (la) Grèce - ancient Greece : (la) Grèce antique * greed (n) : avidité (f), rapacité (f) * greedy (a) : 1/ avide, rapace ; 2/ gourmand(e) * greedily (adv.) : 1/ avidement ; 2/ avec gourmandise * Greek (a) : grec/-ecque (sans maj.) * Greek (n pr.) : Grec/-ecque (le ressortissant) * Greek (n) : grec (la langue) * Green (n) : vert (n), écologiste (n) - the Greens (n pl.) : (Politique) les verts * green (a) : 1/ de couleur verte, vert(e) - green beans : haricots verts - green light : feu vert - the green room : (Théâtre) le foyer des acteurs ; 2/ végétal(e) - green wall : mur végétal ; 3/ (fig.) vert(e), écologique, écolo (fam.) - green activism : militantisme écologique - green activist : militant écologique - green lifestyle : mode de vie écologique - the Green lobby : le groupe de pression des verts - green materials : matériaux écolos - the Green Party : le parti des verts - green technology (abr. green tech) : technologies vertes (f pl.) - the green vote : le vote des écologistes * green (n) : vert (la couleur) - avocado green : vert avocat * green (v) (tr.) : 1/ verdir - to green one's office : verdir son bureau ; 2/ faire reverdir - to green deserts : faire reverdir les déserts ; 3/ rendre plus écologique, écologiser * greenback (n) (amér.) : 1/ billet d’un dollar ; 2/ the greenback : le billet vert, le dollar américain * greenery (n) : verdure (f) * greengrocer (n) (brit.) : boutique de fruits et légumes - at the greengrocer's : chez le marchand de fruits et légumes * greenhouse (n) : serre (f) - the greenhouse effect : l'effet de serre - greenhouse gases : gaz à effet de serre * greening (n) : 1/ verdissement ; 2/ écologisation (f) * greenlight (v) (tr.) : donner le feu vert à * greentech (n) : technologies (pl.) vertes (aussi green tech) - the greentech revolution : la révolution des technologies vertes * greet (v) (tr.) : 1/ saluer ; 2/ accueillir * greeting (n) : 1/ salutation, salut, bonjour (fam.), coucou (fam.) - Greetings! : Salut ! - Greetings from New York! : Bonjour de New York ! ; 2/ vœu - Season’s greetings! : Bonnes fêtes de fin d’année !, Joyeuses fêtes ! * gregarious (a) : aimant vivre en société, grégaire * gregariousness (n) : grégarisme, esprit grégaire * grew (prét. to grow) * grey (a) : gris(e) (voir gray) * grid (n) : 1/ grille ; 2/ (Élect.) réseau - to be off the grid : être hors réseau, ne être raccordé au réseau électrique, ne pas être sous réseau - power grid : réseau électrique * griddle (n) : 1/ gril en fonte, plaque en fonte ; 2/ crible (de mineur) * griddle (v) (tr.) : 1/ griller, faire griller ; 2/ cribler * grid-tied (ac) : (Élect.) couplé(e) au réseau (électrique), connecté(e) au réseau (électrique) * gridlock (n) : 1/ (lit. : blocage de la grille des rues) embouteillage absolu ; 2/ paralysie d’un réseau * grief (n) (fa) : chagrin, douleur - Good grief! : Bon sang ! - grief counsellor : psychologue spécialiste du deuil * grievance (n) : grief * grieve (v) (tr.) : chagriner * grifter (n) (amér.) : escroc, arnaqueur * grill (v) (tr.) : faire griller * grim (a) : sinistre - grim death : mort sinistre (f), mort horrible - grim lot : triste condition (f) * grimly (adv.) : d’un air sombre * grime (n) : crasse (f) * grimy (a) : crasseux/-euse * grin (n) : sourire * grin (v) (intr.) : avoir un large sourire * grind (v) (ground, ground) : 1/ (tr.) moudre, broyer, écraser ; 2/ (tr.) user par frottement, roder ; 3/ (tr.) (Usin.) rectifier ; 4/ (intr.) [engrenages] grincer ; 5/ (intr.) s'arrêter, s'immobiliser * grinder (n) : 1/ broyeur - coffee grinder : moulin à café ; 2/ (Usin.) meuleuse (f) - bench-type grinder : machine à meuler d'établi ; 3/ (Usin.) affûteuse (f) ; 4/ (Usin.) rectifieuse (f) - precision grinder : rectifieuse de précision - surface grinder : rectifieuse plane ; 5/ hachoir - meat grinder : a/ hachoir à viande ; b/ (fig.) moulinette (f), boucherie (f), fosse d’attrition - [troops] to be sent into a meat grinder (fig.) : [soldats] être envoyé(s) à la boucherie ; 6/ molaire (f) * grinding (a) : 1/ écrasant(e) - grinding poverty : misère écrasante (f) ; 2/ éreintant(e), épuisant(e) ; 3/ immobilisant(e) - to bring sth to a grinding halt : provoquer l’arrêt complet de qch * grinding (n) : 1/ meulage, broyage ; 2/ (Usin.) rodage - grinding sludge : résidus (pl.) de rodage ; 3/ (Usin.) rectifiage, rectification (f) - face grinding : rectification plane - fine grinding : rectification de haute précision (aussi precision grinding) * grind out (v) (ground, ground) (tr.) : produire * grinned (prét. de to grin) * grinned (pp de to grin) * grip (n) : 1/ prise (f), poigne (f) - to take a grip of oneself : se ressaisir ; 2/ (Cin.) key grip : chef machiniste - best boy grip : assistant machiniste * grip (v) (tr.) : agripper, saisir * gripper (n) : pince (de préhension) (f), préhenseur multidoigt * gripping (a) : palpitant(e), saisissant(e) * gripping (n) : étreinte (f), prise (f) * grisly (a) : horrible * grist (n) : sable * gristle (n) : cartilage * grit (v) (tr.) : dans l’expression to grit one’s teeth : serrer les dents * grizzle (v) (intr.) : pleurnicher * groan (v) (intr.) : 1/ grogner ; 2/ gémir ; 3/ [objet] grincer * groceries (n pl.) : (amér.) provisions (f pl.) * groggy (a) : sonné(e) (sous le coup) * groin (n) (fa) : 1/ aine - in the groin : à l'aine, (fam.) dans les testicules ; 2/ arête (de voûte) ; 3/ (brit.) épi (pour retenir le sable) (aussi groyne) * groom (n) : 1/ (abr. de bridegroom) jeune marié ; 2/ palefrenier * groove (n) 1/ entaille (f) - sharpening groove : entaille pour aiguiser (dans une pierre de grès) ; 2/ (Agric.) sillon - in the groove (arg. du jazz) : dans le rythme, dans la note ; 3/ (Mus.) morceau de musique remarquable * groove (v) : 1/ (tr.) (intr.) rainer ; 2/ (intr.) jouer de façon inspirée, jouer magnifiquement bien * grope (about) (v) (intr.) : chercher à tâtons * gross (a) (fa) : 1/ grossier/-ière ; 2/ répugnant(e), dégoûtant(e), dégueulasse, dégueu (fam.) * grossly (adv.) : 1/ grossièrement ; 2/ extrêmement - grossly misleading : tout à fait trompeur, tout à fait mensonger * grossness (n) : 1/ grossièreté (f) ; 2/ saleté (f), crasse (f) * gross out (v) (tr.) (arg. amér.) : écœurer, dégoûter * grotesque (a) : grotesque - the grotesque (adj. subst. sing.) : le grotesque * grotesquely (adv.) : de façon grotesque, de manière grotesque * grotesquery (n) : aspect grotesque, caractère grotesque * grouch (n) : rouspéteur/-euse, grincheux/-euse, pisse-vinaigre * grouch (v) (intr.) : rouspéter (about, à propos de) * ground (n) : 1/ terrain - down on the ground : sur le terrain - to hold one’s ground : ne pas bouger - ground traces : traces au sol - ground water : eau des nappes phréatiques (aussi groundwater) ; 2/ (pl. grounds) lieux (pl.) - proving grounds : champ d’épreuves, terrain d’essais (syn. testing grounds) - spawning grounds : lieux de ponte ; 3/ (Av.) sol - to hit the ground : [avion] heurter le sol, s’écraser au sol - ground controller : contrôleur au sol, contrôleur sol ; 4/ (pl. grounds) raisons (pl.) - There are some grounds for hope : Il y a des raisons d’espérer - there are grounds for + forme -ing : il y a tout lieu de + inf. * ground (v) (tr.) : 1/ (amér.) (Élect.) mettre à la terre (un appareil électrique) ; 2/ clouer au sol, immobiliser (an aircraft, un aéronef) - to be grounded : être immobilisé(e) au sol ; 3/ priver de sortie (un adolescent) * ground (prét. de to grind) * ground (pp de to grind) * ground-breaking (ac) : 1/ révolutionnaire ; 2/ avant-gardiste, d’avant-garde, novateur/-trice (aussi groundbreaking) * groundskeeper (n) : gardien de stade (syn. groundsman) * groundsman (n) : gardien de stade (syn. groundskeeper) * groundswell (n) : vague de fond, lame de fond, raz-de-marée * groundwater (n) : eau des nappes phréatiques (aussi ground water) - groundwater contamination : pollution des nappes phréatiques * groundwork (n) : travail préparatoire - to lay the groundwork (for sth) : préparer le terrain (pour qch), jeter les bases (de qch) * group (n) : 1/ groupe, ensemble - group photo : photo de groupe ; 2/ (Milit.) groupe, groupement - battle group : groupe de bataille, groupe de combat, groupement tactique ; 3/ groupe, association (f) - civil liberty group : association de défense des libertés civiques - hate group : groupe incitant à la haine, groupe xénophobe - interest group : groupe d’intérêt, groupe de pression - pressure group : groupe de pression - work group : groupe de travail - group work : travail de groupe ; 4/ (Mus.) formation (f), groupe * group (v) (tr.) : grouper, regrouper (around, autour de) * grouper (n) (pl. groupers ou grouper) : mérou (on trouve aussi grouper fish) - a big grouper : un gros mérou - grouper abound : les mérous abondent - fried grouper : du mérou frit * groupie (n) : admirateur/-trice, compagnon/-agne de tournée, minet(te) * groupware (n ind. sing.) : (Inf.) matériels et logiciels (pl.) pour le travail de groupe * grouse (n) : 1/ (pl. grouse) lagopède d’Écosse ; 2/ plaintes (f. pl.), râleries (f. pl.) - Why the grouse? : Pourquoi tu râles ? * grouse (v) (intr.) : se plaindre, râler, rouspéter, ronchonner * grouser (n) : râleur/-euse, rouspéteur/-euse * grove (n) : bosquet, taillis - beech grove : hétraie (f) - citrus grove : verger d’agrumes - orange grove : orangeraie (f) * grovel (v) (intr.) : ramper (to sb, devant qn), s’aplatir (to sb, devant qn) * grovelling (a) : rampant(e) * grow (v) (grew, grown) : 1/ (tr.) faire pousser ; 2/ (intr.) grandir, croître, pousser ; 3/ + adj. : devenir + adj. - to grow increasingly outdated : être de plus en plus dépassé - to grow sixfold : sextupler - to grow soft : s’amollir * grower (n) : producteur, productrice - cannabis grower : producteur de cannabis * growing (a) : en pleine croissance, qui monte * growl (n) : grognement * growl (v) (intr.) : grogner * grown (pp de to grow) * grown (a) : adulte - a grown man : un adulte - a grown woman : une adulte * grown-up (n) : adulte (n) * growth (n) : 1/ croissance, accroissement - economic growth : croissance économique - sales growth : croissance des ventes - traffic growth : accroissement de la circulation - zero growth : (la) croissance zéro (jarg.) - growth hormone : hormone de croissance ; 2/ excroissance * grub (n) : 1/ larve (f) ; 2/ vers, asticot ; 3/ bouffe (f), boustifaille (f) (vulg.) * grub (v) (tr.) : 1/ (tr.) déterrer ; (intr.) creuser ; 2/ (intr.) (arg.) bouffer, baffrer * grubby (a) : 1/ plein(e) de vers, véreux/-euse ; 2/ malpropre, sale, crasseux/-euse * grudge (n) : motif de rancune, rancune (f) - to bear a grudge against sb : avoir de la rancune contre qn, avoir une dent contre qn * grudge (v) (tr.) : en vouloir à - to grudge sb his success : en vouloir à qn de sa réussite * grudgingly (adv.) : avec réticence, à contrecœur * grueling (amér.) / gruelling (brit.) : éreintant(e), éprouvant(e), exténuant(e) - to be in for a pretty gruelling time : être bon pour quelques moments bien éprouvants * gruesome (a) : horrible, repoussant(e) - a gruesome end : une mort horrible * gruff (a) : 1/ [voix] rauque, [rire] gros ; 2/ [personne] bourru(e) * gruffly (adv.) : de façon bourrue * grumble (n) : 1/ grondement ; 2/ plainte (f), récrimination (f) - My main grumble is about… : Ce qui me met le plus en boule, c’est… * grumble (v) (intr.) : 1/ gronder ; 2/ grommeler, se plaindre, rouspéter, râler (fam.) - I would not grumble at that : Je ne dirais pas non * grumbling (a) : grognon(ne) * grumbling (n) : plaintes (f pl.), récriminations (f pl.) * grump (n) (fam.) : grognon * grunge (n) : saleté (f) * grunt (n) : soldat, troufion (fam.) - infantry grunts : soldats d’infanterie * grunt (v) (intr.) : grogner * G-string (n) : string, culotte brésilienne (f) * GT (n) (abr. de grand tourer, voiture de grand tourisme) * guarantee (n) : 1/ garantie (f) ; 2/ garantie financière, caution (f) * guaranteed (ppa) : garanti(e) - guaranteed delivery : livraison garantie (f) * guard (n) (u muet) : 1/ carter de protection, protection (f) - machine guards : protections pour machines - guard rail : rambarde, garde-corps - guard stone : chasse-roue ; 2/ surveillant - crossing guard : surveillant des traversées piétonnes ; 3/ pl. guards : (la) garde - the Horse Guards : la Garde à cheval * guard (v) (u muet) : 1/ (tr.) mettre des protections à ; 2/ (tr.) surveiller, garder - Guard your tongue : Surveille ton langage / Surveillez votre langage ; (intr.) se protéger - to guard against fire : se protéger contre l’incendie * guardian (n) (u muet) : 1/ tuteur/-trice ; 2/ gardien/-ienne - guardian of the truth :gardien de la vérité - guardian angel : ange gardien * guarding (n) : 1/ (l'activité) pose de protections - to require guarding : nécessiter la pose de protections - barrier guarding : protection par des barrières ; 2/ (le résultat) protections (f pl.) * guardrail (n) : 1/ garde-corps (masc.), rampe (f) (d’escalier) ; 2/ rambarde (f) (de balcon) ; 3/ glissière (f) (de voie de circulation) (aussi guard rail) * gudgeon (n) : goujon (l'animal) * guess (n) (pl. guesses) : 1/ supposition (f) ; 2/ estimation (f) * guess (v) (tr.) : 1/ deviner ; 2/ supposer ; 3/ (amér.) penser (syn. to think) * guest (n) : invité(e) - uninvited guest : personne qui s’invite, intrus - guest bedroom : chambre d'amis * guestbook (n) : livre d’or * guffaw (v) (intr.) : rire bruyamment * guidance (n) : 1/ guidage - inertial guidance : guidage inertiel - guidance system : dispositif de guidage ; 2/ gouverne (f) * guide (n) : 1/ (= livre) guide, manuel, mode d'emploi - installation guide : guide d’installation - operations guide : guide des unités de production (d’une compagnie) - selection guide : guide pour choisir - style guide : code typographique (syn. style handbook, style book) - troubleshooting guide : guide d’identification des défauts ; 2/ (= appareil) - thread guide : guide-fil * guide (v) (tr.) : guider * guidelines (n pl.) : instructions (f pl.), consignes * guild (n) : corporation (f) * guildhall (n) : maison des guildes, maison des corporations - the Guidhall : l’hôtel de ville de Londres * guile (n) : ruse (f), fourberie (f) * guillotine (n) : 1/ guillotine (f) - guillotine execution : guillotinage ; 2/ (brit.) (fa) massicot * guilt (n) : culpabilité (f) * guilt-laden (ac) : - guilt-laden offender : délinquant rongé par la culpabilité - guilt-laden temptations : tentations coupables (f pl.) * guilty (a) : coupable * guinea (n) : dans l’expression guinea pig : cobaye (au propre comme au figuré) * guitar (n) : guitare (f) - an instruction manual for the guitar : un manuel pour apprendre à jouer de la guitare - lead guitar : première guitare - guitar hero : dieu de la gratte, héros foudroyé * guitarist (n) : guitariste (m/f) * gulf (n) : 1/ golfe - the Gulf of Mexico : le Golfe du Mexique - the Gulf of Oman : le Golfe d’Oman - the Persian Gulf : le Golfe persique ; 2/ gouffre, fossé - the increasing gulf between rich and poor : l’écart sans cesse croissant entre riches et pauvres * gull (n) : mouette (f) * gullet (n) : gosier * gullibility (n) : crédulité (f) * gullible (a) : crédule * gum (n) : gencive (f) * gum (n) : gomme (f) - chewing gum : (de la) gomme à mâcher - a piece of chewing gum : un chewing-gum - mint gum : gomme à la menthe (verte) * gumming up (n) : gommage, encrassage * gumshield (n) (amér.) : (Boxe, etc.) protège-dents (masc.) * gum up (v) : 1/ (tr.) gommer, encrasser ; (intr.) devenir collant ; 2/ (tr.) bloquer - to gum up the traffic : entraver la circulation ; * gun (n) : 1/ fusil - elephant gun : fusil à éléphants ; 2/ pistolet - disintegrator gun : pistolet désintégrant ; 3/ (amér.) arme à feu - to draw a gun on sb : mettre qn en joue avec une arme à feu, braquer une arme à feu sur qn - cold gun : arme vide, arme non chargée - live gun : arme chargée - prop gun : arme factice - gun room : a/ armurerie (f) ; b/ salle d’armes (dans un château) (aussi gunroom) ; 4/ canon - snow-making gun : canon à neige ; 5/ tueur - hired gun : a/ tueur à gages ; b/ mercenaire * gunboat (n) : canonnière (f) - gunboat diplomacy : diplomatie de la canonnière * gunfire (n) : coups de feu (pl.) * gung-ho (n) : très enthousiaste (about sth, à l’idée de qch) ; va-t-en guerre * gunman (n) : malfaiteur armé * gunner (n) : (Milit.) servant (d’une arme) * gunroom, voir gun room (à gum) * gunship (n) : hélicoptère de combat - helicopter gunship : hélicoptère de combat * gunshot (n) (amér.) : coup de feu - gunshot wound : blessure par arme à feu * gunslinger (n) : bandit armé * gust (n) : rafale (f), bouffée (f) (d'air) * gust (v) (intr.) : tomber en rafales * gusto (n) : enthousiasme, entrain - with gusto : avec entrain * gut (n) : 1/ - a gut : du ventre, du bide (fam.), de la bedaine (fam.) - gut instinct : instinct viscéral ; 2/ - guts (pl.) : intestins, boyaux - to flog one’s guts out : suer sang et eau ; 3/ (guts, pl.) courage (sing.), du cran (arg.) * gut-splitting (ac) : [rire] à s’éclater la rate - gut-splitting laughter : rire inextinguible * gutter (n) : 1/ caniveau - (Presse) gutter journalism : journalisme de bas étage (syn. junk journalism) ; 2/ - roof gutter : gouttière (f) (de toit) * guttersnipe (n) : 1/ gamin des rues ; 2/ (péj.) misérable (n), traîne-misère (masc.) * guv’nor (n) (= governor) : patron * guy (n) : 1/ (Naut.) hauban ; 2/ corde (f) (de tente) - guy rope : corde de tente * guy (n) (du nom de Guy Fawkes) : 1/ effigie de Guy Fawkes ; 2/ (amér.) gars, mec, type - you guys (pl) : (en s’adressant à des gens et selon le cas) les gars, les mecs, les filles, les amis, les copains, tout le monde ; 3/ (argot) poudre d’escampette - to do a guy : prendre la poudre d’escampette, s’esquiver - He gave me the guy : il m’a planté là, il m’a brûlé la politesse (syn. He gave me the slip) * guy (v) (guyed) (tr.) : fixer avec des cordes * guzzle (v) (tr.) : 1/ engloutir (de la nourriture), bouffer, bâfrer ; 2/ siffler (de la boisson), pinter, lamper - to guzzle fuel : siffler du carburant * guzzler (n) : 1/ bâfreur ; 2/ sac à vin, pochard - gas guzzler (amér.) : véhicule gourmand, gros consommateur de carburant, gouffre à essence * GW (n) (init. de global warming : réchauffement de la planète) * gym (n) (tronc. de gymnasium) : gymnase, salle de gym - to work out in a gym : faire de la musculation dans une salle de gym, faire de la muscu en salle (fam.) - gym goer : adepte des salles de gym - gym instructor : moniteur de gym - gym machine : appareil de culture physique - gym shoes (brit.) : chaussures de sport, baskets * gymnasium (n) : gymnase, salle de gym * gynaecologist (brit.) / gynecologist (amér.) (n) : gynécologue * gyno (n) : 1/ (abr. de gynaecological (brit.) / gynecological (amér.)) gynécologique - gyno exam : examen gynécologique ; 2/ (abrév. de gynaecologist (brit.) / gynecologist (amér.)) gynéco * gypsy (n) (pl. gypsies) : romanichel(le) pc5mbafm6mz8bj28qs29hfxkl7h3aps Vocabulaire anglais-français à l'intention des apprenants avancés/H 0 78013 768164 767572 2026-06-19T07:01:06Z Elnon 41284 /* H */ Complément 768164 wikitext text/x-wiki {{../Index}} === H === * haberdashery (n) : 1/ (brit.) mercerie (f) ; 2/ (amér.) magasin de vêtements pour hommes * habit (n) (fa) : 1/ habitude (f) - bad habits : mauvaises habitudes ; 2/ dépendance (f) - to kick the habit : (selon le cas) arrêter de fumer, arrêter de se droguer * habitat (n) : habitat - animals in their natural habitat : animaux dans leur habitat naturel * habit-forming (ac) : qui crée une dépendance, dont on ne peut se débarrasser, à accoutumance * habituate (v) (tr.) : habituer (sb to sth, qn à qch) * hack (n) : (Presse) pisse-copie (masc.) * hack (v) (tr.) : hacher * hack and whack (v coord.) : dans l’expression to hack and whack one’s way : se frayer un chemin à coups de machette (through the bush, dans les broussailles) * hacker (n) : 1/ (Inf.) as de la programmation, as de l’informatique, as des réseaux ; 2/ (Inf.) pirate informatique, intrus (masc.) - hacker hangout : repaire de pirates (informatiques) * hackerism (n) : (Inf.) terme du jargon des as de la programmation * hacking (nv) 1/ (angl. gén.) hachage ; 2/ (Inf.) effraction informatique (f), intrusion (f), piraterie (f) - hacking war guerre entre pirates * hackspeak (n) : (Inf.) (le) jargon des pirates informatiques * had (prét. de to have) * had (pp de to have) * haddock (n) : églefin - smoked haddock : (de l’)églefin fumé * haemoglobin (n) (brit.) : hémoglobine (f) (var. amér. hemoglobin) * haemorrhage (n) (brit.) : hémorragie (f) (var. amér. hemorrhage) * haemostatic (brit.) (a) : hémostatique, qui arrête l’écoulement du sang (var. amér. hemostatic) * haggis (n) : hachis écossais (de cœur, mou et foie de mouton) * haggle (v) (intr.) : marchander * hail (n) : grêle (f) - hail insurance : assurance contre la grêle * hail (v) (intr.) : grêler * hail (v) : 1/ (tr.) héler ; 2/ (tr.) saluer (syn. to salute), accueillir très favorablement ; (intr.) - to hail from... : être originaire de... * hair (n) : 1/ poil ; 2/ cheveu ; 3/ (sans article) cheveux (pl.) - to get one’s hair cut : se faire couper les cheveux - to ruffle sb’s hair : ébouriffer les cheveux de qn- - to let one’s hair down : a/ détacher ses cheveux, laisser retomber ses cheveux ; b/ (fig.) se détendre - a crop of hair : une chevelure - chestnut hair : cheveux châtains - crew-cut hair : cheveux coupés en brosse - curly hair : cheveux bouclés - fuzzy hair : cheveux crépus - jet-black hair : cheveux de jais - shoulder-length hair : cheveux tombant sur les épaules - wavy hair : cheveux ondulés - hair band : serre-tête - hair dryer : sèche-cheveu (aussi hairdryer) - hair slide (brit.) : barrette (f) - hair spray (amér.) : laque (f) (à cheveux) - hair stylist : coiffeur ; 4/ (sans article) poils (pl.) - armpit hair : poils sous les aisselles - facial hair : poils du visage, pilosité faciale (f) ; 5/ (expressions) - to get in sb’s hair : ennuyer qn, agacer qn (syn. to get on sb’s wick (vulg. wick = penis)) * hairball (n) : boule de poils (régurgitée par un chat) * hairbrush (n) : brosse à cheveux * hairdresser (n) (brit.) : coiffeur, coiffeuse - at the hairdresser’s : chez le coiffeur, chez la coiffeuse * hairdryer (n) : sèche-cheveux (aussi hair dryer) * hair-raising (ac) : à faire dresser les cheveux sur la tête * hairy (a) : 1/ poilu(e) ; 2/ chevelu(e) * hake (n) : colin * Halal (a) : halal - Halal meal : repas halal * hale (a) : en pleine forme, en pleine santé - hale and hearty : vigoureux/-euse * hale and hearty (paire adj.) : plein de force et de santé, en pleine forme, en pleine santé, qui est dispos(e), qui a bon pied, bon œil - to be hale and hearty : avoir bon pied, bon œil - He was very ill but he is hale and hearty again : Il a été très malade mais il est sur pieds à nouveau * half (a) : demi - half that time : la moitié de ce temps * half (n) (pl. halves) : moitié (f) - to do things by halves : faire les choses à moitié * half a bar (n) : (arg. brit.) 10 shillings * half-assed (ac) : foireux/-euse - half-assed idea : idée foireuse (f) * half-bath (nc) : toilettes avec lavabo (f pl.) / lave-mains (masc.), cabinet de toilette * half-century (n) : demi-siècle * half-empty (ac) : à moitié vide * half-full : à moitié plein(e)) * half-inch (nc) : demi-pouce (= 1,27 cm) * half-inch (ac) : d’un demi-pouce * half-inch (v) (tr.) (arg. brit.) : chouraver, piquer (syn. to pinch) * halfpenny (n) (brit.) : sou * half-price (n) : moitié prix - at half-price : à moitié prix (aussi half-price) * half-term (n) (brit.) : (Éduc.) (la) mi-trimestre (syn. amér. mid-term) - at half-term : à la mi-trimestre * halfway (adv.) : à mi-chemin - Let's meet halfway! : Coupons la poire en deux ! * halfway through (loc. adv.) : à moitié - to read a book halfway through : lire un livre à moitié * halfwit (n) : simple d’esprit, simplet, idiot du village, débile (n), demeuré (n) - that halfwit Williamson : ce crétin de Williamson * hall (n) : 1/ manoir ; 2/ (grande) salle (f) - assembly hall : salle de montage - common hall : pièce commune (f) ; 3/ vestibule * hallmark (n) : caractéristique marquante (f), marque distinctive (f), trait distinctif, cachet, signature (f) * hallow (v) (tr.) : sanctifier * hallucinate (v) (intr.) : avoir des hallucinations, halluciner * hallucination (n) : hallucination (f) * hallway (n) : vestibule, entrée (f) * halo (n) (pl. haloes) : 1/ auréole (f) ; 2/ halo, cercle lumineux * halt (n) : halte (f), arrêt - to bring to a halt : forcer à s’arrêter - to come to a halt : s’arrêter - a halt in one’s operations : une arrêt provisoire des ses activités - grinding halt : arrêt complet, interruption brutale (f) - halt sign : panneau de stop * halt (v) : (tr.) arrêter (temporairement), cesser (temporairement), faire cesser (temporairement), interrompre - to halt a process : interrompre une opération - to halt one’s operations : cesser temporairement ses activités - to halt production : interrompre la production ; (intr.) s’arrêter (temporairement), s'interrompre * halve (v) (tr.) : réduire de moitié, diviser en deux - more than halved : réduit(e) plus que de moitié * halyard (n) : drisse (f) (aussi halliard) * ham (n) : jambon * hamlet (n) : hameau * hammer (n) : marteau - emergency hammer : brise-glace (masc.) - hammer drill : perceuse à percussion - the hammer throw : le lancer de marteau - hammer thrower : lanceur de marteau * hammer (v) (tr.) : 1/ marteler (du fer, etc.) ; 2/ enfoncer (un clou) à coups de marteau * hammer drill (vc) (tr.) : percer en mode percussion * hammering (n) : martelage * hammock (n) : hamac - to swing on a hammock : se balancer sur un hamac * hamper (n) : panier à linge (syn. laundry basket) * hamper (v) (tr.) : entraver, empêcher, gêner (syn. hinder) - to hamper the production process : entraver la production * hamstring (n) : 1/ tendon ischio-jambier ; 2/ muscle ischio-jambier - to pull a hamstring : se faire un claquage à la cuisse * hamstring (v) (hamstrung2) (tr.) : paralyser * hamstrung (prét. de to hamstring) * hamstrung (p. passé de to hamstring) * hand (n) : 1/ main (f) - to be done by hand : être fait à la main - to have sth to hand : avoir qch sous la main - hand warmer : chauffe-main (masc.) - hand spinner : toupie plate (f), toupie à main - in hand : (selon le cas) en main, à la main ; en caisse, au magain ; en train, en discussion - on the one hand : d’une part - on the other hand : a/ d'autre part ; b/ en revanche ; 2/ - stable hand : garçon d’écurie ; 3/ aiguille (f) (d’une montre) - the hour hand : l’aiguille des heures, la petite aiguille * hand (v) (tr.) : 1/ remettre, passer (à la main) ; 2/ reconnaître, accorder (une qualité à qn) - to hand that… : accorder que… - I must hand it to you that… : Je dois vous accorder que… * hand-assemble (v) (tr.) : assembler à la main * hand back (v) (tr.) : rendre, remettre - to hand back a blank paper (Éduc.) : remettre une copie blanche * handbasin (n) : lavabo (syn. wash basin / washbasin) * handbill (n) : affichette (f) * handbook (n) : manuel (n), livret * h & c (abr. de hot and cold, sous-entendu water : eau chaude et eau froide) * hand-crafted/handcrafted (a) : fait (à la) main - handcrafted jewelry : bijoux (pl.) faits à la main * handcuff (v) (tr.) : mettre les menottes à, menotter * handcuffs (n pl.) : menottes (f pl.) - to put the handcuffs on sb : passer les menottes à qn * handful (n) : poignée (f) * hand-held (ac) : manuel(le) - hand-held control box : boîtier de commande manuel * handhold (n) : (en escalade) prise (f) (sur une paroi) - to find the perfect handhold : trouver la prise idéale * handjob (n) : (Sex.) branlette (f) * handkerchief (n) : mouchoir, tire-jus (fam.) * handle (n) : 1/ poignée (f) - the bow handle : la poignée de l’arc - door handle : poignée de porte - love handles : poignées d’amour, petits bourrelets ; 2/ manivelle (f) - to crank the handle : a/ tourner la manivelle, b/ démarrer à la manivelle (un moteur) * handle (v) (tr.) : 1/ prendre en main ; 2/ manier, manipuler, manœuvrer ; 3/ traiter, aborder, s’occuper de, se charger de, gérer - to handle a variey of tasks : effectuer diverses tâches ; 3/ maîtriser * handler (n) : personne qui mène, gère, tient, manipule, etc. - agent handler : (Intel.) officier traitant - animal handler : dresseur - baggage handler : bagagiste - case handler : gestionnaire de dossier - warehouse handler : manutentionnaire * hand-lettered (ac) : aux lettres tracées à la main, non cursif/-ive * handling (n) : 1/ manutention (f) - materials handling : manutention de matériaux - handling costs : frais de manutention - handling operations : manutentions ; 2/ traitement, gestion (f), contrôle - agent handling : (Intel.) contrôle d’agents - case handling : traitement des affaires (suivies) * handmaid (n) : servante (f) (var. handmaiden) * handmaiden (n) voir handmaid * hand-operated (ac) : à main - hand-operated pulley block : palan à bras * handout / hand-out (brit.) (n) : 1/ aumône (f) - to live off handouts : vivre d’aumônes ; 2/ don ; 3/ polycopié (n), polycop (fam.) * handover (n) : remise (f) - keys handover : remise des clés (d’un appartement) * handsaw (n) : scie à main, égoïne (f) * handset (n) : combiné (téléphonique) - to pick up the handset : décrocher le combiné * hands-free (ac) : mains libres - hands-free station : poste téléphonique mains libres * handshake (n) : poignée de mains * hand-signed (ac) : dédicacé(e) - hand-signed book : livre dédicacé * handsome (a) : beau/belle * handstand (n) : appui tendu renversé, ATR, appui renversé, équilibre sur les mains - to do a handstand : faire un équilibre sur les mains, faire un équi (fam.), faire l’arbre droit, faire l’arbre fourchu, faire le piquet * hand-to-hand (ac) : [combat] à mains nues, au corps-à-corps- hand-to-hand fighting : combats à mains nues, luttes au corps-à-corps * handwriting (n) : écriture (manuscrite) (f) - a very girly handwriting : une écriture de fille - handwriting recognition system : logiciel de reconnaissance d’écriture manuscrite - hand-written reporting : rédaction manuelle de rapports * hand-written / handwritten (ac) : rédigé(e) manuellement, fait(e) à la main - handwritten notation : annotation manuscrite * handy (a) : 1/ bien pratique, pratique, commode ; 2/ adroit(e), bricoleur/-euse * hang (v) (hung, hung) : 1/ (tr.) pendre, accrocher, suspendre (on, à) ; (intr.) être accroché(e) (on, à), être suspendu(e) (on, à) ; 2/ (Inf.) [ordinateur] s’arrêter, se bloquer, s’immobiliser, raccrocher (fam.) * hanger (n) : - clothes hanger : cintre (syn. coat-hanger) - plate hanger : accroche-plat (masc.)- skirt hanger : porte-jupe (masc.) * hanger-on (n) (pl. hangers-on) : parasite, pique-assiette (masc.) * hanging (a) : suspendu(e) - hanging bridge : pont suspendu - hanging stone : (Géol.) pierre suspendue (f) * hanging (n) : pendaison (f) * hangings (n pl.) : tenture (f) * hang on (v) (hung, hung) (intr.) : attendre un instant, patienter un moment - Hang on while I put my shoes on : Attends une minute que je mette mes chaussures * hang out (v) (hung, hung) (intr.) : 1/ surplomber, saillir ; 2/ loger, habiter, crécher (fam.), percher (fam.) ; 3/ traîner, glander (péj.) * hangout (n) : endroît où l’on traîne, lieu de rencontre habituel, lieu de prédilection, lieu très fréquenté, repaire - hacker hangout : repaire de pirates (informatiques) - popular hangout : endroit très fréquenté * hangover (n) : 1/ survivance (f), reste ; 2/ gueule de bois - to have a hangover : avoir la gueule de bois * hang up (v) (hung, hung) : (tr.) suspendre, accrocher - to hang up a signboard : suspendre un panneau d’affichage ; (intr.) raccrocher (au téléphone) * hank (n) : 1/ écheveau ; 2/ - a hank of hair : une touffe de cheveux * hankering (n) : (forte) envie (for, de) * hanky (n) (fam.) : mouchoir, tire-jus (fam.) * hanson (n) : fiacre * hap (n) : hasard (malencontreux), sort, destin * haphazard (a) : fait(e) au hasard * hapless (a) (lit.) : infortuné(e), malchanceux/-euse (syn. unlucky) * happen (v) (intr.) : se produire, survenir, arriver - I happen to + inf. : Il se trouve que je... * happily (adv.) : avec bonheur - Things don’t always go as happily : Les choses ne se passent pas toujours avec autant de bonheur * happy (a) : 1/ heureux/-euse ; 2/ - to be happy : être éméché(e), pompette (inv.), un peu gris(e), un peu parti(e) - the happy hour : a/ l’heure de l’apéritif ; b/ le cinq à sept * happiness (n) : bonheur - to ensure sb's happiness : assurer le bonheur de qn - unrelieved happiness : bonheur sans nuages * harass (v) (tr.) (fa) : harceler, tourmenter * harasser (n) : harceleur, persécuteur, bourreau (syn. tormenter) * harassment (n) (fa) : harcèlement, persécution (f) * harbinger (n) : 1/ héraut, messager ; 2/ signe annonciateur, signe avant-coureur * harbor (amér.) / harbour (brit.) (n) : port - yachting harbour : port de plaisance * harbor (amér.) / harbour (brit.) (v) (tr.) : 1/ abriter ; 2/ receler (un criminel) ; 3/ nourrir (des sentiments), avoir (des doutes) * hard (a) : 1/ dur(e) - hard cheese : fromage à pâte dure - That’s hard cheese! : C’est pas de veine ! ; 2/ (fig.) difficile, dur(e) - the hard part is + gér. : le plus dur est de + inf. - to learn sth the hard way : apprendre qch à ses dépens - You’re making it very hard for me : Tu rends les choses très difficiles pour moi ; 3/ brutal(e) - hard landing : (Av.) atterrissage brutal ; 4/ rigide, figé(e) - hard automation : (Prod.) automatisation non programmable (f), automatisation figée, automatisation rigide - hard fixture : (Usin.) montage rigide - hard fixturing : montage rigide (l'opération) ; 5/ (Typo.) insécable - hard space ; espace insécable (f) (syn. non-breaking space, hard-breaking space) * hard (adv.) : 1/ avec acharnement, dur - She exercises hard : Elle s’entraîne dur ; 2/ durement - Do not use him too hard : Ne le traitez pas trop durement ; 3/ difficilement, avec peine ; 4/ attentivement - She looked hard at the question : Elle regarda la question attentivement * hard (n) (fam.) : érection (f) - She gives me a hard : Elle me fait bander * hardback (n) : livre cartonné * hard-bitten (ac) : chevronné(e), endurci(e), dur(e) à cuire - hard-bitten detective : inspecteur dur à cuire * hard-boiled (ac) : 1/ [œuf] dur(e) - hard-boiled egg : œuf dur ; 2/ (fig.) dur à cuire * hard-bought (ac) : durement gagné(e) * hardcore (mod.) : inconditionnel(le), irréductible - hardcore gamer (Jeux vidéo) : joueur passionné, joueur pur et dur, joueur acharné, hyperjoueur, mordu des jeux vidéo - hardcore gaming : pratique intensive des jeux vidéo * hardcover (a) : à couverture rigide (anton. paperback : à couverture souple) * hard-earned (ac) : durement gagné(e), chèrement acquis(e), obtenu(e) à la sueur de son front, remporté(e) de haute lutte - hard-earned money : argent durement gagné * hard-edged (ac) : 1/ à arêtes vives ; 2/ rigoureux/-euse - hard-edged standards : normes rigoureuses * harden (v) : (tr.) durcir ; (intr.) durcir, se durcir * hard-fisted (ac) : 1/ [combat] chèrement disputé(e), [individu] implacable - hard-fisted leader : chef inflexible ; 2/ radin(e) * hard-fought (ac) : remporté(e) de haute lutte - hard-fought battle : bataille remportée de haute lutte * hard-going (ac) : [travail, etc.] ardu, difficile, dur(e), pénible - hard-going session : séance éprouvante - hard-going terrain : terrain difficile - hard-going trail : sentier difficile * hard-ground (vc) (tr.) : (Élect.) relier à la terre par un conducteur * hard-hit (ac) : durement touché(e), très éprouvé(e), très touché(e), très éprouvé(e) * hard-hitting (ac) : [critique] percutant(e), choc (en appo.), [portrait] sans concessions, sans complaisance - hard-hitting campaign : campagne percutante (f) * hardihood (n) : intrépidité (f) * hard-learned (ac) : appris(e) à la dure, durement appris(e) - hard-learned lessons : leçons durement apprises * hardliner (n) : tenant de la ligne dure, partisan de la manière forte * hardly (adv.) : à peine, tout juste, guère - I hardly think I want… : Je ne pense vraiment pas avoir besoin de… - to be hardly noticeable : se remarquer à peine * hardly ... when (loc. conj. de temps) : à peine ... que * hard-nosed (ac) : endurci(e), intraitable, impitoyable, inflexible, intransigeant(e) - hard-nosed assessment : évaluation sans complaisance * hard-pressed (ac) : (qui est) sous pression, (qui est) aux abois, (qui a) le dos au mur, (qui est) étranglé(e) financièrement - to be hard-pressed to + inf. : peiner à + inf., avoir du mal à + inf., être en peine de + inf. - hard-pressed managers : cadres sous pression * hardship (n) : 1/ épreuve (f), épreuves (f pl.) (syn. ordeal), rigueurs (f pl.) ; 2/ privation (f) (syn. deprivation) * hard up / hard-up (a) : 1/ sans le sou (fam.), fauché(e) (comme les blés) ; 2/ en manque - to be hard up for sth : être en manque de qch, ne pas savoir où trouveer * hardware (n ind. sing.) : 1/ quincaillerie (f) - mounting hardware : éléments (pl.) de montage - hardware shop (brit.) / store (amér.) : quincaillerie ; 2/ (Inf.) matériel(s) - Hardware is programmed with software : les matériels sont programmés à l’aide de logiciels - a piece of hardware : un matériel - hardware products : (Inf.) matériels - hardware vendor : marque de matériels * hard-wire / hardwire (vc) (tr.) : câbler * hard-wired / hardwired (ac) : câblé(e) - hard-wired connection : connexion câblée (f) * hard-working (ac) : travailleur/-euse, acharné(e) au travail * hard-worn (ac) : usé(e), très fatigué(e) - hard-worn leather : cuir très fatigué * hardy (a) (fa p) : 1/ hardi(e), intrépide ; 2/ (fa) robuste, résistant(e) * hare (n) : lièvre * hare-brained / harebrained (ac) : 1/ [individu] écervelé(e) ; 2/ [plan, combine] farfelu(e), insensé(e) - harebrained scheme : plan farfelu * hark (v) (tr.) (lit.) : écouter * harlot (n) : femme de petite vertu, fille de joie, traînée (f) * harm (n) : mal (qui est fait) - There’s no harm done! : Il n’y a pas de mal ! - to protect workers from harm : éviter aux ouvriers de se faire mal * harm (v) (tr.) : 1/ faire mal à ; 2/ nuire à * harmful (a) : nuisible - environmentally harmful : nuisible à l'environnement * harmless (a) : inoffensif/-ive * harmonic (a) : 1/ (Mus.) harmonique ; 2/ harmonieux/-ieuse * harmonically (adv.) : 1/ (Mus.) harmoniquement, sur le plan harmonique ; 2/ (fig.) harmonieusement, en harmonie * harmonics (n) : 1/ (sing.) (l’)harmonie (f) ; 2/ (pl.) harmoniques (masc.) - harmonics analysis : analyse d’harmoniques - harmonics filtering : filtrage d’harmoniques * harmony (n) : 1/ (Mus.) harmonie - The viola is in harmony with the cellos : l’alto est en harmonie avec les violoncelles - The choir sang in perfect harmony : Le chœur chantait dans une harmonie parfaite ; 2/ (fig.) harmonie, accord - to be in harmony with… : être en accord avec… * harness (n) : 1/ (pour les chevaux) harnais, harnachement ; 2/ (pour les personnes) harnais de sécurité, (pour les alpinistes) baudrier - to wear a harness : a/ porter un harnais de sécurité, b/ porter un baudrier ; 3/ (en câblage) faisceau - wiring harness : faisceau de câblage * harness (v) (tr.) : 1/ harnacher (a horse, un cheval) ; 2/ exploiter (energy, etc., de l'énergie, etc.) * harp (v) (intr.) : - to harp on a subject : revenir sans cesse sur un sujet - He has been harping on it for a week : Voilà sept jours qu’il nous rebat les oreilles de cela - to harp on one string : rabacher toujours la même chose * harpsichord (n) : (Mus.) clavecin * harrow (n) : (Agric.) herse (f) * harrow (v) (tr.) : (Agric.) herser * harry (v) (tr.) : harceler, tourmenter * harried (a) : tourmenté(e) * harrumph (v) (intr.) : s’offusquer (about sth, de qch) * harsh (a) : 1/ dur(e) ; 2/ âpre ; 3/ [détergent] corrosif/-ive, décapant(e) * harshly (adv.) : 1/ durement ; 2/ âprement * harvest (n) : moisson (f) - wheat harvest : moisson des blés - harvest mite : aoûtat * harvest (v) : 1/ (tr. et intr.) moissonner ; 2/ (tr.) récolter - to harvest figs : récolter des figues * harvester (n) : moissonneuse-lieuse (f) - combine harvester : moissonneuse-batteuse (f) * hash (n) : haschich, cannabis - hash brownie : brownie au cannabis - hash cookie : biscuit au cannabis * hash (v) (intr.) : plancher (over sth, sur qch) (fam.) - to hash over the rational use of natural resources : plancher sur l’utilisation rationnelle des ressources * hashtag (n) : mot-clé précédé d’un dièse (sur Twitter), mot-dièse (off.) * haste (n) : hâte (f) * hasten (v) : (tr.) hâter, précipiter (syn. to accelerate) ; (intr.) se hâter, se précipiter * hastily (adv.) : à la hâte, précipitamment * hastily passed (ac) : adopté à la hâte, voté précipitamment - hastily passed legislation : législation votée à la hâte * hasty (a) : précipité(e) * hat (n) : chapeau - top hat : chapeau haut de forme - My hat off to you! : Chapeau ! * hatch (n) (pl. hatches) : 1/ écoutille (f) ; 2/ - serving hatch : passe-plat (masc.) * hatch (v) (tr.) : 1/ pondre ; 2/ faire éclore ; 3/ élaborer * hatchback (n) (amér.) : voiture à hayon * hatchet (n) : hachette (f) - hatchet job : (fig.) critique virulente (f), mise en pièces (f), éreintement, démolition (f), entreprise (f) de démolissage - to do a hatchet job on sb : mettre qn en pièces, démolir (la réputation de) qn * hatchling (n) : oisillon * hate (n) : haine (f) - full of hate : haineux/-euse - pet hate : bête noire (f) - My pet hate is when… : Ce que je hais par dessus tout, c’est quand… - hate group : groupe incitant à la haine, groupe xénophobe - hate literature : écrits haineux (pl.) , écrits incitant à la haine, propagande haineuse (f) - hate monger : fomentateur de haine (var. hatred monger) - hate speech : discours de haine * hate (v) : 1/ (tr.) haïr, détester, avoir horreur de, avoir en horreur ; (intr.) haïr (anton. to love) ; 2/ (tr.) (to) hate to do sth / to be sth : ne surtout pas vouloir faire qch / être qch - I would hate to be a ball buster : Je ne voudrais surtout pas passer pour un casse-couille * hate-filled (ac) : plein de haine, haineux/-euse - hate-filled ideology : idéologie marquée par la haine * hatred (n) : haine (f) - full of hatred : haineux/-euse - hatred monger : fomentateur de haine (var. hate monger) * hatstand (n) : porte-chapeau (masc.), portemanteau * hatter (n) : chapelier/-ière - to be mad as a hatter : être fou à lier, être maboul * haughtily (adv.) : de manière hautaine, avec dédain, dédaigneusement * haughtiness (n) : dédain * haughty (a) : hautain(e), dédaigneux/-euse * haul (n) : 1/ prise (f) (de poissons), coup de filet ; 2/ charge (f) ; 3/ butin ; 4/ voyage ; 5/ parcours, trajet - in the long haul : à long terme (aussi over the long haul) - We’re in for the long haul : On en a pour un bon bout de temps * haul (v) (tr.) : 1/ tirer, traîner ; 2/ transporter, trimbaler (fam.) * haulage (n) : camionnage, roulage - haulage contractor : entrepreneur de transports routiers * hauler (amér.) / haulier (brit.) (n) : routier * haul off (v) (tr.) : retirer, enlever - Haul off the gangway! : Retire / Retirez la passerelle ! * haunt (v) (tr.) : hanter * haunted (a) : hanté(e) - haunted house : maison hantée (f) * haunting (a) : obsédant(e), envoûtant(e) * hauntingly (adv.) : de manière envoûtante * hauteur (n) : dédain * Havana (n pr.) : (la) Havane * Havana (n) (pl. Havanas) : cigare de Havane, havana * have (v) (had, had) : 1/ avoir, posséder - to have a profound effect : avoir un effet important - to have sth to hand : avoir qch sous la main ; 2/ avoir, comporter - to have quality problems : souffrir de défauts ; 3/ + nom décrivant une action : prendre - to have a bath : prendre un bain - to have a shower : prendre une douche - to have some rest : prendre du repos (syn. amér. to take) ; 4/ (to have to + inf.) : être obligé de + inf., devoir + inf. - [system] to have to be custom designed : [système] devoir être fabriqué sur mesure - She is having to stand in the corridor : On l’oblige présentement à attendre, debout, dans le couloir - You didn’t have to have a bath : Il n’était pas nécessaire que tu prennes un bain, Tu n’étais pas obligé de prendre un bain * haven (n) : hâvre * have on (v) (tr.) : faire marcher - You’re having me on : Tu me fais marcher, Vous me faites marcher * haversack (n) : musette (f) * having said this, … : Ceci dit, … * havoc (n) : dégâts (pl.) - to cause havoc : causer des dégâts * haw (interj.) : dans haw! haw! : ha ! ha ! * haw (n) : cenelle (f) * haw (v) (intr.) : faire euh, hésiter * hawk (n) : faucon, épervier - not to know a hawk from a handsaw : prendre des vessies pour des lanternes * hawk (v) (tr.) : 1/ vendre à la criée ; 2/ (fig.) cracher (syn. cough up) * hawker (n) : colporteur, marchand ambulant - No hawkers : Porte-à-porte interdit * hay (n) : foin - to make hay : faire du foin - hay bale : botte de foin (aussi bale of hay) - hay cart : charrette à foin - hay sufferer : habitué(e) du rhume des foins - hay wire : fil à attacher les balles de foin * haymaking (n) : (la) fenaison, (les) foins * hayrick (n) : meule de foin (syn. haystack) * haystack (n) : meule de foin (syn. hayrick) - to look for a needle in a haystack : chercher une aiguille dans une meule de foin * haywire (a) : détraqué(e) - to go haywire : se détraquer * hazard (n) (fa) : danger, risque, péril, aléa - fire hazard : risque d’incendie - Lead paint is a health hazard : La peinture au plomb est dangereuse pour la santé - safety hazard : danger, risque d’accident * hazardous (a) (fa) : dangereux/-euse, périlleux/-euse, risqué(e), à risque - hazardous waste : déchets dangereux (pl.) * hazing (n) (amér.) : bizutage - army hazing : bizutage à l’armée * hazmat (n) (abr. de hazardous material : matières dangereuses, f pl.): - hazmat suit : combinaison de protection * HDTV (n) (init. de high-definition television : (la) télévision (à) haute définition) - HDTV set : poste de télé HD (syn. HDTV receiver) * head (n) : 1/ tête (f) - to bow one’s head : incliner la tête ; (intr.) faire une révérence, s’incliner, saluer d'un signe de tête - to nod one’s head : hocher la tête - to work one’s head off : bosser dur - He has got a big head (fig.) : Il a la grosse tête - tool head (Usin.) : tête à outil - head band : serre-tête (aussi headband) - head chopper : coupeur de têtes ; 2/ pointe (f) (de flèche) - arrow head : pointe de flèche ; 3/ chef, responsable - head of department : chef de service - head of state : chef d’État ; 4/ tête, personne, tête de pipe (fam.) - hot head : exalté(e) (n), tête brûlée (f) (aussi hothead) * head (mod.) : head office : siège social * head (n) (tronc. de headmaster / headmistress : chef d’établissement) : the head : le patron / la patronne, le proviseur (du lycée), le principal (du collège) (syn. the principal (n)) - the head's office : le bureau du proviseur / principal - the deputy head : le proviseur adjoint (anciennement le censeur) * head (v) : (tr.) être à la tête de, diriger - to head a government : être à la tête d’un gouvernement ; (intr.) : faire cap (for, sur), se diriger (to / towards, vers) * headache (n) : 1/ mal de tête ; 2/ casse-tête (masc.) (fig.) * headband (n) : serre-tête (masc.) (aussi head band) * headbutt (n) : coup de boule * header (n) : 1/ en-tête (masc.), titre - section header : en-tête de rubrique ; 2/ (Maçon.) boutisse (f) * headgear (n) : couvre-chef (masc.) * headhunt (v) (tr.) : chercher à débaucher, recruter par débauchage * headhunter (n) : chasseur de têtes * headhunting (n) : chasse aux talents, débauchage de cadres - headhunting firm : société de recrutement * heading (n) : 1/ (Méca.) frappe (f) - cold heading : frappe à froid - heading machine : machine de frappe ; 2/ en-tête (masc.), titre (voir headings) * headings (n pl.) : titraille (f sing.) * headlamp (n) : 1/ phare (de voiture, etc.) (syn. headlight) ; 2/ lampe frontale (f) (portée par un individu) * headlight (n) : phare - airplane headlights : phares d'avion * headline (n) : 1/ titre - clickbait headline : titre accrocheur (sur la Toile) ; 2/ a/ manchette (f), gros titre à la « une » ; b/ (au pl., headlines) : la « une » des journaux, les gros titres des journaux - the story hit/made the headlines : cette affaire a fait les gros titres des journaux - banner headline bandeau de « une », titre de « une » (en gros caractères et courant sur toute la largeur de la page) (syn. running head) - news headlines : gros titres, titres de l'actualité * headline (v) : (tr.) être en tête d’affiche de, être tête d’affiche de (un concert, un festival) - to headline a festival : être tête d’affiche d’un festival; (intr.) être en tête d’affiche, être tête d’affiche * headlong (a) : 1/ tête la première ; 2/ précipité(e), hâtif/-ve - headlong flight : fuite en avant * headmaster (n) : 1/ chef d’établissement ; 2/ (selon le cas) directeur (d’école), principal (n) (de collège), proviseur (de lycée) * head of hair (n) : chevelure (f) - to have a full head of hair : avoir plein de cheveux * head-on (a) : frontal(e), de front - head-on collision : collision frontale (f) * head-on (loc. adv.) : de front, de plein fouet - to collide head-on : entrer en collision, se percuter de plein front * head out (v) (intr.) : se diriger (to, vers) * headphones (n pl.) : casque écouteur (sing.) * headquarters (n pl.) : quartier général (sing.), siège (sing.) (d’une entreprise) * headrest (n) : appuie-tête (m) * heads (n) : face (au jeu de pile ou face) (anton. tails : pile) - Heads or tails? : (litt. Face ou pile ?) : Pile ou face ? * headstand (n) : équilibre sur la tête, poirier - to do a headstand : faire le poirier * headstone (n) : stèle (f) (d’une tombe) * head-to-head (ac) : - head-to-head studies : études comparatives (f pl.) * heady (a) : [vin] capiteux/-euse * headwall (n) : 1/ (Alpinisme) face frontale (f), paroi frontale (f); 2/ front (d’un torrent en crue) * headway (n) : (du) progès, (des) progrès * headwind (n) : vent de face, vent contraire - to face headwinds : affronter des vents contraires * heal (v) : (tr.) guérir, cicatriser ; (intr.) guérir, cicatriser * healer (n) : 1/ guérisseur - faith healer : guérisseur religieux ; 2/ remède qui guérit * healing (n) : guérison (f) - healing substance : substance thérapeutique (f) * health (n) : santé (f) - health care : a/ soins (pl.) de santé ; b/ domaine de la santé - health food : aliments naturels (pl.), aliments de santé - health hazard : danger pour la santé - health problems : ennuis de santé - health resort : a/ station ou ville de cure thermale, station thermale, station climatique ; b/ complexe de cure, complexe de soins * healthily (adv.) : de manière saine, sainement * healthy (a) : en bonne santé, sain(e) * heap (n) : tas, empilement, amoncellement, monceau - ash heap : tas de cendres * heap (v) (tr.) : entasser, empiler, amonceler * hear (v) (heard, heard) : 1/ (tr.) entendre - I can’t hear that enough! : Je ne me lasse pas d’entendre cela !, Que cette musique est douce à mes oreilles ! ; 2/ (tr.) entendre dire ; 3/ (intr.) to hear from sb : entendre parler de qn - You’ll be hearing from us : Vous aurez de nos nouvelles * hearing (n) : 1/ ouïe (f), audition (f) - to have good hearing : avoir une ouïe satisfaisante - hearing aid : appareil auditif, prothèse auditive (f) - hearing loss : perte auditive (f) ; 2/ (Droit) audition * hearken (v) : (tr.) écouter ; 2/ (intr.) prêter l’oreille * heart (n) : 1/ cœur - My heart bleeds for you : J’ai de la peine pour toi - at the heart of the issue : au cœur du problème - heart attack : crise cardiaque (f) - heart condition : maladie du cœur - to have a heart condition : être cardiaque - heart cry : cri du cœur ; 2/ (expressions) in my heart of hearts : en mon for intérieur - to eat one’s heart out : se ronger les sangs, se morfondre - to learn by heart : apprendre par cœur - My heart was in my mouth : J’ai senti mon cœur se serrer * heartbreak (n) : chagrin d’amour * heartbreaker (n) : bourreau des cœurs - He is a right heartbreaker : C’est un vrai bourreau des cœurs * heartburn (n) : brûlures (f pl.) d’estomac * hearten (v) : (tr.) encourager, donner du cœur à ; (intr.) reprendre courage * hearten up (v) : (tr.) encourager, donner du cœur à ; (intr.) reprendre courage * hearth (n) : âtre * heartland (n) : 1/ (fig.) cœur (d’un pays), centre (d’un pays) - in the heartland of the United States : dans le centre des États-Unis ; 2/ (fig.) cœur, centre principal (d’une activité industrielle ou autre) - the industrial heartland of Ontario : le cœur industriel de l’Ontario * heartless (a) : sans cœur * hart-shaped (ac) : en forme de cœur * hearty (a) : cordial(e) * heartwood (n) : duramen * heat (n) : chaleur (f) - to develop heat : dégager de la chaleur, produire de la chaleur - heat resistance : résistance à la chaleur - heat shield (Astro.) : bouclier thermique - heat treatment : traitement thermique - heat wave : vague de chaleur * heat (v) (tr.) : chauffer * heat-dissipating (ac) : anti-thermique - heat-dissipating tiles (Aéro.) : tuiles anti-thermiques (f pl.) * heater (n) : 1/ radiateur ; 2/ - immersion heater (brit.) / tank (amér.) : ballon d’eau chaude - water heater : chauffe-eau - hot water heater (amér.) : chauffe-eau * heathen (n) : païen(ne) (n) * heating (n) : chauffage - central heating : chauffage central * heatproof (a) : calorifuge, [vernis] qui va au feu * heat-resisting (ac) : ignifuge, résistant à la chaleur * heat up (v) : (intr.) s’aviver, s’intensifier * heave (v) : (tr.) soulever - to heave a sigh : pousser un soupir ; (intr.) se soulever * heaven (n) : 1/ ciel (de la religion) ; 2/ paradis (prop. et fig.) - cheap labour heaven : pays à la main d’œuvre bon marché * heavenly (a) : céleste * heavier (comp. de heavy) * heavily (adv.) : 1/ lourdement ; 2/ fortement, beaucoup - to rely heavily on sb : s'en remettre entièrement à qn * heavily automated (ac) : fortement automatisé(e) - heavily automated plant : installation très automatisée (f) * heavily defended (ac) : fortement défendu(e), très bien défendu(e) - heavily defended area : zone aux fortes défenses * heavily fragmented (ac) : très fragmenté(e) - heavily fragmented files : (Inf.) fichiers très fragmentés * heavily indebted (ac) : fortement endetté(e), criblé(e) dettes - heavily indebted company : société criblée de dettes * heavily redacted (ac) : (Presse) fortement censuré(e), caviardé(e) - heavily redacted report : rapport fortement censuré * heavily scored (ac) : fortement rayé(e) - heavily scored parts : pièces fortement rayées (f pl.) * heavily trafficked (ac) : [site Internet] très visité(e) * heavy (a) : 1/ lourd(e), pesant(e) ; 2/ gros(se), fort(e) - heavy seas (pl.) : une mer forte ; 3/ lourd(e), gros(se), important(e) - heavy duty : gros travaux (pl.), service lourd - (the) heavy industry : (l')industrie lourde (f) - heavy plant : équipements lourds (pl.) (d'une usine) ; 4/ intense, intensif/-ive, fort(e) - heavy duty : grand rendement, grande puissance (f) * heavy-duty (ac) : 1/ à grand rendement, de grande puissance - heavy-duty machine : machine à fort rendement, machine de grande puissance ; 2/ lourd(e), pour service lourd, pour service sévère, pour travaux lourds, pour gros travaux, à usage intensif, de fatigue, à service intensif, pour travail dur, à haute résistance, à toute épreuve, renforcé(e), lourd(e), fort(e) - heavy-duty boiler making : chaudronnerie lourde (f) - heavy-duty handling units : appareils de manutention à service intensif - heavy-duty milling machine : fraiseuse lourde (f) - heavy-duty sheet steel : tôles fortes (f pl.) - heavy-duty tool : outil pour travaux lourds * heavy-going (ac) : pénible, lourd(e) * heavyweight (a) : [Boxe] poids-lourd * heck (interj.) : 1/ mince, zut ; 2/ (mis pour devil après what) - what the heck : mais qu’est-ce qui / que - What the heck is going on here? : Mais qu’est-ce qui se passe ici ?, Mais qu’est-ce que c’est que ce bordel ? * hedge (n) : 1/ haie (f) - the Cornish hedge : la haie de Cornouaille - hedge trimmer : taille-haie ; 2/ couverture des risques financiers - hedge funds : fonds spéculatifs * hedge (v) (tr.) : 1/ entourer d’une haie ; 2/ (fig.) limiter, restreindre - to hedge one’s bets : limiter les risques, protéger ses arrières (fam.) * hedgehog (n) : hérisson * hedger (n) : taille-haie * hedonism (n) : hédonisme * heed (n) : attention (f) - to pay heed to sth : prêter attention à qch * heed (v) (tr.) : écouter, tenir compte de * heedless (a) : inconscient(e) * heel (n) : 1/ talon - (his/her) Achilles’ heel : (son) talon d’Achille - to take to one’s heels : tourner les talons - to heel! : au pied ! (en parlant à un chien) - (fig.) to bring sb to heel : mettre qn au pas - (fig.) to keep sb to heel : tenir qn sous sa botte - (fig.) to be under the heel of sb : être sous la coupe de qn, être sous la botte de qn ; 2/ (fig.) mufle * heel (v) (tr.) : faire le talon de (chaussures) * hefty (a) : gros(se), costaud(e) * hegemon (n) : hégémon, puissance hégémonique (f) * hegemonic (a) : hégémonique * hegemonically (adv.) : de façon hégémonique * heifer (n) : génisse (f) * height (n) : 1/ hauteur (f) - vanity height : hauteur non fonctionnelle (d’un gratte-ciel) (différence entre le pinacle et l’étage le plus haut) – (au pl.) heights : hauteurs - the Golan Heights : les hauteurs du Golan (en Syrie) ; 2/ summum, comble - the height of vanity : le summum de la vanité * heighten (v) : (tr.) surhausser, accentuer ; (intr.) s’élever, augmenter * heinous (a) : [crime, etc.] atroce, odieux/-euse - heinous crime : forfait - heinous sin : péché abominable * heinously (adv.) : de manière atroce, de façon odieuse * heinousness (n) : caractère atroce, côté odieux * heir (n) : héritier - the heir apparent (to sb) : l’héritier apparent (de qn) (syn. heir presumptive : héritier présomptif) * heiress (n) : héritière (f) (to sb, de qn) (fém. de heir) - heiress apparent : héritière apparente (syn. heiress presumptive : héritière présomptive) * held (prét. to hold) * held (pp de to hold) * heli (n) (tronc. de helicopter) : hélico * helical (a) : hélicoïdal(e) * helicopter (n) : hélicoptère - attack helicopter : hélicoptère de combat - helicopter gunship : hélicoptère de combat * heliocentric (a) : héliocentrique - heliocentric denier : partisan de la Terre plate * helix (n) (pl. helixes ou helices) : hélice (f) - double helix : double hélice * hell (n) : enfer - What the hell...! : Que diable... ! - To hell with them! : Qu’ils aillent se faire voir ! - to raise hell : faire du grabuge - hell raising : faire du grabuge, faire du scandale, faire une scène de tous les diables, foutre le bordel (vulg.) * hell-bent (ac) : qui veut à tout prix (on sth, qch), fermement décidé (on doing sth, à faire qch) * hellhole (n) : voir hell hole * hell hole (nc) : (un) véritable enfer, (un) enfer, (l’)enfer sur terre (aussi hellhole) * hellish (a) : 1/ d’enfer, infernal(e) ; 2/ infernal(e), épouvantable - to endure a hellish life : connaître l’enfer sur Terre * hellishness (n) : caractère infernal, côté infernal * helm (n) : barre (f) (of a boat, d'un navire) * helmet (n) : casque - anti-noise helmet : casque anti-bruit - crash helmet : casque de protection, casque antichoc * helmet-mounted (ac) : monté(e) sur casque - helmet-mounted display : affichage monté sur casque, visiocasque * help (n) : aide (f) - Help wanted : On recherche - to seek help : chercher de l’aide - to summon help : aller chercher de l’aide, appeler à l’aide, demander du renfort - homework help : de l'aide pour faire ses devoirs - help desk : a / bureau d’accueil, accueil ; b/ (Inf.) service d’assistance * help (v) : 1/ (tr.) aider - to help the police with their inquiries : aider les policiers dans leurs enquêtes ; 2/ (tr.) être utile à - Can I help you? : Puis-je vous être utile ?, Que puis-je faire pour vous ; (intr.) être utile - It doesn’t help : Ça ne sert à rien - It may help : Ça peut être utile ; 3/ (expressions) - I can’t help it : Je n’y peux rien - to help oneself : se servir - Help yourself! : Sers-toi / Servez-vous ! * helper (n) : aide (le ressortissant), assistant(e) - helper engine : locomotive de renfort * helping (n) : - a helping : une portion (de nourriture), une part (servie à un convive) * helpful (a) : 1/ utile ; 2/ serviable, obligeant(e) * helpfully (adv.) : avec serviabilité, avec obligeance * helpfulness (n) : 1/ utilité (f) ; 2/ serviabilité (), obligeance (f) * helpless (a) : impuissant(e), réduit(e) à l’impuissance, impotent(e), sans ressource * helplessly (adv.) : 1/ en vain ; 2/ désespérément * helplessness (n) : impuissance (f) * help out (v) : (tr.) : aider, apporter son aide à ; (intr.) apporter son aide, donner un coup de main * helter-skelter (loc. adv.) : à la débandade * hem (n) : ourlet * hem (v) (intr.) (amér.) : faire hum * hem and haw (v coord.) (intr.) : 1/ bafouiller, balbutier ; 2/ tergiverser * hem in (v) (tr.) : enfermer, retenir prisonnier/-ière * hemingwayesque (a) : hémingwayen(ne) (aussi Hemingwyan) * hemming and hawing (n double) : tergiversations (f pl.), hésitations (f pl) - Stop hemming and hawing, get on with it ! : Arrêtez de tergiverser, lancez-vous ! * hemophilla (amér.) / hemophilia (brit.) (n) : hémophilie (f) - a case of hemophilia : un cas d’hémophilie * hemorrhage (n) : hémorragie (f) (var. brit. haemorrhage) * hemorrhage (v) : (tr.) perdre (du sang) - (fig.) to hemorrahage cash : perdre de l’argent en abondance ; (intr.) : faire une hémorragie (var. brit. haemorrhage) * hemorrhaging (n) : hémorragies (f pl.) - vaginal hemorrhaging : hémorragies vaginales * hemoglobin (n) (amér.) : hémoglobine (f) (var. brit. haemoglobin) * hemostatic (a) (amér.) : hémostatique, qui arrête l’écoulement du sang (var. brit. haemostatic) * hemp (n) : chanvre (m) * hen (n) : poule (f) - caged hens : poules élévées en batterie - hen night : a/ soirée entre filles, soirée entre femmes ; b/ enterrement de sa vie de jeune fille * hence (adv.) : 1/ d’ici ; 2/ par conséquent, partant, d’où + nom, de là + nom, donc + adj. (syn. therefore) * henceforth (adv.) : désormais, dorénavant * henceforward (adv.) : désormais, dorénavant * henna (n) : henné * hepatology (n) : hépatologie (f) * heptagon (n) : heptagone * herald (v) (tr.) : annoncer * heraldry (n) : héraldique (n) (f) * herb (n) (fa) : herbe médicinale (f), herbe aromatique - herbs (pl.) : fines herbes * herbicide (n) : herbicide (n) - crops resistant to herbicides : cultures résistant aux herbicides * herd (n) : troupeau - to cull the herd : abattre une partie du troupeau - herd immunity : immunité collective (f) * herd (v) (tr.) : garder (des bêtes) - to herd cattle : garder du bétail * herder (n) : pasteur * herding (n) : métier de berger - herding dog : chien de berger * here (adv.) : 1/ ici - He’ll be here directly : Il sera là sur le champ - We got a situation here : On a un problème - down here : ici (position basse) - round here : par ici, dans le coin (fam.) - up here : ici (en position haute) - here below : ici bas ; 2/ dans here is / here are… : voici - Here is the news : Voici les nouvelles * hereafter (adv.) : désormais, dorénavant * hereafter (n) : (l’)au-delà (masc.) - in the hereafter : dans l’eau-delà * heretofore (adv.) : jusqu’ici * heritage (n) (fa p) : 1/ héritage ; 2/ patrimoine - the Days of National Heritage : les Journées nationales du patrimoine - cultural heritage : (le) patrimoine culturel - heritage site (brit.) : site classé * hero (n) (pl. heroes) : héros - guitar hero : dieu de la gratte, héros foudroyé - an honest-to-goodness hero : un authentique héros - rock hero : vétéran du rock, grand du rock - an unsung hero : un héros méconnu * herring (n) : hareng - red herring : a/ fausse piste (f), leurre ; b/ diversion (f), manœuvre de diversion * hessian (a) (brit.) : en jute, en toile de jute * hessian (n) (brit.) : jute (f), toile de jute * heterodox (a) : hétérodoxe, anticonformiste - heterodox thinking : pensée hétérodoxe (f), réflexion hétérodoxe (f) * het up (ac) : énervé(e) - to get het up : s’énerver * hew (v) (hewed, hewn) (tr.) : tailler * hewn (pp de to hew) * hexagon (n) : hexagone * heyday (n) : apogée (m), âge d’or - the heyday of rock and roll : l’âge d’or du rock and roll * hibernate (v) (intr.) : hiberner * hibernation (n) : hibernation (f) * hid (prét. de to hide) * hide (n) : 1/ peau (f) (d'un animal) ; 2/ (fig.) (= vie, f) - to save one’s hide : sauver sa peau * hide (v) (hid, hidden) : (tr.) cacher ; (intr.) se cacher * hidden (pp de to hide) * hidden (ppa) : dissimulé(e), caché(e) - hidden agenda : buts cachés (pl.), intentions cachées (f pl.) - hidden camera : (Journ.) caméra cachée * hide out (v) (hid, hidden) (intr.) : se cacher, se terrer * hideout (n) : cachette (f), refuge secret * hiding (n) : raclée (f) * hierarch (n) : hiérarque * hierarchisation (brit.) / hierarchization (amér.) (v) (tr.) : hiérarchisation (f) * hierarchise (brit.) / hierarchize (amér.) (v) (tr.) : hiérarchiser * hierarchy (n) : hiérarchie (f) * hi-fi / hifi (ac) (abr. de high-fidelity) : (de) haute fidélité, hifi - hi-fi system : chaîne haute fidélité, chaîne hihi * hi-fi / hifi (nc) : (la) haute fidélité, (la) hifi - hifi enthusiast : amateur de hifi * high (a) : 1/ haut(e), élevé(e) - high level : niveau élevé - high percentage : pourcentage élevé - high school (amér.) : lycée ; 2/ grand(e) - the high street (brit.) : la grand’ rue ; 3/ défoncé(e) (par la drogue), qui plane ; 4/ max (indication sur une jauge) * high (adv.) : en hauteur - The room was piled high with magazines : Dans la pièce s’entassaient des magazines (anton. low, adv.) - to search high and low for sth : chercher qch par monts et par vaux * high (n) : niveau haut - Prices are at an all-time high : Les prix sont à leur plus haut niveau (anton. : low (n)) * highball (n) (amér.) : boisson à base d'un alcool avec de l'eau et des glaçons - whisky highball : whisky à l’eau * highbrow (a) : intellectuel(le), [littérature] pour intellectuels * highbrow (n) : intellectuel (n), grosse tête (fam.), pontife (péj.) * high-capacity (ac) : à débit élevé * high-definition (ac) : (de/à) haute définition - high-definition television télévision haute définition (abr. HDTV) * high-duty (ac) : 1/ de grande puissance ; 2/ à haut rendement ; 3/ à grand débit * high-end (ac) : de haut de gamme (anton. low-end : de bas de gamme) * higher (a) (compar. de supériorité de high, haut) : plus élevé, plus fort - higher level : degré plus élevé, niveau plus élevé * higher-cost (ac) : de coût plus élevé * high-flying (ac) : qui vole à hautee altitude, volant à haute altitude - high-flying missile : missile volant à haute altitude (anton. low-flying) * high-frequency (ac) : à haute fréquence - high-frequency trading : (Courtage) transactions à haute fréquence * high-hanging (ac) : perché(e) haut, accroché(e) haut (anton. low-hanging) * high-hazard (ac) : qui est un risque majeur * highlands (n pl.) : montagnes (f pl.) * highlight (n) (svt au pl.) : clou, événement, temps fort, fait saillant (d’une manifestation) * highlight (v) (tr.) : 1/ (Inf.) mettre en surbrillance ; 2/ mettre en vedette, mettre en évidence * highly (adv.) : hautement, extrêmement, fort, très - to charge highly : demander un prix élevé * highly anticipated (ac) : très attendu(e) * highly consistent (ac) : très homogène, très régulier/-ière - highly consistent quality : qualité très régulière (f) * highly effective (ac) : très efficace - highly effective people : des gens très efficaces * highly placed (ac) : [sources, sources] en haut lieu - highly placed sources : sources haut placées * highly qualified (ac) : hautement qualifié(e) * high-strength (ac) : de grande résistance * highly strung (ac) (brit.) : très nerveux/-euse, hypernerveux/-euse, ayant la sensibilité à fleur de peau (var. amér. high strung) * highly trained (ac) : ayant eu une formation très poussée * high-minded (ac) : noble, élevé(e) * high-paying (ac) : très bien rémunéré(e) (anton. low-paying) - high-paying job : boulot très bien payé * high-performance (ac) : 1/ à grand rendement ; 2/ de haute volée * high-precision (ac) : de haute précision, très précis(e) - high-precision strikes : frappes très précises (f pl.) * high-pressure (ac) : à haute pression - high-pressure water jet : jet d’eau (de découpe) à haute pression * high-priority (ac) : prioritaire - high-priority target : cible prioritaire * high-profile (ac) : très remarqué(e), très médiatisé(e) * high-quality (ac) : de très grande qualité * high-resolution (ac) : à haute résolution, de haute résolution, haute résolution - high-resolution screen : écran haute résolution * high-rise (ac) : [immeuble] très haut(e), très élevé(e) - high-rise building : immeuble de grande hauteur * high-rise (n) : immeuble-tour, tour (f) * high-risk (ac) : à haut risque - high-risk area : zone à haut risque * high roller (n) (amér.) : 1/ personne qui dépense inconsidérément, panier percé (fig.) ; 2/ joueur qui joue gros jeu, flambeur/-euse * high rolling (n) (amér.) : 1/ fait de dépenser inconsidérément, 2/ fait de jouer gros jeu * high-rolling (ac) (amér.) : - a high-rolling life : un vie de grand luxe - high-rolling neigbourhood : quartier huppé * high school (n) (amér.) : (le) lycée - high school diploma : diplôme d’études secondaires, baccalauréat * high schooler (n) (amér.) : lycéen, lycéenne - recently graduated high schooler : lycéen ayant eu son baccalauréat, bachelier récent, bachelière récente * high-speed (ac) : 1/ à grande vitesse - high-speed chase : poursuite à grande vitesse ; 2/ instantané(e) - high-speed soldering iron : fer à souder instantané * high-stakes (ac) : à / aux enjeux élévés - a high-stakes struggle : une confrontations aux enjeux élévés * high-strung (ac) (amér.) : hypernerveux/-euse, ayant la sensibilité à fleur de peau (brit. highly strung) * high-tech (ac) (tronc. de high-technology : de haute technologie, à la pointe de la technologie) à haut degré de technicité (anton. low-tech : à faible degré de technicité) - high-tech company : entreprise de haute technologie * high-technology (ac) : de haute technologie, à la pointe de la technologie - high-tech manufacturing : techniques (pl.) de fabrication de pointe, techniques (pl.) de fabrication dernier cri * high tech-related (ac) : lié(e) à la haute technologie - high tech-related industries : industries de haute technologie * high-touch (ac) : à forte personnalisation, valorisant le contact personnel, à forte intensité d’interactions - high-touch job : boulot où le contact humain prédomine * high-value (ac) : 1/ de grande valeur, à grande valeur ; 2/ de grande importance, très important(e) - high-value target : (Milit.) cible prioritaire, cible de choix * high-volume (ac) : 1/ à fort débit - high-volume plant : installation de grande capacité; 2/ en grande série - high-volume production : (la) grande série * highway (n) : grande route (f), route nationale - highways and roads : grandes routes (pl.), réseau routier (sing.) * high-yield (ac) : à fort rendement (anton. low-yield : à faible rendement) - high-yield bond : obligation à fort rendement * hijack (amér.) (n) : opération de détournement (d’un avion, un navire, etc.) * hijack / highjack (amér.) (v) (tr.) : détourner (un avion, un navire, etc.) * hijacker (n) : auteur d’un détournement, pirate (de l’air, de la route) * hijacking (n) : détournement * hiking (n) : (la) grande randonnée - mountain hiking : (la) randonnée en montagne * hill (n) : colline (f) * hilly (a) : vallonné(e) * hilt (n) : garde (f) (of a sword, d'une épée) * hinder (v) (tr.) : gêner, entraver, retarder, faire obstacle à (syn. to obstruct) * hindrance (n) : obstacle, entrave (f), frein * hindquarters (n pl.) : arrière-train (sing.) * hinterland (n) : arrière-pays * hint (n) : 1/ insinuation (f), allusion (f) ; 2/ signe, symptôme ; 3/ pointe (f), trace (f), zeste - a hint of an accent : un zeste d’accent * hint (v) : (tr.) insinuer, laisser entendre ; (intr.) - to hint at sth : faire allusion à qch * hip (n) : hanche (f) - to break a hip : se casser le col du fémur * hip (a) (amér.) : dans le coup * hippo (n) (pl. hippos) (tronc. fam. de hippopotamus) * Hippocrates (n pr.) : Hippocrate * Hippocratic (a) : d’Hippocrate - the Hippocratic oath : le serment d’Hippocrate * hippopotamus (n) (pl. hippopotami) : hippopotame * hip-swivelling (ac) : qui ondule de la croupe * hire (v) (tr.) : 1/ embaucher, engager, louer (sb, qn) - to hire a consultant : engager un expert - to hire an escort : payer les services d’un compagnon / cavalier ; 2/ louer (une voiture) - to hire a car : louer une voiture * hire back (v) (tr.) : réengager, réembaucher, reprendre (sb, qn) - to hire back workers : réembaucher des ouvriers * hired (ppa) : 1/ embauché(e), engagé(e) hired gun : a/ tueur à gages ; b/ mercenaire ; 2/ loué(e) * hireling (n) : 1/ mercenaire ; 2/ laquais - hireling journalist : journaliste stipendié * hire purchase (n) (brit.) : location-vente (f) - to buy on hire purchase : acheter en location-vente * hiring (n) : 1/ embauche (f) ; 2/ location (f) * hiss (n) (pl. hisses) : sifflement (du serpent) * hiss (v) (intr.) : siffler * historian (n) : historien - amateur historian : historien amateur - court historian : historien de la cour, historien officiel - professional historian : historien de métier - urban historian : historien de la ville * historical (a) : historique, passé(e), qui est dans le passé - historical film : film historique - the historical future (Gram.) : le futur de narration - historical period : période historique - historical personage : personnage historique - historical remains : vestiges historiques - historical revisionism : révisionnisme historique * historically (adv.) : dans le passé, par le passé, autrefois * Historically, … (a m p) (t d p) : Dans le passé, ..., Par le passé, ... / Autrefois, … * historicity (n) : historicité (f) * history (n) : 1/ histoire (= le passé) (f) - to be on the wrong side of history : être du mauvais côté de l’histoire - site laden with history : site chargé d’histoire - to rewrite history : réécrire l’histoire - art history : histoire de l’art - automotive history : (l')histoire de l'automobile - It’s all ancient history : Tout cela, c’est de l’histoire ancienne - history buff : passionné d’histoire ; 2/ (Éduc.) (l’)histoire - history and geography : (l’)histoire-géographie - natural history : (l’)histoire naturelle * hit (n) : 1/ coup réussi ; 2/ succès - box office hit : succès dans les salles obscures (syn. box-office success) ; 3/ (Mus.) tube - [singer] to be known for only one hit : [chanteur] avoir un seul tube à son actif * hit (v) (hit, hit) (tr.) : 1/ frapper, cogner sur ; 2/ heurter, percuter ; 3/ toucher, affecter - to be hit with $20.500 in penalties : être frappé de 20 500 dollars d'amende ; 4/ atteindre - to hit sales of 100,000-plus : atteindre des ventes de plus de 100 000 exemplaires ; 5/ - to hit the market : débarquer sur le marché * hit (prét. de to hit) * hit (pp de to hit) * hit-and-run (ac) : - hit-and-run driver : chauffard coupable de délit de fuite - hit-and-run lorry : camion ayant pris la fuite après un accident - hit-and-run journalism : journalisme au coup par coup, journalisme sans suivi (anton. in-depth journalism) * hit back (v) : (intr.) rendre les coups * hitch (n) (pl. hitches) : accroc, anicroche (f), incident, pépin - without a hitch : sans accroc - manufacturing hitches : incidents de fabrication * hitch (v) (tr.) : accrocher (to, à) * hitch up (v) (tr.) : 1/ remonter, relever (un vêtement) ; 2/ attacher (to sth, à qch) ; 3/ atteler (to sth, à qch) * hitchhike (v) (intr.) : faire de l’auto-stop * hitech (a) (tronc. de high-tech : de haute technologie) : à haut degré de technicité * hitherto (adv.) : jusqu’ici - facts not hitherto known : des fait jusqu’ici non portés à notre connaissance * HIV (n) (init. de human immunodeficiency virus : virus de l’immunodéficience humaine) VIH * hive (n) : 1/ ruche (f) - cupboard hive : ruche-placard - tree trunk hive : ruche dans un tronc creux ; 2/ essaim * hive (v) : (tr.) mettre dans une ruche ; (intr.) entrer dans une ruche * HMI (n) (abr. de His/Her Majesty's Inspector : l'inspecteur/l'inspectrice) (G.-B.) * hoard (n) : 1/ magot ; 2/ réserve (f) * hoard (v) (tr.) : amasser * hoarder (n) : collectionneur invétéré, écureuil (au sens figuré), thésauriseur (d’argent) * hoarfrost (n) : givre * hoarse (a) : rauque * hoarsely (adv.) : d’une voix rauque * hoax (n) (pl. hoaxes) : supercherie (f), imposture (f), mystification (f), canular - to stage a hoax : monter un canular (syn. to pull off a hoax) * hoax (v) (tr.) : 1/ cajoler ; 2/ jouer un tour à, monter un canular à, mystifier ; 3/ trafiquer - to hoax a photo : bidouiller une photo * hoaxer (n) : auteur de canulars, farceur, farceuse * hob (n) (brit.) : plan de cuisson, dessus d’une cuisinière, table de cuisson, plaque chauffante (f) (syn. amér. range top) - all hobs including induction : toutes les plaques de cuisson, y compris celles à induction * hobo (n) (amér.) : vagabond, nomade - hobo camp : campement de vagabonds * hobble (v) (intr.) : boitiller * hobby (n) (pl. hobbies) : passe-temps (masc.), occupation (f), dada (fam.), violon d’Ingres - to take up a hobby : prendre un violon d’Ingres * hobnob (v) (intr.) : frayer (with, avec) * hock (n) : jarret (de cheval) * hockey (n) : hockey - hockey star : vedette de hockey, champion de hockey * hodge-podge (n double) : salmigondis * hoe (n) : houe (f), binette (f) * hoe (v) (tr.) : biner - a hard row to hoe (fig.) : une tâche ingrate * hog (n) : 1/ cochon, porc ; 2/ goinfre ; 3/ (amér.) grosse moto (f), gros cube ; 4/ - road hog : chauffard * hog (v) (tr.) : s’approprier goulûment, accaparer * hoi polloi (the) (n) (brit.) : (la) populace, (le) populo, (le) bas peuple, (le) vulgaire, (la) plèbe * hoist (n) : palan - chain hoist : palan à chaîne - hoist drive : moteur d’engin de levage * hoist (v) (tr.) : hisser * hoity-toity (a) (fam.) : hautain(e), prétentieux/-euse * hold (n) : 1/ emprise (f), étreinte (f) ; 2/ cale (f) (de navire) * hold (v) (held, held) (tr.) : 1/ tenir ; 2/ contenir ; 3/ détenir, avoir - to hold very advanced ideas : avoir des idées très avancées - to hold in store : tenir en réserve - to hold one week’s stock as a parts buffer : avoir une semaine de stock de pièces ; 4/ mener, conduire - to hold an inquiry into sth : mener une enquête sur qch - to hold a meeting : tenir une réunion ; 5/ (locutions) - to hold one’s ground : ne pas bouger * holdall (n) : fourre-tout, cabas (syn. carry-all / carryall) * hold back (v) (tr.) : 1/ retenir (sb, qn), refouler (feelings, des sentiments) ; 2/ - to be held back (amér.) : (Éduc.) redoubler une classe, une année (syn. brit. to be kept down) * holder (n) : 1/ détenteur, détentrice - copyright holder : détenteur des droits de reproduction - debenture holder : obligataire (n) ; 2/ support, porte-(+ nom) (masc.), pot - cable holder : porte-câble - card holder : porte-carte - cigarette holder : porte-cigarette - cup holder : porte-gobelet - flower holder : pique-fleur - magazine holder : porte-revue - paint brush holder : pot à pinceaux - soap holder : porte-savon - tool holder : (Usin.) porte-outil - toothbrush holder : porte-brosse à dent * hold in (v) (held in, held in) (tr.) : retenir, contenir - to hold in one’s wee (brit.) : se retenir de pisser * holding (n) : propriété (immobilière) (f) - to lease a holding : louer une propriété - holding company : société possédant des participations financières dans d'autres sociétés * holdings (n pl.) :1/ ténements, exploitations (f pl) - farm holdings : exploitations agricoles ; 3/ parts (détenues) (f pl.), participation financière (f) ; 4 / fonds (sing.) - a library’s holdings : le fonds d’une bibliothèque * hold on (v) (intr.) : 1/ tenir bon ; 2/ (Tél.) ne pas quitter * holdover (a) : 1/ hérité(e) du passé, laissé(e) en suspens - holdover questions : questions restées en suspens ; 2/ de rémanence - holdover voltage : tension de rémanence - de-icing holdover times : durées d’efficacité des produits de dégivrage * holdover (n) : 1/ héritage, legs ; 2/ survivance (f), vestige - a holdover from the past : une survivance du passé * hold together (v) (held, held) (tr.) : - to hold oneself together : [individu] conserver son intégrité, ne pas se déglinguer * hold up (v) (held up2) (tr.) : 1/ soutenir - not to hold up : n’être pas à la hauteur, ne pas tenir le coup, ne pas tenir la route (fam.) - not to hold up to scrutiny : ne pas résister à l’examen ; 2/ retarder - They have got held up : Ils ont été retardés * hold-up (brit.) / holdup (n) : 1/ vol à main armée, braquage - hold-up insurance : assurance contre le vol à main armée ; 2/ retard * hole (n) : 1/ orifice, trou - bee hole : niche à ruche (f) (syn. bee niche) - mounting hole : trou de fixation ; 2/ (fig.) trou - (the) memory hole (expression forgée par George Orwell) : (le) puits de l’oubli, (la) Trappe, (les) oubliettes (f pl.), (les) poubelles de l’histoire - piss hole (vulg.) : (en parlant d’une maison) endroit de merde, trou merdique - Let’s get out of this piss hole! : Tirons-nous de ce trou merdique ! - rat hole : (en parlant d’une maison) trou à rats, bouge (syn. hell hole) ; 3/ faille (f), défaut - to pick holes in sth/sb : trouver des failles dans qch, trouver des défauts à qn * holiday (n) : 1/ jour férié - bank holiday : jour férié ; 2/ fête (religieuse) (f) - holiday Catholic : catholique non pratiquant, catholique occasionnel ; 3/ (brit.) vacances (f pl.) - holiday resort : a/ lieu de vacances, lieu de villégiature ; b/ village de vacances * holiday (v) (intr.) : passer des vacances * holidays (n pl.) (brit.) : vacances (f. pl.), jours de congé, congés (pl.) - to go on holidays : partir en vacances - forced holidays : congés forcés - [workers] to be put on forced holidays : [travailleurs] se retrouver en congés forcés * holier (comp. de supér. de l’adj. holy : saint(e)) * holier-than-thou (a) : (lit. plus saint que toi, plus vertueux que toi) - a holier-than-thou attitude : des airs de sainte-nitouche, des airs de vierge offensée * Holland (n pr.) : (la) Hollande * holler (v) (intr.) : brailler, gueuler (vulg.) * hollow (a) : creux/-euse - hollow punch : emporte-pièce - hollow shell : coquille vide - to ring hollow : sonner creux * holly (n) : houx * hollyhock (n) : rose trémière (f) * holocaust (n) : 1/ holocauste, génocide ; 2/ (Hist.) (the) Holocaust : l’Holocauste, (la) Shoah * holy (a) : saint(e) - the holy Grail : le Saint Graal (= le but ultime) - the holy viaticum : le saint viatique * (the) Holy See (n pr.) : (le) Saint-Siège, (le) Vatican * holystone (v) (tr.) : (Naut.) briquer (le pont d'un navire) * home (n) : 1/ maison (f), logis, chez soi - the home of… : là ou est né(e)… - No one is at home (brit.) = No one is home (amér.) : Il n’y a personne à la maison - Make yourself at home! : Fais comme chez toi ! / Faites comme chez vous ! - to be fed up and far from home : en avoir plein le dos et avoir le mal du pays - a home from a home : un second chez soi - stately home : belle demeure, grande demeure, palais, château - home owner : propriétaire de maison individuelle ; 2/ foyer (d’accueil), maison (de retraite) - care home : maison de retraite, ehpad (établissement d’hébergement pour personnes âgées dépendantes) - children’s home : foyer pour enfants - elderly home : foyer pour personnes âgées, maison de retraite - foster home : famille d’accueil - nursing home : maison de retraite - old people’s home : foyer pour personnes âgées * home (adv.) : à la maison, chez soi - to come back home : revenir chez soi - to get back home : retourner chez soi - to go back home : retourner chez soi - to go home : allez chez soi, rentrer chez soi - I’m going home : Je rentre chez moi - to hurry home : se dépêcher de rentrer chez soi, rentrer vite chez soi * home (a) : 1/ domestique, ménager/-ère, familial(e) - home appliance : appareil domestique, appareil ménager - home automation : (la) domotique - home computer : ordinateur domestique, ordinateur familial - home electronics : a/ (l’)électronique familiale (f), (l’)électronique domestique (f) ; b/ appareils électroniques domestiques (pl.) - home movie : projection privée (f) - home remedy : remède de grand-mère - (Mus.) home studio : studio individuel - home video : (la) vidéo familiale, (la) vidéo domestique ; 2/ à domicile, à la maison - home banking : (la) banque à domicile - home schooling : (l’)enseignement à domicile, (l’) l’éducation à domicile, (l’)école à la maison, (l’)instruction en famille (aussi homeschooling) ; 3/ du pays, intérieur(e) - home affairs : (la) politique intérieure ; 4/ (Sport) qui reçoit - the home team : l’équipe qui reçoit, l’équipe locale (anton. the away team) * home (v) (intr.) : [pigeon] revenir au pigeonnier, revenir au colombier * homecoming (n) : 1/ retour au foyer, retour à la maison, retour au bercail, retour au pays (après une absence) - homecoming party : fête de retour au pays, fête de bienvenue, fête en l’honneur d’un revenant ; 2/ (amér.) fête des anciens élèves, retrouvailles (f pl.) * homeless (a) : sans abri, sans logis, sans domicile fixe (SDF), à la rue - the homeless (a. subst. pl.) : les sans-abri - homeless camp : campement de sans-abri, campement de sans-domicile-fixe / de SDF * homely (a) : 1/ accueillant(e) ; 2/ (brit.) sans prétention, simple ; 3/ (amér.) ordinaire, sans attraits * homemaking (n) : (le) ménage, (les) tâches ménagères (f pl.), (la) tenue de la maison * home owner / homeowner (n) : propriétaire de maison individuelle * home-ported (pp) : - [fishing yacht] to be home-ported in… ; [yacht de pêche] avoir … pour port d’attache * homer (n) : pigeon voyageur (syn. homing pigeon) * home-school / homeschool (v) (tr.) : éduquer à la maison, éduquer à domicile - to homeschool one’s children : éduquer ses enfants à la maison * home-schooler / homeschooler (n) : adepte de l’école à domicile * home-schooled (ac) : éduqué à la maison, éduqué à domicile * home-schooling / homeschooling (n) : (l’)éducation à la maison, (les) cours (pl.) à la maison * homestead (n) 1/ propriété (f), maison (f) ; 2/ propriété, terres (f pl.) * hometown (n) (amér.) : ville natale (f) (syn. brit. native town) * homeward bound (ac) : [navire] retournant au port, retournant au pays, sur le retour * homework (n inv) : devoirs (pl.), travail à faire à la maison - to assign homework : donner des devoirs à faire - to do one's homework : faire ses devoirs - to set homework : donner des devoirs - [students] to share homework : [élèves] faire leurs devoirs en commun - homework help : de l'aide pour faire ses devoirs * homey (a) voir homie * homicide (n) : 1/ (la chose) homicide - the homicide bureau : (la) brigade criminelle - the homicide detail : la brigade des homicides - homicide detective : inspecteur à la brigade criminelle, imspecteur à la criminelle, inspecteur à la crim’ (fam.) ; 2/ (la personne) * homie (a) (amér.) (arg.) : pote - my homies : mes potes * homing (a) : qui revient à la maison - homing pigeon : pigeon voyageur * homo (n) (tronc. de homosexual) : homo (n) * homogeneous (a) : homogène * homogeneously (adv.) : de façon homogène * homogenise (brit.) / homogenize (amér.) (v) (tr.) : homogénéiser * homograph (n) : homographe – homographs : mots de même graphie * homographic (a) : homographique * homonym (n) : homonyme * homonymous (a) : homonyme (a) - homonymous words : termes homonymes * homosexual (a) : homosexuel(le) * homosexual (n) : homosexuel(le) (n) - closeted homosexual : homosexuel honteux, homosexuel refoulé * homy (a) (amér.) : douillet(te) * honcho (n) : chef, patron - head honcho : grand chef, grand patron, grand manitou, grand sachem * hone (n) : pierre à aiguiser * hone (v) (tr.) : 1/ aiguiser, affûter ; 2/ (fig.) parfaire - to hone one’s skills : parfaire ses compétences * honest (a) : [individu] honnête, sincère ; 2/ [opinion, déclaration] honnête, franc/-che - to be honest (en incise) : pour être franc * honestly (adv.) : 1/ honnêtement ; 2/ franchement, vraiment * honestly (interj.) : (pour marquer sa désapprobation) franchement !, voyons ! * Honest-to-Goodness (expr.) : Je le jure devant Dieu !, Parole d’honneur ! * honest-to-goodness (a) : authentique, vrai(e) - an honest-to-goodness hero : un authentique héros - an honest-to-goodness wedding : un mariage en bonne et due forme * honey (n) : miel * honeypot (n) : 1/ pot de miel ; 2/ (Inf., Rens.) leurre * honk (n) : 1/ cri de l’oie ; 2/ coup de claxon, bruit de klaxon * honk (v) (intr.) : 1/ [oie] cacarder, criailler ; 2/ corner (arch.), klaxonner (at sb, après qn) * honky-tonk (n) (arg. amér) : cabaret borgne, bouge * honour (brit.) / honor (amér.) : honneur - honor roll (amér.) : tableau d’honneur * hood (n) : 1/ capuchon ; 2/ (amér.) capot (de voiture) ; 3/ hotte (f) (de cuisine) - cooker hood (brit.) : hotte aspirante - range hood (amér.) : hotte aspirante * hoodie (n) (amér.) : 1/ capuche (f) - to wear a hoodie sweatshirt : porter un sweat à capuche ; 2/ jeune à capuche * hoodoo (n) : 1/ (le) vaudou ; 2/ sortilège, mauvais sort ; 3/ personne / chose qui porte-malheur / qui porte la guigne (syn. pour 2/ et 3/ jinx) * hoodoo (v) (tr.) : 1/ jeter un sort à ; 2/ porter malheur à, porter la poisse à (fam.) * hoodwink (v) (tr.) : 1/ bander les yeux à ; 2/ tromper, duper * hoof (n) (pl. hooves) : sabot (d’un animal) - horse hoof : sabot de cheval * hook (n) : 1/ crochet - boat hook : gaffe (f) - boot hook : tire-botte (en forme de crochet) (masc.) ; 2/ agrafe (f) ; 3/ hameçon ; 3/ (Presse) accroche (f) ; 4/ (Mus.) accroche - music hook : accroche musicale * hook (v) (tr.) : prendre à l’hameçon * hooked (a) : 1/ crochu(e) - hooked nose : nez crochu ; 2/ - to be hooked : être accro, être mordu(e) - to become hooked : devenir accro (on sth, à qch) * hook-nosed (ac) : au nez crochu * hooky (n) (amér.) : école buissonnière (f), séchage des cours - to play hooky : faire l’école buissonnière, sécher les cours * hoop (n) : 1/ cercle (de tonneau) ; 2/ cerceau - hula hoop : cerceau - hoop forces : forces annulaires (f pl.) ; 3/ (Basket) panier * hoot (n) : 1/ hululement, ululement ; 2/ (en parlant d’une personne) rigolo (m), rigolote (f), gros marrant ; 3/ soirée où l’on rigole bien (fam.), réunion où l’on se marre (fam.) * hoot (v) (intr.) (brit.) : 1/ klaxonner ; 2/ lancer un coup de sirène ; 3/ huer (at sb, qn) * hooter (n) : nez, tarin (péj.), pif (fam.) * Hoover / hoover (n de marque) : aspirateur, aspi (fam.) * hoover (v) (tr.) : passer l’aspirateur dans / sur, aspirer * hop (n) : houblon (la plante) - hop garden : houblonnière (f) - hop picker : cueilleur de houblon * hop (n) : saut en avion, étape en avion - to do the journey in one hop : accomplir le voyage d’une traite - journey in five hops : voyage en cinq étapes, voyage en quatre escales * hop (v) : 1/ (intr.) sautiller ; 2/ aller en avion (to, à) * hope (n) : espoir * hope (v) : espérer - Youth is easily deceived, because it is quick to hope (Aristotle) - to hope that… : espérer que… - Here is hoping that… : Espérons que…, Il faut espérer que… * hopeful (a) : plein d’espoir, optimiste * hopefully (a m p) : espérons que…, il faut l’espérer (en incise) * Hopefully, … (a m p) (t d p) (amér.) : Si tout va bien, …, Espérons que … * hopper (n) : 1/ trémie (f) ; 2/ (amér.) sauterelle (f) ; 3/ - bed hopper (arg.) : débauché qui va de lit en lit - job hopper : personne qui va de boulot en boulot - nightclub hopper : personne qui va de boite de nuit en boîte de nuit, amateur de boîtes de nuit * hopping (n) : sautillement, sauts (pl.) - time hopping : sauts temporels (pl.) * hopscotch (n) : marelle (f) * hopscotch (v) (intr.) : jouer à la marelle * hopscotching (n) : jeu de la marelle * horizon (n) : horizon - to change horizons : changer d’horizon - the event horizon : (Cosmo.) l’horizon des évènements * horizontal (a) : horizontal(e) - horizontal machining : usinage horizontal * hormone (n) : hormone (f) - growth hormone : hormone de croissance * horn (n) : corne (f) * horned (ppa) : (selon le cas) à corne, à cornes - horned altar : (Archéo.) autel à cornes * horning (n) : coups de klaxon (pl.) * horny (a) : 1/ cornu(e) ; 2/ en corne ; 3/ calleux/-euse ; 4/ excité(e) sexuellement, qui a envie de baiser * horrific (a) : effroyable, horrible * horrify (v) (tr.) : horrifier, terrifier * horrifying (a) : horrifiant(e), terrifiant(e) * horror (n) : horreur (f), épouvante (f) - horror film : film d'épouvante, film d'horreur * horse (n) : 1/ cheval (pl. chevaux) - to harness a horse : harnacher un cheval - (a) horse and cart : (une) charrette tirée par un cheval - Trojan horse : cheval de Troie - horse chestnut : marron (le fruit) - the Horse Guards : la Garde à cheval - horse opera (amér.) : western de 2e catégorie - horse rider : cavalier - horse trader : marchand de chevaux, maquignon ; 2/ - white horse : mouton, vague à crête blanche ; 3/ (expressions) - Hold your horses! : Ne t’emballe pas ! / Ne vous emballez pas ! - to back the right horse : miser sur le bon cheval * horseman (n) : cavalier * horsemanship (n) : 1/ art de l’équitation ; 2/ monte (f) (= façon de monter) ; 3/ talent de cavalier ; 4/ qualité de l’équitation (chez un concurrent) * horse around (v) (intr.) : faire le pitre * horsepower (n) : puissance en chevaux-vapeur - 3,400 horsepower : 3400 chevaux-vapeur (pl.) * horsepox (n) : variole du cheval * horseshit (n) : crottin de cheval * horsewhip (n) : cravache (f) * horsewhip (v) (tr.) : cravacher * hortatory (a) : exhortatif/-ive - hortatory language : langage exhortatif * hose (n) : 1/ chausses (f pl.) ; 2/ conduit, tuyau, flexible (n) - shower hose : flexible de douche * hospitable (a) : hospitalier/-ière, accueuillant(e) * hospital (n) : hôpital - hospital intern : interne (n) des hôpitaux - hospital ship : navire hôpital - hospital ward : salle d’hôpital * hospitalise (brit.) / hospitalize (amér.) (v) (tr.) : hospitaliser - to get hospitalised : se faire hospitaliser * hospitality (n) : hospitalité (f), (bon) accueil * host (n) : foule (f), multitude (f) - a host of goodies : une multitude de gâteries * host (n) : ostie (f) - consecrated host : ostie consacrée * host (n) : 1/ hôte ; 2/ (Radio, Télé) animateur/-trice, présentateur-vedette / présentatrice-vedette - program host (amér.) : présentateur d’émission - radio host : animateur de radio - television host : animateur de télé (ex. : Larry King) ; 3/ (Net) hébergeur * host (v) (tr.) : (Net) héberger * hostage (n) : otage - hostage taker : preneur d’otages * hostile (a) : hostile * hostility (n) : hostilité (f) (to sth, à qch) - hostility to material progress : hostilité au progrès matériel * hosting (n) : (Net) hébergement - hosting platform : plate-forme d’hébergement * hot (a) : 1/ très chaud(e), brûlant(e) - piping hot (ac) : brûlant(e) - hot air : a/ air chaud ; b/ (fig.) du vent, des paroles en l’air - radiation from a hot object : rayonnement émis par un objet très chaud - hot issue : sujet brûlant - hot pad : chauffe-plat (masc.) - hot rod : voiture gonflée (f), bolide (aussi hotrod) - hot water : eau chaude (f) ; 2/ pornographique, porno (fam.) - hot film : film porno ; 3/ - to be hot (amér.) : (fig.) faire un tabac, faire un carton * hot-air (ac) : à air chaud * hotchpotch (n) (fam.) : salmigondis, méli-mélo, fatras, fourre-tout, pot-pourri * hotel (n) : hôtel - plush hotel : hôtel luxueux - resort hotel : hôtel de tourisme * hot-head / hothead (n) : exalté (n), tête brûlée (f), sanguin (n) (syn. hotspur) * hotrod (n) : voiture gonflée (f), bolide (aussi hot rod) * hot-roll (vc) : (tr.) laminer à chaud) * hotspur (n) : tête brûlée (f) (syn. hothead) * hottie (n) (amér.) (arg.) : chaudasse (f), fille bien roulée (f) * hot-water (ac) : à eau chaude * hound (n) : chien de chasse, chien courant - pack of hounds : meute de chiens - sleuth hound : chien limier * hound (v) (tr.) : 1/ traquer ; 2/ harceler * hour (n) : heure (f) - hours of operation : heures de marche (d’une machine) - dead hours : heures creuses - man hour : heure de main-d’œuvre - school hours: 9:20 am - 3:20 pm : heures de cours : 9 h 20 - 3 h 20 - permitted hours (brit.) : (dans un pub) heures autorisées - outside permitted hours : en dehors des heures autorisées - working hours : heures ouvrables- during school hours : pendant les heures de cours - outside school hours : en dehors des heures de cours - the hour hand : l’aiguille des heures, la petite aiguille * hourglass : sablier * hourly (a) : horaire - hourly workers : ouvriers payés à l'heure * house (n) : 1/ maison (f) - at my house : chez moi (avec verbe de mouvement = to my house) - around the house : dans la maison - house of cards : château de cartes (var. card house) - to have a house built : faire bâtir une maison - to break into a house : s'introduire par effraction dans une maison - to burgle a house : cambrioler une maison - bamboo house : maison de bambou, maison en bambou - manor house : manoir - open house : table ouverte (f) - It’s open house here! : C’est la maison du bon Dieu ici ! - to keep open house : tenir table ouverte - suburban house : maison de banlieue - straw bale house : maison en ballots de paille - wash house : lavoir - weekend house : résidence secondaire (f) - well house : puits couvert - house moving : déménagement - house sitter : garde-maison, gardien (de maison) - house sitting : gardiennage (de maison) ; 2/ maison (au sens d’entreprise) - fashion house : maison de haute couture, maison de couture, entreprise de mode - software house : éditeur de logiciels ; 3/ (Polit.) chambre (f) - the House of Representatives (amér.) : la chambre des députés, la chambre des représentants * house (v) (tr.) : loger, abriter, héberger - a tool magazine housing from 70 to 90 tools : (Usin.) un magasin à outils hébergeant de 70 à 90 outils (sur un centre d'usinage) * houseboat (n) : péniche habitée (f) * household (n) : maisonnée (f) - household appliance : appareil ménager - household electronics : a/ (pl.) appareils électroniques ménagers ; b/ (l’)électronique ménagère (f) - household linen : linge de maison - household products : produits ménagers - household scanner : scanner domestique, numériseur domestique - household tasks : tâches ménagères (f pl.) - household waste : ordures ménagères (f pl.) * householder (n) : propriétaire, chef de famille * housekeeper (n) : intendant/-te * houseman (n) (brit.) : interne (n) (à l’hôpital) * housemaster (n) (brit.) : professeur chargé d’un internat * housemate (n) : colocataire (m/f), coloc (m/f) (fam.) * house sit (v) (intr.) : garder la maison (for sb, de qn) * housework (n) : (le) ménage - The housework won’t take long : Le ménage sera vite fait * housing (n) : 1/ (le) logement - staff housing : logement de fonction - housing bubble : bulle immobilière ; 2/ enveloppe, carter ; 3/ boîtier, logement - weather-resistant housing : boîtier de bonne tenue aux intempéries * hovel (n) : taudis * hover (v) (intr.) : 1/ faire du sur place - [helicopter] to hover above a place : [hélicoptère] faire du sur place au-dessus d'un endroit ; 2/ traîner, rôder * hovercraft (n) : navire à effet de sol, aéroglisseur * hovering (n) : vol stationnaire * hovering (a) : faisant du sur-place - hovering flying craft : engin volant faisant du sur-place * how (adv./conj.) : comment - how to + inf. : comment + inf. * howdy (interj.) (amér.) : salut ! * however (adv. de liaison) 1/ (en tête de phrase, suivi d’une virgule, ou dans la phrase, entre virgules) cependant, toutefois, pourtant, du reste ; * however (conj. de concession) (devant adj. ou adv.) : si… que…, quelque… que…, * howl (v) (intr.) : [chien, vent] hurler * how-to (ac) : - how-to cassette : cassette pour apprendre * how-to (nc) : guide pratique - Read our installation how-to : Lire notre guide d’installation * hoy ! (exclam.) : ohé ! * HP (n) (abr. de hire purchase) : location-vente (f) * HS (n) (init. de high school) (amér.) - When I was in HS : Quand j’étais au lycée * HTML (n) (initiales de HyperText Markup Language) : HTLM * HTML-formatted : au format HTML - an HTML-formatted email : un message au format HTLM * hub (n) : 1/ moyeu (of a wheel, d'une roue) - hub cap : enjoliveur ; 2/ (Usin.) plaque tournante (f) - final-assembly hub : plaque tournante pour l'assemblage final ; 3/ (fig.) centre * hubbub (n) : vacarme * hubris (n) : arrogance (f), orgueil démesuré - an act of hubris : un crime d’orgueil * hubris-laden (ac) : plein(e) d’arrogance, à l’orgueil démesuré * huckaback (n) : grosse toile (f) * huddle (v) (intr.) : - to huddle together : se blottir (les uns contre les autres) - [écolier] to huddle over one’s notebook : être penché sur son cahier * Hudibrastic (a) : héroïco-burlesque * hue (n) : teinte (f), nuance (f) * huff (n) : dans l’expression to be in a huff (fam.) : être fâché(e), faire la tête, faire la tronche (fam.) * huff (v) : (tr.) sniffer (de la colle) ; (intr.) (fam.) souffler * huff and puff (v coord.) (intr.) : 1/ (dans Les Trois Petits Cochons) souffler et gronder - I’ll huff and puff and I’ll blow your house down ! : Je soufflerai, je gronderai et ta maison s’envolera ! ; 2/ être à bout de souffle, être essoufflé(e) * hug (n) : étreinte (f), accolade (f), embrassade (f), câlin (fam.) - Hugs! (en fin de message) : Bisous ! - bear hug : câlin (fam.) (assi bearhug) * hug (v) (tr.) : étreindre * huge (a) : énorme, vaste - a huge obstacle : un énorme obstacle - on a huge scale : à une vaste échelle * hugely (adv.) : 1/ énormément ; 2/ extrêmement, très - hugely popular : très apprécié(e) * hugger (n) : câlineur/-euse * huggie (n) : petit câlin - Do you need a huggie? : Tu veux un petit câlin ? - Give him a huggie! : Fais-lui un petit câlin ! * hulk (n) : lourdaud (n) * hull (n) : coque (f) (de navire) * hum (n) : bourdonnement, ronronnement * hum (v) : 1/ (tr.) fredonner ; (intr.) fredonner - to hum to oneself : fredonner à part soi ; 2/ (brit.) bredouiller, bafouiller (amér. to hem) * human (a) : humain, de l’homme - human being : être humain - human combustion : combustion spontanée (f) (d’un être humain) - human error : erreur humaine (f) - human intervention : (l')intervention humaine (f) - human language : langue humaine (f) - human operator opérateur humain - human rights : droits de l’homme - human trafficking : (la) traite des êtres humains * human (n) : être humain, humain (n) - to send humans into space : envoyer des hommes dans l'espace * hum and haw (brit.) : bredouiller, hésiter (amér. to hem and haw) * human-centric (ac) : axé(e) sur les besoins de l’homme, humanocentrique (Q) - human-centric information : informations humanocentriques * human-induced (ac) : provoqué(e) par l’homme (syn. man-made) - human-induced climate change : changement climatique provoqué par l'homme * humanitarian (a) : humanitaire - humanitarian affairs : affaires humanitaires, questions humanitaires - humanitarian aid : aide humanitaire (f) * humanities (n pl.) : (les) humanités (f pl.) , (les) lettres (f pl.) * human-like (ac) : à forme humaine - human-like alien : extraterrestre à forme humaine * humanoid (n) : humanoïde * humanware (n ind. sing.) : ressources humaines (f pl.) * humdinger (n) (arg. amér.) : personne ou chose époustouflante (f) - a humdinger of a… : un(e) sacré(e), un(e) foutu(e) … - a humdinger of a secretary : un secrétaire hors pair - My brother and sister had a humdinger of a row last night : Mon frère et ma sœur ont eu une sacré dispute hier soir - It will be a humdinger of a match : Ca va être un match d’enfer * humdrum (a) : monotone * humidistically controlled (ac) : [room ; pièce] régulé(e) par humidistat * humming (a) : bourdonnant(e) - humming noise : bourdonnement * humongous (a) (arg.) : énorme, gigantesque, monstre (fam.), balaise (fam.) * humor (amér.) / humour (brit.) (n) : humour - lavatory humour : humour de bas étage - - self-deprecating humour : humour mêlé d’autodérision * hump (n) (fam.) : bosse (f) * hump (v) (tr.) : voûter * Humvee (n) (amér.) (nom familier du HMMWV, init. de high mobility multipurpose wheeled vehicle, véhicule à roues polyvalent de haute mobilité) : humvee * hunch (n) : bosse (f) * hunch (n) (amér.) (fam.) : idée (f), intuition (f), pressentiment, soupçon - My hunch is that… : J’ai comme l’intuition que… - to follow one’s hunch : suivre son intuition - to have a hunch that… : avoir le pressentiment que…, soupçonner que… * hunch (v) (intr.) : se recroqueviller * hunchback (n) : bossu (n) * hunched (ppa) : recroquevillé(e) - to spend one’s day hunched over a desk : passer sa journée penché sur son bureau * hundred (a) : cent (adj.) * hundred (n) : centaine (f) * hundredfold (a) : centuple, multiplié(e) par 100 * (a) hundredfold (loc. adv.) au centuple, cent fois - He increased his wealth a hundredfold : il multiplia sa fortune par cent * hundredweight (n) : quintal * hung (prét. de to hang) * hung (pp irrég. de to hang) * hung (a) : [parlement] en suspens * Hungarian (a) : hongrois(e) (sans maj.) * Hungarian (n pr.) : Hongrois (le ressortissant), Hongroise (la ressortissante) * Hungarian (n) : hongrois (la langue) * Hungary (n pr.) : (la) Hongrie * hunger (n) : faim - hunger strike : grève de la faim * hungrily (adv.) : goulûment, d’un air affamé * hungry (a) : qui a faim, affamé(e) - to be hungry : avoir faim * hunk (n) : gros morceau * hunker (v) (intr.) : se tapir, s’accroupir * hunker down (v) (intr.) : 1/ s’accroupir ; 2/ s’installer, se caler (dans un fauteuil) ; 3/ (amér.) tenir bon * hunkers ( n pl.) : fesses (f pl.), arrière-train * hunky (a) (arg.) : (en parlant d’un mec) bien foutu, bien gaulé * hunt (n) : 1/ (l’action) chasse (f) - a stag hunt : une chasse au cerf ; 2/ (fig.) recherche (f), chasse - A full-scale hunt throughout the country has brought no trace of him : Une chasse à l’homme menée d’un bout à l’autre du pays n’a livré aucune trace - witch hunt : chasse aux sorcières * hunt (v) (tr.) : 1/ chasser ; 2/ pourchasser ; 3/ draguer (des filles) - to go hunting : aller draguer * hunt and gather (v. coord.) : (intr.) chasser-cueillir * hunt down (v) (tr.) : pourchasser * hunter (n) : chasseur, chasseresse - treasure hunter : chasseur de trésors - trophy hunter : chasseur de trophées - UFO hunter : chasseur d'ovnis (syn. UFO tracker) * hunter-gatherer (n double) : chasseur-cueilleur * hunting (n) : 1/ chasse (f) - virus hunting (Inf.) : la chasse aux virus, (la) traque des virus ; 2/ recherche (f) - job hunting : recherche d’un emploi ; 3/ drague ((f) (fam.) - bird hunting : (la) drague des nanas * hurdle (n) : 1/ haie (f) ; 2/ (fig.) obstacle (to, à/pour) * hurdler (n) : 1/ coureur de haies ; 2/ cheval de sauts d’obstacle * hurdles (n pl.) : course de haies * hurl (v) (tr.) (fa) : lancer violemment - to hurl abuse at sb : lancer des insultes à qn, accabler qn d’insultes * hurly-burly (n) : tumulte * hurricane (n) : ouragan * hurricane-prone (ac) : sujet(te) aux ouragans - hurricane-prone area : zone sujette aux ouragans * hurried (a) : fait(e) à la hâte - the hurried (a. subst. pl.) : les gens pressés * hurriedly (adv.) : hâtivement * hurry (n) : hâte - I’m in rather of a hurry : Je suis plutôt pressé * hurry (v) : (intr.) se hâter - to hurry home : rentrer vite chez soi * hurt (v) (hurt, hurt) : (tr.) faire mal à, blesser - You’re hurting me! : Tu me fais mal ! / Vous me faites mal ! ; (intr.) faire mal - Where does it hurt? : Où as-tu mal ? * hurtle (along) (v) (intr.) : aller à toute allure, aller à toute vitesse, foncer - to hurtle towards the precipice : foncer tout droit vers l’abîme * husband (n) : mari * husband (v) (tr.) : bien gérér * husbandry (n) : 1/ élevage (l’activité) - sheep husbandry : élevage de moutons, élevage ovin ; 2/ agriculture (f), agronomie (f) * hush puppy (n) (pl. hush puppies) : 1/ (amér.) : boulette de semoule de maïs frite, boulette de maïs frite ; 2/ (Hush Puppies) marque de chaussures * huskily (adv.) : d’une voix voilée * husky (n) : rauque, enroué(e), voilé(e) * hussy (n) (péj.) : friponne (n f), coquine (n f) * hustle (v) (tr.) : bousculer * hustler (n) : 1/ (arg. amér.) petit escroc, arnaqueur ; 2/ type dynamique, battant (n) * hut (n) : hutte (f) - charcoal burner hut : hutte de charbonnier - hut remains : vestiges de cabane * hutch (n) (pl. hutches) : clapier (à lapin) * HVF (n) (init. de high-value target : (Milit.) cible prioritaire, cible de choix) * hybrid (a) : hybride (a) * hybrid (n) : hybride (n) * hydrant (n) (amér.) : borne d’incendie, bouche d’incendie * hydraulic (a) : hydraulique - hydraulic press : presse hydraulique (f) * hydraulically (adv.) : hydrauliquement * hydrocarbon (n) : hydrocarbure * hydroelectric (a) : hydroélectrique - hydroelectric station : centrale hydroélectrique * hydro-fracking / hydrofracking (n) : fracturation hydraulique (f), hydro-fracturation / hydrofracturation (f) * hydrogen (n) : hydrogène - cars that run on hydrogen : voitures qui marchent à l'hydrogène - hydrogen peroxide: : péroxyde d’hydrogène, eau oxygénée (f) * hydroplane (n) : hydravion * hydropower (n) : énergie hydraulique (f), énergie hydroélectrique (f), hydroélectricité (f) * hyena (n) : hyène (f) - brown hyena : hyène brune - spotted hyena : hyène tachetée * hygiene (a) : hygiénique (anton. unhygienic) * hygienic (a) : hygiène (f) * hyperbolic (a) : exagéré(e), outrancier/-ière - hyperbolic statement : déclaration outrancière (f) * hyperinflation (n) : hyperinflation (f) * hyperlink (n) : (Int.) hyperlien * hypermedia (a) : hypermédia (a) * hypermedia (n) : hypermédia (n) * hyperonym (n) : hyperonyme * hypersensitive (a) : hypersensible (to, à) * hypersensitivity (n) : hypersensibilité (f) (to, à) - electromagnetic hypersensitivity : hypersensibilité électromagnétique, électrohypersensibilité (f) * hypersonic (a) : hypersonique - hypersonic missile : missile hypersonique * hypersystem (n) : (Int.) hypersystème (d’exploitation) * hyperventilation (n) : hyperventilation (f) . hyperventilate (v) (intr.) : hyperventiler * hyphen (n) : trait d’union * hyphenisation (brit.) / hyphenization (amér.) (n) : coupure des mots, division des mots * hyphenise (brit.) / hyphenize (amér.) (v) (tr.) : mettre un trait d’union à * hypnotise (brit.) / hypnotize (amér.) (v) (tr.) : hypnotiser (syn. to mesmerize) * hypocrisy (n) : hypocrisie (f) * hypocrite (n) : hypocrite (n) (m/f) * hypocritical (a) : hypocrite * hyponym (n) : hyponyme * hypothetically (adv.) : - hypothetically speaking (a m p) : si par hypothèse, pour risquer une hypothèse, à tout hasard, * hypothermia (n) : hypothermie (f) - to die from hypothermia : mourir d’hypothermie * hypothesis (n) (pl. hypotheses) : hypothèse (f) * hypothesise (brit.) / hypothesize (amér.) (v) : (tr.) avancer (qch) comme hypothèse - to hypothesise that… : avancer l’hypothèse que… ; (intr.) émettre une hypothèse, émettre des hypothèses * hypothetical (a) : hypothétique (aussi hypothetic) * hypothetically (adv. mod. phr.) : par hypothèse - if hypothetically you had anything to do with it : si par hypothèse, tu avais quelque chose à voir avec cela * hypoxia (n) : hypoxie (f) (déficit en oxygène d'une zone aquatique) * hypoxic (a) : hypoxique - hypoxic zone : zone hypoxique (f), zone morte (f) * hysteria (n) : hystérie (f) - to whip up hysteria : déchaîner l’hystérie * hysterical (a) : hystérique * hysterically (adv.) : hystériquement * hysterics (n pl.) : 1/ (fam.) crise de nerfs ; 2/ (fig.) fou rire 73oezal6kvk99lm3l9bighzkqbmrllj Vocabulaire anglais-français à l'intention des apprenants avancés/I 0 78014 768167 767571 2026-06-19T07:21:32Z Elnon 41284 /* I */ aux impacts 768167 wikitext text/x-wiki {{../Index}} === I === * I (pron. pers.) : je - I for one + verbe : pour ma part, je…, - I personally + verbe : Personnellement, je… * ibis (n) (pl. ibises, ou indén. ibis) : ibis * ICBM (n) (init. de intercontinental ballistic missile : missile balistique intercontinental) : ICBM * ice (n) : 1/ glace (f) - pack ice : glaces à la dérive, glace flottante - the pack ice off Newfoundland : les amas de glace au large des côtes de Terre Neuve - ice pack : a/ vessie de glace, poche de glace, sachet de glace, compresse de glace ; b/ banquise - the artic and subartic ice pack : la banquise arctique et subarctique - the drifting ice pack : la banquise dérivante - ice core : (Géol.) carotte de glace ; 2/ (brit.) de la glace (le dessert), de la crème glacée ; 3/ (expressions) - to cut no ice (with sb) : ne pas impressionner (qn) - All that cut very little ice with him : Tout cela eut très peu d’effet sur lui, Tout cela le laissa de marbre * icebox (n) : glacière (f) * icebreaker (n) : brise-glace (masc.) (le navire) * icecap (n) : calotte glaciaire (f) - the polar icecaps are melting : les calottes glaciaires fondent - melting icecaps : fonte des calottes glaciaires * Iceland (n pr.) : (l’)Islande * Icelander (n pr.) : Islandais (le ressortissant) * Icelandic (a) : islandais(e) (sans maj.) * Icelandic (n pr.) : islandais (la langue) * ichor (n) : sang des dieux (dans la mythologie grecque) * icing (n) : glaçage - icing sugar (brit.) : du sucre glace - the icing on the cake : (fig.) la cerise sur le gateau * icky (a) : 1/ gluant(e), visqueux/-euse, poisseux/-euse ; 2/ (arg.) dégoutant(e), dégueulasse, dégueu (abr.) * icon (n) : 1/ pictogramme ; 2/ (Inf.) icône (fém.) ; 3/ symbole * iconic (a) : iconique, mythique, emblématique - iconic car : voiture mythique (f) * iconise (brit.) / iconize (amér.) (v) (tr.) : mettre sous forme d’icône, représenter en icône, iconoser * idea (n) : idée - to come up with an idea : trouver une idée - fine ideas : de belles idées - good idea : bonne idée - half-assed idea : idée foireuse - mistaken ideas : idées fausses * ideal (a) : idéal(e) * ideal (n) : idéal * idealise (brit.) / idealize (amér.) (v) (tr.) : idéaliser * ideally (adv.) (fa) : en théorie * Ideally, … (a m p) (t d p) (fa) : Dans l'idéal …, L'idéal serait que …, En théorie, … * ideate (v) : (tr.) élaborer l’idée de, élaborer le concept de ; (intr.) former des idées, idéer (néol.), élaborer des concepts, conceptualiser * ideation (n) : élaboration d’idées, formation d’idées, idéation (néol.), élaboration de concepts, conceptualisation * ideational (a) : idéationnel(le), conceptuel(le) * identical (a) : 1/ identique, pareil(le) ; 2/ vrai(e) - identical twins : vrais jumeaux, vraies jumelles * identify (v) (tr.) : trouver la cause de, trouver l'origine de * ideological (a) : idéologique - ideological blindness : cécité idéologique * ideologue (n) : idéologue - dyed-in-the-wool ideologue : idéologue bon teint * ideology (n) (pl. ideologies) : idéologie - hate-filled ideology : idéologie marquée par la haine * idiocy (n) : 1/ (l’)idiocie, (la) stupidité, (la) bêtise - to be pure idiocy : C’est de la bêtise pure ; 2/ idioties (f pl.) * idiom (n) (fa p) : 1/ idiome ; 2/ idiotisme (= locution particulière à une langue, intraduisible mot à mot), expression idiomatique (f) * idiomatic (a) idiomatique - idiomatic expression : a/ expression idiomatique (f), b/ (Ling.) idiotisme (anton. unidiomatic) * idle (a) : 1/ (qui marche) au ralenti ; 2/ inactif/-ve, désœuvré(e), oisif/-ive ; 3/ vain(e), futile - idle talk : paroles en l'air (f pl.) * idleness (n) : oisiveté (f) * idly (n) : paresseusement * idol (n) : 1/ (Rel.) idole (f) ; 2/ (personne admirée) idole (f) * idolatrous (a) : idolâtre * idolise (brit.) / idolize (amér.) (v) (tr.) : idolâtrer * i.e. (m d l) (init. du latin id est) : c’est-à-dire, à savoir (lu « that is to say » en G.-B. mais souvent « i e » aux É.-U.) * if (conj. de condition.) : si - if ..., then ... : a/ (explication) si ..., c'est que ... ; b/ (conséquence) si ..., alors ... * iff (if and if only) (loc. conj.) : (raisonnement mathématique) si et seulement si * if not (m d l) : sinon * if or when (conj. coordonnées par or) : si ou quand (aussi if/when) * IGA (n) (init. de in-game advertising : publicité intégrée au jeu (vidéo)) * ignite (v) (tr.) : 1/ mettre le feu à, allumer ; 2/ susciter, déclencher - to ignite a coup : susciter un coup d’État * ignition (n) : 1/ mise à feu, allumage ; 2/ (sur un véhicule) allumage, contact * ignominious (a) : ignominieux/-euse, honteux/-euse * ignominiously (adv.) : ignominieusement * ignominy (n) : ignominie (f) * ignoramus (n) (pl. ignoramuses) : ignare (n m/f), ignorant, ignorante (n) * ignorant (a) : ignorant(e) - to be ignorant of sth : tout ignorer sur qch, ne rien savoir de qch * ignorantly (adv.) : par ignorance * ignore (v) (tr.) (fa) : 1/ faire semblant de ne pas connaître (qn) ; 2/ ignorer volontairement, refuser de prendre en considération, ne pas tenir compte de, ne pas suivre, laisser de côté, délaisser (qch) - to ignore (the) instructions : ne pas tenir compte des consignes * ikon (n) : voir icon (n) * ilk (n) : espèce (f), genre, acabit - of that ilk : de cet acabit * Ill. : abr. de Illinois, (l’)Illinois * ill (a) : 1/ malade ; 2/ mauvais(e) * ill (n) : mal (pl. maux) - imaginary ills : maux imaginaires * ill (adv.) : mal - to augur ill : augurer mal (for sb, pour qn) * ill-adapted (ac) : mal adapté(e), inadapté(e) - ill-adapted security measures : mesures de sécurité inadaptées (f pl.) * ill-advised (ac) : mal avisé(e) - ill-advised decision : décision mal avisée (f) - ill-advised move : initiative mal avisée (f) * ill at ease / ill-at-ease (ac) : mal à l’aise * ill-bred (ac) : mal élevé(e) * ill-conceived (ac) : mal conçu(e), mal foutu(e) (fam.) - ill-conceived experiment : expérience mal conçue (f) * ill-defined (ac) : mal défini(e), vague - ill-defined concept : concept vague - ill-defined powers : pouvoirs mal définis, pouvoirs qui restent à définir (anton. well-defined) * illegal (a) : 1/ illégal(e) ; 2/ clandestin(e) - illegal immigrant : émigrant clandestin - illegal logger : exploitant forestier clandestin - illegal logging : abattage illégal, abattage interdit * ill-equipped (ac) : mal équipé(e), mal outillé(e) - ill-equipped manufacturer : fabricant mal équipé, fabricant mal outillé * illicit (a) : illicite, illégal(e) - illicit enrichment : enrichissement frauduleux * ill-fated (ac) : malheureux/-euse, infortuné(e) * ill-gotten (ac) : mal acquis(e) - ill-gotten gains : biens mal acquis * Illinois (n pr.) : (l’)Illinois) * ill-informed (ac) : mal informé(e) - the ill-informed (a. subst. pl.) : les mal informés * illiteracy (n) : incapacité à lire et à écrire, analphabétisme - to eradicate illiteracy : éradiquer l’analphabétisme - functional illiteracy : illetrisme - illiteracy rate : taux d’analphabétisme * illiterate (a) : ne sachant ni lire ni écrire, analphabète * ill-lit (ac) : mal éclairé(e), peu éclairé(e) - ill-lit cell : cellule mal éclairée, cellule peu éclairée - ill-lit tunnel : tunnel mal éclairé * ill-maintained (ac) : mal entretenu(e), peu entretenu(e) * illness (n) (pl. illnesses) : maladie (f) - in the throes of an illness : en proie à une maladie - to contract an illness : attraper une maladie - a preventer of illness : un moyen d’éviter la maladie * ill-prepared (ac) : mal préparé(e) - ill-prepared personnel : personnel mal préparé * ill-suited (ac) : mal adapté(e), peu adapté(e) - ill-suited facility : installation mal adaptée (f) * ill-timed (ac) : intempestif/-ve, inopportun(e) - ill-timed initiative : initiative inopportune (f) * illuminating (a) : éclairant(e), qui nous éclaire - illuminating debate : débat éclairant * illuminatingly (adv.) : de façon éclairante * illusion (n) : illusion (f) - No one is under any illusion : Personne ne se fait d’illusions - optical illusion : illusion d’optique * illusionist (n) : illusioniste (n m/f) * illustrated (ppa) : illustré(e) - illustrated book : illustré (n) - illustrated parts list : liste de composants illustrée * ill will (n) : rancœur (f), rancune (f) * ill-wisher (n) : personne mal intentionnée (f) (anton. well-wisher) * image (n) : image (f) - royalty-free image : image libre de droits - image bank : banque d’images - image sensor : capteur d’images * imagery (n) : imagerie (f) - satellite imagery : imagerie satellitaire * imaginary (a) : imaginaire - imaginary ills : maux imaginaires - imaginary lands : pays imaginaires * imagine (v) (tr.) : imaginer - You’re imagining things : Tu te fais des illusions * imaging (n) : prise d’images (f), imagerie (f) - electronic imaging : imagerie électronique - space imaging : prise d’images depuis l’espace, imagerie spatiale - imaging satellite : satellite de prise d’images * imaginings (n pl.) : 1/ fruits de l’imagination (m pl.), inventions (f pl.), créations de l’esprit (f pl.) - overstretched imaginings : (une) imagination débordante ; 2/ élucubrations (f pl.), chimères (f pl.) * imbalance (n) : déséquilibre * imbroglio (n) : imbroglio * imitator (n) : émule (f) * I’mma (fam.) (contr. de I’m going to) * immaculate (a) : immaculé(e), impeccable * immaculately (adv.) : impeccablement, parfaitement * immaculately maintained (ac) : [maison] entretenu(e) de façon impeccable - immaculately maintained house : maison entretenue de façon impeccable * immaterial (a) : sans importance * immature (a) : immature (anton. mature) * immediate (a) : immédiat(e) * immediately (adv.) immédiatement, sur le champ * immediately (conj. de temps) (brit.) : dès que * immerse (v) (tr.) : plonger * immersion (n) : immersion (f) - French immersion classes : cours de français en immersion - immersion heater (brit.) : ballon d’eau chaude * immigrant (a) : immigré(e) * immigrant (n) : immigrant(e) (n m/f) - illegal immigrant : émigrant clandestin * immigration (n) : immigration (f) * immiserate (v) (tr.) : plonger dans la misère, appauvrir, paupériser * immiseration (n) : appauvrissement, paupérisation (f) * immoral (a) : immoral(e) (anton. moral) * immortal (a) : immortel (anton. mortal) * immortality (n) : immortalité (f) - to achieve immortality : devenir immortel * immunise (brit.) / immunize (amér.) (v) (tr.) : immuniser * immunity (n) : immunité (f) - herd immunity : immunité collective * immunologic (a) : immunitaire - the immunologic system : le système immunitaire * impact (n) : impact - impact event : collision (f) (avec un corps céleste) - impact resistance : résistance aux impacts (f) * impact (v) (tr.) (fa) : influencer, toucher * impactful (a) : percutant(e) * impact-resistant (ac) : résistant aux impacts - impact-resistant enclosure : boîtier résistant aux impacts * impair (v) (tr.) : altérer, abîmer, endommager, fausser, délabrer * impala (n) : impala (masc.) (antilope africaine) * impale (v) (tr.) : empaler (on, sur) * impalement (n) : empalement (on sth, sur qch) * impart (v) (tr.) : communiquer (to, à) * impartial (a) : impartial(e) * impartially (adv.) : 1/ impartialement, avec impartialité (anton. partially) ; 2/ objectivement, avec objectivité (syn. objectively) * impartiality (n) : impartialité (f) - a paragon of impartiality : un modèle d’impartialité * impassable (a) : 1/ [mountain, montagne] infranchissable ; 2/ [road, route] impraticable * impeach (v) (tr.) (fa) : 1/ mettre en accusation - to impeach a judge : mettre un juge en accusation ; 2/ (amér.) demander la destitution du (président) - to impeach the president : lancer la procédure de destitution du président ; 3/ jeter le doute sur, mettre en doute, attaquer, discréditer - to impeach a witness : récuser un témoin - to impeach the credibility of the accused one : attaquer la crédibilité de l'accusé * impeachment (n) (fa) : 1/ mise en accusation ; 2/ (amér.) procédure de destitution ; 3/ mise en doute * impede (n) : gêner (syn. hamper, hinder) * impediment (n) : empêchement, obstacle, entrave (f), pierre d’achoppement * impel (v) (prét. et pp -lled) (tr.) : 1/ [peur, curiosité, etc.] pousser (qn à faire qch) - to be impelled to action : être poussé à agir - to be impelled by curiosity : être poussé par la curiosité ; 2/ inciter (qn à faire qch) - This is what finally impelled me to start a blog : C'est ce qui m'a finalement incité à commencer un blogue * impending (a) : imminent(e) * imperative (n) : (Gram.) impératif (n) * imperceptible (a) : imperceptible * imperial (a) : impérial(e) - imperial overstretch : sur-expansion de l'empire * imperialism (n) : impérialisme * imperialistic (a) : impérialiste * impertinence (n) : impertinence (f) * impertinent (a) effronté(e) * impetus (n) : élan, vitesse acquise (f) * impinge (v) (intr.) : empiéter (on, sur) * impish (a) : espiègle, malicieux/-euse * implacable (a) : implacable - implacable enemy : ennemi implacable * implausible (a) : peu plausible, invraisemblable * implement (n) : instrument (syn. tool) - agricultural implements : instruments aratoires * implement (v) (tr.) (fa) : mettre en œuvre, mettre en pratique, exécuter, rendre effectif * implementation (n) (fa) : mise en œuvre (f), mise en pratique * implicit (a) : implicite * implicitly (adv.) : implicitement * implode (v) (intr.) : imploser * implore (v) (tr.) : implorer * implosion (n) : implosion (f) * imply (v) (tr.) : sous-entendre * important (a) : important(e) * importantly (adv.) : de manière importante - but more importantly : mais surtout * import (n) : 1/ importation (f) (l’activité) ; 2/ (svt au pl. imports) importation (le produit), produit importés - cheap imports : importations à bon marché - price-worthy imports : importations d’un bon rapport qualité-prix * import (v) (tr.) : importer (from, de), faire venir (from, de) - to import cheap labour : faire venir de la main-d’œuvre à bon marché * imported (ppa) : importé(e) - imported oil : pétrole importé * importer (n) : importateur/-trice - electricity importer : importateur d’électricité * impose (v) (tr.) : imposer (on sb, à qn) - to impose sanctions on a country : imposer des sanctions à un pays * imposition (n) : imposition (f) (on, à) - imposition of sanctions on a country : imposition de sanctions à un pays * impossibility (n) : impossibilité (f) * impossible (a) : impossible - the impossible (a. subst. sing.) : l’impossible - to do the impossible : faire l’impossible - to make the impossible possible : rendre possible l’impossible * impost (n) : 1/ taxe (f) - customs impost : taxe à l’importation ; 2/ (Course hippique) handicap * imposture (n) : imposture (f) * impoverish (v) : appauvrir, paupériser (syn. to immiserate) * impoverishment (n) : appauvrissement, paupérisation (syn. immiseration) * impound (v) : 1/ confisquer, saisir ; 2/ mettre (un véhicule) à la fourrière, emmener (un véhicule) à la fourrière - impound fees : frais de récupération d’un véhicule saisi - impound towing charges : frais de remorquage d’un véhicule saisi ; 3/ retenir (de l’eau) - water impounded by a dam : eau retenue par un barrage * impounded (ppa) : [véhicule] qui est à la fourrière - impounded vehicle : véhicule mis en fourrière * impoundment (n) : 1/ saisie (f) ; 2/ retenue (f) (d’eau) * impractical (a) : irréaliste * imprecise (a) : imprécis(e) * impregnate (v) (tr.) : féconder, fertiliser * impress (v) (tr.) : impressionner * impression (n) : 1/ impression (f) - first impressions : premières impressions ; 2/ imitation (f) - to do impressions of sb : faire des imitations de qn * impressionable (a) : impressionnable, influençable (anton. unimpressionable) * impressive (a) : impressionnant(e) * imprint (n) : 1/ (prop. et fig.) empreinte (f) - to bear the imprint of… : porter l’empreinte de… - to leave one’s imprint : laisser son empreinte (on sth, sur qch); 2/ marque d’imprimeur (f), marque d’éditeur - Printer’s imprint. Corbet printing house, May 2010 : Achevé d’imprimer en mai 2010 sur les presses de l’imprimerie Corbet ; 3/ (Presse brit.) ours (pavé recensant les responsables d’un journal) * imprint (v) (tr.) : imprimer sa marque sur , marquer * imprison (v) (tr.) : emprisonner * imprisonment (n) : emprisonnement, réclusion (f) - to be sentenced to ten years' imprisonment : être condamné à 10 ans de réclusion - life imprisonment : réclusion à perpétuité * improbable (a) : improbable - the improbable (a. subst. sing.) : l’improbable * improper (a) : 1/ inconvenant(e), indécent(e) ; 2/ incorrect(e) * improperly (adv.) : 1/ de manière inconvenante, de façon indécente ; 2/ incorrectement, à tort, mal * improperly adjusted (ac) : mal réglé(e) - improperly adjusted carb : carbu mal réglé * improvable (a) : améliorable * improve (v) (tr.) : améliorer * improved (ppa) : amélioré(e), accru(e) - improved productivity : productivité accrue * improvement (n) : amélioration (f), progrès - technical improvement : amélioration technique - a vast improvement : une amélioration considérable (over, par rapport à) * improvisational (a) : d’improvisation, improvisé(e) * impulse (n) : impulsion (f) - nerve impulses : impulsions nerveuses (pl.), influx nerveux (sing.) - impulse generator : générateur d’impulsions * impulsion (n) : impulsion (f) * impulsive (a) : impulsif/-ive * impulsiveness (n) : impulsivité (f) * impure (a) : impur(e) * impurity (n) : 1/ impureté (f), caractère impur ; 2/ pollution (f) ; 3/ (svt au pl.) impurities : impuretés * in (prép.) 1/ (sans mouvement) dans ; 2/ sous la forme de ; 3/ + unité de mesure : en ; 4/ + gér. : au cours de, lors de * in absentia (loc. adv.) : (Droit) par contumace * in accordance with (loc. prép.) : conformément à, en tenant compte de - in accordance with established procedures : selon les procédures en vigueur * inaccuracy (n) : inexactitude (f), erreur (f) * inaccurate (a) : inexact(e), erroné(e) * inaccurately (adv.) : 1/ avec inexactitude ; 2/ de manière peu précise (anton. accurately) * in addition to (loc. prép.) : 1/ (+ subst.) en plus de, outre ; 2/ (+ gér.) en plus de + inf. * inadequate (a) : insuffisant(e) - inadequate schooling : études scolaires insuffisantes (f pl.) * inamorata (n) : dulcinée (f) * in and around (prép. coordonnées) : à l'intérieur et autour de + subst. * inane (a) : inepte, stupide, idiot(e) (syn. absurd) * inanimate (a) : inanimé(e) * in any case (m dl) : en tout cas * inappropriate (a) : 1/ inadapté(e), inadéquat(e) ; 2/ inconvenant(e) (anton. appropriate) * inarguable (a) : incontestable, indiscutable * inasmuch as (loc. conj. de cause) (après prop. princ.) : 1/ attendu que, vu que, d’autant (plus) que ; 2/ dans la mesure où * inaugural (a) : inaugural(e), d’inauguration * in-betweening / inbetweening (n) : dessin des raccords, dessin des images intermédiaires, intervallage (néol.) * inbound (a) : 1/ [bateau, train] à l’arrivée, en provenance ; 2/ (Toile) entrant(e) - inbound link : lien entrant * inbox (n) (pl. inboxes) : boîte d’arrivée * inbred (a) : 1/ inné(e) ; 2/ ayant un fort degré de consanguinité, de parents consanguins * inbreeding (n) : consanguinité (f) * in-built (ac) : incorporé(e), intégré(e) * Inc. : abr. de Incorporated * incandescence (n) : incandescence (f) * incandescent (a) : incandescent(e) * incarnate (a) : incarné(e), personifié(e) - the Devil Incarnate : le diable incarné * in case (loc. conj.) (t d p) : a/ (éventualité présente) si ; b/ (éventualité à venir, raison possible, crainte) au cas où, pour le cas où - in case the FAT should become corrupted : au cas où la table d'allocation des fichiers s'altèrerait * in case of (loc. prép.) : en cas de - in case of a malfunction : en cas de dysfonctionnement * incense (n) : encens * incense (v) (tr.) (fa) : mettre en colère, rendre furieux/-euse * incentive (n) : moyen de persuasion * incentivise (brit.) / incentivize (amér.) (v) (tr.) : encourager, stimuler, aiguillonner (qn) (anton. to disincentivise/-ize) - to incentivise sb to do sth : inciter qn à faire qch * inch (n) (pl. inches) : pouce (la mesure) * inch (v) : (tr.) faire avancer à petits pas ; (intr.) avancer petit à petit * incident (n) : incident - operating incident : incident de fonctionnement * incidental (a) : 1/ accidentel(le), fortuit(e) ; 2/ accessoire, annexe, secondaire * incidentally (adv.) : accessoirement, secondairement, de manière annexe - Incidentally, … (a m p) (t d p) : D'ailleurs, …, Soit dit en passant, … * incinerate (v) (tr.) : incinérer * incineration (n) : incinération (f) * incinerator (n) : incinérateur * incisor (n) : incisive (n) (f) * inciting (a) : qui encourage, qui pousse (à faire qch) - inciting agent (Intel.) : agent provocateur * incl. : abr. de included ou de including * incline (n) : plan incliné * include (v) (tr.) : comprendre, renfermer, englober * included (ppa) : compris, y compris - All his property was sold, his house included : Tous ses biens furent vendus, y compris sa maison * including (prép.) : y compris, dont, subst. + inclus, parmi lesquels/-quelles - including pick-up at your office : y compris l'enlèvement (de la machine) à votre bureau * in combination with (loc. prép .) : en combinaison avec, combiné(e) à * income (n) : revenu (n) - median incomes : revenus moyens - taxable income : revenu imposable - income bracket : tranche de revenu - income support (brit.) : aide au revenu, soutien au revenu * incoming (a) : (qui vient) de l'extérieur, entrant(e) * in comparison to / with : cf. by comparison to / with * incompatibility (n) : incompatibilité (f) * incompatible (a) : incompatible (anton. compatible) * in concert with (loc. prép.) : de concert avec, parallèlement à * incongruous (a) : 1/ incongru(e), incohérent(e) ; 2/ incongru(e), déplacé(e) * in conjunction with (loc. prép.) : conjointement avec, de concert avec * in connection with (loc. prép.) : 1/ en liaison avec, en rapport avec ; 2/ dans le cadre de * inconsequential (a) : sans conséquences * in consideration of (loc. prép.) : en considération de, eu égard à, attendu * inconsistency (n) (pl. inconsistencies) : 1/ manque de cohérence ; 2/ incohérence (f), contradiction (f) - to point out inconsistencies : relever des incohérences * inconsistent (a) : incohérent(e), contradictoire * inconspicuous (a) : peu en évidence, qui passe inaperçu(e), peu visible * in contrast to (loc. prép.) : par opposition à, contre * inconvenient (a) (fa) : 1/ gênant(e) (anton. convenient), peu pratique, malcommode - an inconvenient truth : une vérité gênante ; 2/ inopportun(e) * incorporate (v) : 1/ (tr.) incorporer qch (into, dans), intégrer qch (into, dans) ; 2/ (tr.) constituer en société ; (intr.) se constituer en société * incorporated (ppa) (fa p) : 1/ incorporé(e) ; 2/ constitué(e) en société commerciale, enregistré(e) * incorporation (n) (fa) : constitution (f) (une société) - incorporation of a company : constitution d’une société * incorrect (a) : incorrect(e) - unless I am incorrect : sauf erreur de ma part * incorrectly (adv.) : incorrectement, mal (anton. correctly) * incorrectly configured (ac) : mal configuré(e) * incorrectly set (ac) : mal réglé(e) * increase (n) : accroissement, augmentation (f) - significant increase : augmentation importante (f) - on the increase : en augmentation * increase (v) : (tr. et intr.) accroître, augmenter - to increase production : accroître la production * increasing (a) : croissant(e) * increasingly (adv.) : de plus en plus - to grow increasingly dim : s'estomper de plus en plus - to grow increasingly outdated : être de plus en plus dépassé(e) - Increasingly, … (a m p) (t d p) : De plus en plus, … * increasingly affluent (ac) : ayant de plus en plus de moyens financiers * incredible (a) : incroyable * incriminatory (a) : compromettant(e) * inculcate (v) (tr.) : inculquer - to inculcate knowledge : inculquer des connaissances (in sb, à qn) * incumbency (n) : 1/ mandat, exercice, durée de sa charge, durée de ses fonctions ; 2/ obligation (f), charge (f), devoir * incumbent (n) : titulaire (m/f) * incur (v) (tr.) : encourir, s’attirer - to incur extra charges : encourir des frais supplémentaires * Ind. : abr. de Indiana, (l’)Indiana * indebted (a) (fa) : redevable (to sb, à qn) * indecent (a) : inconvenant(e), déplacé(e), choquant(e), indécent(e) - indecent assault : attentat à la pudeur - indecent proposal : proposition inconvenante (f), proposition déplacée, avances malhonnêtes (f pl.) * indecorous (a) : sans dignité * indeed (adv.) : en vérité, certes, (et) effectivement * indefatigable (a) : infatigable * indefensible (a) : indéfendable - Defending the indefensible : Défendre l'indéfendable * indefinite (a) : 1/ indéfini(e) - indefinite article : (Gram.) article indéfini ; 2/ indéterminé(e) * indefinitely (adv) : indéfiniment * indented (a) : renfoncé(e) * independence (n) : indépendance (f) * independent (a) : indépendant(e) * independentist (a) : indépendantiste * independentist (n m/f) : indépendantiste * index (n) (pl. indices) : 1/ index (d’un livre) ; 2/ catalogue, index ; 3/ indice (le nombre) - the cost of living index : l’indice du coût de la vie * indexing (n) : - indexing table : (Usin.) plateau diviseur * India (n pr.) : (l’)Inde * indiaman (n) : navire qui fait le voyage des Indes * Indian (a) : 1/ de l’Inde, indien(ne) (sans maj.) ; 2/ (Amér.) indien(ne), amérindien(ne) - Indian summer (amér.) : a/ été indien, été des Indiens (Q) ; b/ (fig.) vieillesse heureuse (f) * Indian (n pr.) : 1/ Indien (le ressortissant del’Inde) ; 2/ Indien (d’Amérique), Amérindien - wooden Indian ; figurine de peau-rouge sculptée dans le bois (devant un commerce) - a cigar store wooden Indian : un peau-rouge en bois devant un commerce de cigares * Indiana (n pr.) : (l’)Indiana (f) * indicator (n) : indicateur - progress indicator : indicateur de progression - indicator lamp : lampe témoin (f) * indict (v) (tr.) : i1/ nculper (for, de), mettre en examen (for, pour) ; 2/ mettre en cause * indictable (a) : passible de poursuites * indictment (n) : 1/ inculpation (f), mise en examen ; 2/ mise en cause - a scathing indictment of… : une mise en cause cinglante de… * indefensible (a) : indéfendable, injustifiable * indie (a) (tronc. de independent indépendant) (fam.) indépendant(e) - (the) indie press (la) presse indépendante * indifference (n) : indifférence (f) (to, à) * indifferent (a) : indifférent(e) * indigeneity (n) : indigénéité (f) * indigenous (a) : indigène - indigenous people : (les) indigènes * indigenously designed (a) : conçu dans le pays, conçu localement, de conception locale - indigenously designed missile : missile de conception nationale * indignity (n) (pl. indignities) : indignité (f), affront - to suffer may indignities : passer par bien des affronts * indirect (a) : indirect(e) - indirect speech : discours indirect * indiscreet (a) (fa p) : 1/ indiscret/-ète ; 2/ imprudent(e), peu judicieux/-euse (dans sa conduite) * indiscretion (fa) : manque de tact - social indiscretion : faux-pas - youthful indiscretion : péché de jeunesse * indiscriminate (a) : 1/ fait(e) à tort et à travers, fait(e) sans aucun sens critique ; 2/ fait(e) au hasard * indiscriminately (adv.) : 1/ sans distinction ; 2/ sans discernement * individual (a) : individuel(le) * individual (n) : individu - a private individual : un particulier * individually (adv.) : individuellement * individually adressed (ac) : [exemplaire de journal] envoyé à des particuliers * indoctrinate (v) (tr.) : indoctriner * indoor (a) : d’intérieur, intérieur(e) * indoors (adv.) : à l’intérieur, à l’abri, à la maison * induce (v) (tr.) : 1/ causer, entraîner, provoquer - to induce panic : causer la panique ; 2/ (Méd.) provoquer (volontairement) - to induce a coma : provoquer un coma ; 3/ (Élect.) induire (un courant) ; 4/ déclencher - to induce labour : déclencher l’accouchement ; 5/ (fam.) to induce sb : déclencher l'accouchement chez qn - The doctors are inducing her tomorrow : Les docteurs déclencheront son accouchement demain ; 6/ inciter (to + inf., à + inf.), persuader (to + inf., de + inf.) * induced (ppa) : 1/ provoqué(e) - induced coma : coma provoqué, coma artificiel ; 2/ induit(e) - induced radioactivity : radioactivité induite (f) * inducement (n) : 1/ incitation (f), encouragement ; 2/ déclenchement (of labour, d'un accouchement) * inducer (n) : 1/ incitateur/-trice ; 2/ (Élec., Biol.) inducteur * induction harden (vc) (tr.) : tremper par induction * indulge (v) : (tr.) - to indulge s.o.’s wishes : satisfaire les désirs de qn - to indulge oneself in + subst. : s’adonner à + subst. ; (intr.) to indulge in sth : se livrer à qch, s’adonner à qch - He indulges in every wish : Il ne se refuse rien * industrial (a) : industriel(le) - industrial base : base industrielle (f) (d’un pays, etc.), tissu industriel (d’un pays, etc.) - industrial park : zone d’activités industrielles - industrial placement : stage industriel, stage en entreprise - an industrial powerhouse : une (grande) puissance industrielle (f) * industrial (n) (pl. industrials) : (Bourse) valeur industrielle (f) * industrialise (brit.) / industrialize (amér.) (v) (tr.) : industrialiser * industrial-size (ac) : de taille industrielle - industrial-size refrigeration unit : système de réfrigération de calibre industriel * industrialist (n) : industriel (n) - military industrialist : industriel de l’armement * industrious (a) : 1/ industrieux/-euse ; 2/ travailleur/-euse, bûcheur/-euse * industriousness (n) : esprit industrieux, caractère industrieux * industry (n) (pl. industries) (fa p) : 1/ industrie (f) - (the) aircraft industry : (l’)industrie aéronautique - (the) heavy industry : (l')industrie lourde - high tech-related industries : industries de haute technologie - the modelling industry : l'industrie du mannequinat - processing industries : industries de transformation - industry standard : norme industrielle ; 2/ secteur, filière (f) - the eye care industry : le secteur des soins oculaires, la filière des soins oculaires * in effect (m d l) : 1/ en fait ; 2/ en pratique, dans les faits * ineffectual (a) : sans effets, sans résultats * inept (a) : 1/ [individu] inapte, incompétent(e), incapable ; 2/ [individu] inepte, stupide * ineptness (n) : 1/ inaptitude (f), incompétence (f), incapacité (f) (d’une personne) ; 2/ ineptie (f), stupidité (f) * inequality (n) : inégalité (f) - social inequality : inégalité sociale * inertia (n) : inertie (f) (prop. et fig.) * inertial (a) : inertiel(le), d’inertie - inertial guidance : guidage inertiel * inescapable (a) : incontournable - the inescapable lesson of the accident is that… : la leçon incontournable de l’accident, c’est que… * inestimable (a) : inestimable (syn. invaluable) * inevitable (a) : inévitable, inéluctable, immanquable, fatal(e) - the inevitable (a. subst. sing.) : l’inévitable * inevitably (adv.) : inévitablement, inéluctablement, immanquablement, fatalement - Inevitably, … (a m p) (t d p) : Chose inévitable, … * in excess of (loc. prép.) : au-dessus de, dépassant - temperatures in excess of 70°C : des températures dépassant 70°C * inexcusable (a) : inexcusable - the inexcusable (a. subst. sing.) : l’inxcusable - to excuse the inexcusable : excuser l’inexcusable * inexperienced (a) : qui n’a pas d’expérience, inexpérimenté(e) (anton. experienced) * inexplicable (a) : inexplicable - inexplicable case : cas impossible à élucider * inexplicably (adv.) : de façon inexplicable, inexplicablement * in fact (m d l) : en fait * infamous (a) : 1/ infâme, abominable ; 2/ tristement célèbre, notoire * infancy (n) (fa) : petite enfance (f) * infant (n) (fa) : 1/ petit enfant - infant school : école maternelle (f) ; 2/ nourrisson * infante (n) : infant(e) (enfant puisné des rois d’Espagne et du Portugal) * infantile (a) : enfantin(e), puéril(e), infantile * infantilism (n) : infantilisme * infantry (n) : infanterie (f) - airborne infantry : infanterie aéroportée - infantry grunts : soldats d’infanterie * infantryman (n) : fantassin * infected (ppa) : infecté(e) - to get infected : s’infecter * infection (n) : infection (f) - to pick up an infection from a pet animal : attraper une infection d’un animal de compagnie * infectious (a) (fa p) : 1/ infectieux/-euse ; 2/ [rire] contagieux/-euse, communicatif/-ve * infelicity (n) 1/ (l’état) malheur, infortune (f) ; 2/ (l’incident) malheur, infortune (f) ; 3/ maladresse (f) - In some cases there are mistakes or infelicities in the English : Dans certains, il y a des erreurs ou des maladresses dans l’anglais utilisé * infer (v) (tr.) : déduire * inference (n) : déduction (f) * inferior (a) : inférieur(e) * inferiority (n) : infériorité (f) - an inferiority complex : un complexe d’infériorité * inferno (n) (pl. infernos) : 1/ (lit.) enfer, enfers (pl.) ; 2/ brasier ; 3/ (fig.) fournaise (f) * infertile (a) : 1/ [personne] stérile ; 2/ [sol] infertile (anton. fertile : fertile) * infestation (n) : infestation (f), prolifération (f) - a botfly infestation : une prolifération de gastrophiles * infiltrate (v) (tr.) : envahir peu à peu * infinite (a) : infini(e) - the infinite : l’infini * infinitely (adv.) : 1/ infiniment ; 2/ (fig.) infiniment, extrêmement * infinitesimal (a) : infinitésimal(e) * infinitesimally (adv.) : infinitésimalement * infinitive (n) : (Gram.) infinitif - infinitive of purpose : infinitif de but * infinity (n) : infinité (f) * inflatable (a) : gonflable - inflatable life jacket gilet de sauvetage gonflable * inflate (v) : 1/ (tr.) gonfler (un pneu, un gilet de sauvetage) ; (intr.) se gonfler, enfler - to inflate a life jacket : gonfler un gilet de sauvetage ; 2/ (tr.) gonfler (les prix, les chiffres, les factures) - to inflate bills : gonfler les factures ; 3/ (tr.) boursoufler ; (intr.) se boursoufler * inflation (n) : 1/ gonflage - tyre inflation : gonflage de pneus ; 2/ gonflement (involontaire) - grade inflation (Éduc.) : le gonflement des notes ; 3/ (Écon.) inflation (f) - low inflation : faible inflation - high inflation : inflation forte * inflator (n) : gonfleur - tyre inflator : gonfleur de pneus * inflect (v) (tr.) : 1/ fléchir - to inflect a verb : fléchir un verbe, conjuguer un verbe ; 2/ moduler - to inflect one's voice : moduler sa voix * inflected (ppa) : fléchi(e), flexionnel(le) - inflected language : langue qui prend des marques flexionnelles, langue flexionnelle (anton. non-inflected) * inflict (v) (tr.) : infliger - to inflict unnecessary pain on oneself from + subst. : se faire fustiger inutilement par + subst. * inflight (a) : en vol * influence (n) : influence (f) - to wield too much influence over sb : avoir trop d’influence sur qn - influence peddling : trafic d'influence - influence wielder : trafiquant d’influence * influence (v) (tr.) : influencer - to influence human behaviour : influencer le comportement humain * influencing (n) : fait d’influencer - mind influencing : emprise mentale (f) * influential (a) : influent(e) * influenza (n) : grippe (f) - seasonal influenza : grippe saisonnière * influx (n) (fa) : afflux (de gens, d'argent), arrivée (f) (de liquide) * info (n ind. sing.) (tronc. fam. de information) : infos (f pl.), renseignements (pl.), précisions (f pl.) - to be begging for info : être impatient d’en apprendre plus, avoir hâte d’en savoir plus - to get info about sth : obtenir des précisions sur qch - additional info : infos supplémentaires (f pl.) - contact info : coordonnées (f pl.) - useful info : infos utiles - info sheet : fiche d’information * infomercial (n) (contr. de informative commercial) : publi-reportage, infopublicité (f) * in for (postp. + prép.) : - to put one’s car in for service : mettre sa voiture à la révision * in for (loc. prép.) : dans l’expression to be in for sth : être bon pour qch, avoir droit à qch - to be in for a pretty gruelling time : être bon pour quelques moments bien éprouvants * inform (v) : 1/ - to inform sb that… : informer qn que… ; 2/ - to inform sb of sth : informer qn de qch ; 3/ façonner - to inform one’s personal opinion : se faire une opinion personnelle * informal (a) : 1/ simple, sans cérémonie ; 2/ familier/-ière - informal language : langage familier ; 3/ décontracté(e) * informality (n) : 1/ caractère simple, simplicité (f), absence de cérémonie ; 2/ caractère familier, familiarité (f) ; 3/ décontraction (f) * informally (adv.) : 1/ en toute simplicité, sans cérémonie ; 2/ officieusement (anton. formally) * information (n ind. sing.) : renseignements (pl.), indications (f pl.), informations (f pl.), infos (f pl.), données (f pl.) - Very little information is available on the subject : On dispose de très peu de renseignements sur le sujet - delivery of information : fourniture d’informations - to provide information (on a subject) : fournir des informations (sur un sujet) - a piece of information : un élément d’information, une information - classified information : informations classées secret défense - inside information : renseignements confidentiels, informations privilégiées - junk information : infos à deux balles, infos pourries, infos de merde (vulg.) - quality information : informations sérieuses - second-hand information : informations de seconde main - unclassified information : informations non classées secret défense - unverified information : informations non vérifiées - information gathering : collecte d’informations - an information item : un élément d’information, une information - information officer : documentaliste - information overload : surcharge informationnelle (f) - information provider : fournisseur d’informations - information retrieval : recherche documentaire (f) - information stream : flux d’informations - information vacuum (on a subject) : carence totale d’informations (sur un sujet), vide informationnel - information warrior : cyber-guerrier / cyberguerrier * informed (ppa) : [personne] avisée(e), qui s’y connaît * info-seeking (ac) : [public] à la recherche de nouvelles / d’informations * infostream (n) (contr. de information stream) : flux d’informations * infotainment (n) (contr. de information et de entertainment) : infodivertissement (contr. de informations et de entertainment) * infrared (a) : infrarouge, à infrarouges - the infrared part of the spectrum : la portion à infrarouges du spectre * infrared (n) : infrarouge (n) * infrequent (a) : peu fréquent(e), rare, occasionnel(le * infrequently (adv.): peu fréquemment, rarement, occasionellement * infrequently-used (ac) : peu souvent utilisé(e) - infrequently-used file : (Inf.) fichier peu souvent utilisé * in front of (loc. prép.) : 1/ devant, à l'avant de ; 2/ en face de * infuriate (v) (tr.) : rendre furieux/-euse, exaspérer * infuriating (a) : exaspérant(e), rageant(e) * in-game (ac) : intégré au jeu (vidéo) - in-game advertising : publicité intégrée au jeu - optional in-game purchases : achats intégrés facultatifs * ingenious (a) : astucieux/-euse, malin/-igne, ingénieux/-euse * ingenuity (n) (fa) : ingéniosité (f) * ingenuous (a) : candide, innocent(e) * ingenuousness (n) : ingénuité (f) * ingot (n) : lingot * ingrained (a) : 1/ enraciné(e) ; 2/ tenace - ingrained dirt : crasse (f) * ingrate (n) : ingrat (n) * ingrown (a) : 1/ (ongle de pied) incarné(e) - ingrown toenail : ongle de pied incarné ; 2/ (fig.) enraciné(e) * inhabit (v) (tr.) : habiter * inhabitable (a) (fa) : habitable (anton. uninhabitable : inhabitable) * inhabitant (n) : habitant(e) - Earth inhabitants : (les) habitants de la Terre * inhabited (a) (fa) : habité(e) (anton. uninhabited : inhabité(e)) * inhaler (n) : inhalateur * inherent (a) : inhérent(e) * inherently (adv.) : de façon inhérente, par nature * inherit (v) (tr.) : hériter de (qch) * inheritor (n) : héritier/-ière * inhibit (v) (tr.) : 1/ inhiber ; 2/ entraver, réfréner (syn. to restrain) * in-house (ac) : interne - in-house printing : impression intégrée * inimical (a) : inimical(e), hostile - inimical inhabitants of other worlds : habitants hostiles d'autres mondes * initial (a) : initial(e), de départ, premier/-ière - initial draft : première ébauche, première version, première esquisse, texte initial, premier projet, avant-projet * initial (n) : initiale (f) - set of initials : groupe d’initiales, ensemble d’initiales, sigle * initialisation (brit.) / initialization (amér.) (n) : initialisation (f) * initialise (brit.) / initialize (amér.) (v) (tr.) : initialiser * initialism (n) : sigle formé d’initiales (prononcées séparément), initialisme (calque de l’anglais) (ex. the BBC) * initially (adv.) : au départ, au début, à l’origine * initiate (v) (tr.) (fa p) : 1/ initier (qn) ; 2/ instaurer, engager, lancer (qch) * initiative (n) : initiative (f) * inject (v) (tr.) : 1/ - to inject sb : faire une injection à qn, faire une piqûre à qn, piquer qn (fam.) , piqouser qn (fam. et péj.) ; 2/ - to inject sb with sth : injecter qch à qn * injectable (a) : injectable - injectable product : produit injectable * injected (ppa) : - the injected (adj. subst. pl.) : les vaccinés, les piqousés (fam.) (anton. the uninjected : les non vaccinés, les non piqousés) * injectee (n) : personne inoculée (f) * in-joke (n) : blague entre nous - in-jokes for the initiated : blagues pour initiés * injun (a) (ortho. phonétique de Indian) (péj.) : - injun territory : territoire indien * injure (v) (tr.) (fa) : 1/ blesser (physiquement) ; 2/ léser * injury (n) (pl. injuries) (fa) : 1/ blessure (f), lésion (f), trouble - occupational injury : accident de travail (syn. industrial accident) ; 2/ tort, préjudice, dégât, dommage - to add insult to injury… : et, comme si cela ne suffisait pas… * ink (n) : encre (f) - ink horn : (ancien) encrier de corne * inkblot (n) : tâche (d’encre) (f), pâté (d’encre) - inkblot test : test de Rorschach * inkblot (n) (tronc. de inkblot test ) : test de Rorschach * in keeping with (loc. prép.) : en accord avec, en rapport avec * inkjet (n) : jet d’encre - inkjet photo printer : imprimante photo à jet d'encre * inkling (n) : (petite) idée (f) * inlaid (a) : 1/ incrusté(e) ; 2/ marqueté(e) * inlet (n) : arrivée (f), orifice d’admission * in lieu of (loc. prép.) : au lieu et place de, en remplacement de * in-line (a) : (Indust.) intégré(e) à la chaîne - in-line measuring machine : machine à mesurer intégrée * in line with (loc. prép.) : en accord avec, conformément à * inmate (n) : pensionnaire (m/f) - prison inmate : détenu (n) (syn. convict) * innards (n pl.) : entrailles (f pl.) * inner (a) : intérieur(e), interne (anton. outer) - inner city (amér.) : centre-ville - inner parts : parties internes (f pl.) - inner peace : (la) paix intérieure - inner workings (pl.) : mécanisme interne (sing.) * inner-city (ac) : de centre ville * innkeeper (n) : aubergiste (m/f) * innocence (n) : innocence (f) * innocent (a) : innocent(e) * innocent (n) : innocent(e) * innocently (adv.) : 1/ en toute innocence ; 2/ innocemment * innocuous (a) : inoffensif/-ive * innocuousness (n) : caractère inoffensif * innovate (v) (intr.) : innover * innovation (n) : innovation (f) * innovational (a) : innovant(e) - innovational sector : secteur innovant * innovation-friendly (ac) : favorable à l’innovation, propice aux innovations * innovative (a) : innovateur/-trice, novateur/-trice * innovator (n) : innovateur/-trice (n), novateur/-trice (n) * innumeracy (n) : incapacité à compter (f) * innumerate (a) : ne sachant pas compter * inoperable (a) : ne fonctionnant plus - to be inoperable : être hors service, être inutilisable, ne plus fonctionner * in order that + may/might ou shall/should (loc. conj. de but) : afin que, pour que * in order to (loc. prép.) (+ inf.) : afin de + inf. * inordinate (a) : excessif/-ive * inordinately (adv.) : excessivement * in-person (ac) : en personne - in-person meeting : tête-à-tête - in-person ballot : vote en bureau de vote * in place of (loc. prép.) : à la place de, au lieu de, en remplacement de * in-plant (n) : en usine - in-plant first fit : premier ajustement en usine * in proportion of (loc. prép.) : en proportion de, proportionnellement à * input (v) (tr.) : (Inf.) introduire (des données en mémoire, etc.), saisir (des données) (anton. : to output) * inputs (n pl.) : flux entrants * inquest (n) : enquête (après un homicide) (f) * inquiry (n) (pl. inquiries) (var. ortho. enquiry) : 1/ demande (de renseignements) (f) ; 2/ enquête (f) - to hold an inquiry into sth : mener une enquête sur qch - murder inquiry : enquête criminelle - inquiries (pl.) : investigations (f pl.) - to help the police with their inquiries : être entendu(e) par la police * inquisitive (a) : curieux/-euse, plein(e) de curiosité * inquisitevely (adv.) : avec curiosité * in reference to (loc. prép.) : relativement à, en ce qui concerne, (dans le courrier) suite à * in regard to : cf with regard to * in relation to (loc. prép.) : en rapport avec, par rapport à, relativement à * in respect of (loc. prép.) : 1/ sous l'angle de, sous le rapport de ; 2/ en ce qui concerne, pour ce qui est de * in response to (loc. prép.) : 1/ en fonction de ; 2/ en réponse à, pour répondre à * in return for (loc. prép.) : en échange de, contre, en contrepartie de * insane (a) (fa) : fou/folle * insanely (adv.) : de façon insensée, extrêmement * inscribe (v) : 1/ (tr.) inscrire (une figure géométrique dans une autre) (in, dans) - To inscribe a square in a given circle (indication d'une manière de procéder) : Pour inscrire un carré dans un cercle donné ; 2/ (tr.) to inscribe sth with sth - He inscribed the book with his name : Il inscrivit son nom sur le livre - The stone is inscribed with a curse : Sur la pierre est gravée une malédiction, La pierre porte une malédiction * inscription (n) : 1/ inscription (f) (sur une pierre, etc.) ; 2/ dédicace (to, à) (f) * insecure (a) : 1/ mal assuré(e) ; 2/ risqué(e) ; 3/ mal serré(e) * insemination (n) : insémination (f) - artificial insemination : (l’)insémination artificielle * insensitive (a) : 1/ insensible, indifférent(e) ; 2/ imperturbable, impassible * insert (n) : (Usin.) plaquette (f) * insert (v) (tr.) : insérer, introduire * in-service (ac) : - in-service training : formation sur le lieu de travail * inset (v) (-set, -set) (tr.) : incruster * inset (prét. de to inset) * inset (pp de to inset) * inside (prép.) : à l’intérieur de * inside (adv.) : à l’intérieur * inside (a) : intérieur(e) - inside joke : plaisanterie à usage interne, blague d’initiés, blague entre nous, blague entre lui et moi / entre elle et moi (selon le cas) (syn. in-joke) - inside knowledge : informations de première main, informations confidentielles (f pl.) * inside or outside (prép. coordonnées) : à l'intérieur ou à l'extérieur de + subst. * insight (n) : 1/ perspicacité (f), pénétration (f) - business insight : sens des affaires ; 2/ aperçu, idée (f) - revealing insight : aperçu révélateur, aperçu édifiant - insights into sth : éclairages sur qch * insightful (a) : perspicace, pénétrant(e) * insignia (n) (pl. insignia ou insignias) : insigne (sing.), insignes (pl.) - to provide a sort of insignia for… : être comme le fleuron de… * insignificance (n) : insignifiance (f) - to make sth pale into insignficance : éclipser qch * insignificant (a) : 1/ insignifiant(e), négligeable ; 2/ sans importance, sans valeur * insincere (a) : peu sincère, insincère (litt.), hypocrite * insist (v) (intr.) : insister - if you insist : si tu insistes, si vous insistez * insolvency (n) : insolvabilité (f) * insolvent (a) : insolvable * inspect (v) (tr.) : inspecter * inspection (n) : inspection (f), examen - cursory inspection : examen hâtif * inspector (n) : inspecteur, inspectrice - His/Her Majesty's Inspector (abr. HMI) (G.-B.) : l'inspecteur/l'inspectrice en chef des prisons de Sa Majesté * in spite of (loc. prép.) : en dépit de, malgré * in spite of the fact that (loc. conj. de concession) bien que, quoique * install (n) : (Art) installation (f) - art install : installation artistique * install (v) (tr.) : installer, mettre en place (aussi to instal) * installation (n) : 1/ (l’action) installation (f), mise en place - installation guide : guide d’installation ; 2/ (l’objet) (Art abstrait) installation (f) - art installation : installation artistique * installed (ppa) : installé(e) - installed base : parc de machines * installer (n) : installateur, installatrice * installing (n) (le fait d’installer) installation (anton. uninstalling désinstallation) * installment (brit.) / instalment (amér.) (n) : 1/ acompte, versement partiel - installment plan : plan de paiements échelonnés ; 2/ épisode (d'un feuilleton), partie (f) * instance (n) (fa) : exemple - for instance : par exemple (syn. for example) * instant (a) : 1/ immédiat(e) - instant karma : punition immédiate, retour de bâton, retour de manivelle ; 2/ instantané(e), [café] en poudre, [café] soluble * instant (n) : instant * instead (adv.) : au lieu de cela, à la place, plutôt * instead of (loc. prép.) (+ subst. ou gér.) : au lieu de, à la place de, plutôt que - Assembly language uses easily remembered mnemonics instead of machine code : Le langage d'assemblage a recours à des formules mnémotechniques faciles à retenir à la place du langage machine * instigate (v) (tr.) : 1/ susciter, causer - to instigate unrest : susciter des troubles ; 2/ lancer, inaugurer * institute (n) : institut - collegiate institute : institut universitaire * institute (v) (tr.) : instituer, établir * institution (n) : institution (f) - financial institution : institution financière * institutionalise (brit.) / institutionalize (amér.) (v) (tr.) (fa p) : placer dans une institution * instruct (v) (intr.) : instruire, enseigner - [teacher] to instruct in many different disciplines : [instituteur] enseigner dans plusieurs disciplines * instruction (n) (fa) : 1/ instruction (f), enseignement - public instruction : (Fr) l'instruction publique (obs.) ; 2/ (svt au pl.) consigne (f), directive (f), indication (f) - to follow the instructions : suivre les consignes - to ignore (the) instructions : ne pas tenir compte des consignes - fitting instructions : indications de montage - operating instructions (pl.) : mode d’emploi - instruction manual : mode d’emploi * instructor (n) : instructeur/-trice, moniteur/-trice, éducateur/-trice - gym instructor : moniteur de gym * instrument (n) : 1/ instrument - cockpit instruments : instruments du poste de pilotage, instruments de bord ; 2/ (Mus.) instrument (de musique) - period instrument : instrument d’époque, instrument ancien * instrumental (a) : (Mus.) instrumental(e) - a piece of instrumental music : un morceau de musique instrumentale * insulate (v) (tr.) : 1/ isoler (du froid) ; 2/ insonoriser * insulated (ppa) : 1/ isolé(e) (du froid) ; 2/ insonorisé(e) * insulating (a) : isolant(e) * insulation (n) (fa) : isolation (f) (thermique, etc.) - thermal insulation : isolation thermique - insulation barrier : écran isolant - insulation material : matériau isolant * insult (n) (fa) : affront (to, à) - to add insult to injury… : et, comme si cela ne suffisait pas… * insult (v) (tr.) : faire un affront à (qn) * insuperable (a) : insurmontable * insurance (n) : assurance (f) - malpractice insurance : assurance responsabilité professionnelle * insurgency (n) : insurrection (f) * insurgent (n) : insurgé * insurrection (n) : insurrection (f) * insurrectionist (n) : insurgé(e), rebelle * intake (n) : entrée (f) - air intake : entrée d’air * integral (a) : 1/ intégral(e) - to become an integral part of sth : devenir partie intégrante de qch ; 2/ (Math.) premier/première - an integral number : un nombre premier * integration (n) : intégration (f), insertion (f) - integration of young people into the working world : insertion des jeunes dans le monde du travail * integrity (n) : intégrité (f) - territorial integrity : intégrité territoriale * intellect (n) : 1/ a/ intellect - [person] to have the intellect of a potato : avoir l’intellect d’un poisson rouge ; b/ intelligence (f) ; 3/ (en parlant d’une personne) grand esprit * intelligence (n) (fa p) : 1/ intelligence (f) - artificial intelligence : intelligence artificielle ; 2/ renseignement (dans les services secrets) - actionable intelligence : renseignement exploitable - intelligence agent : agent de renseignement - intelligence analyst : analyste du renseignement - intelligence network : réseau de renseignement - intelligence operation : opération de renseignement - in intelligence parlance : dans le vocabulaire du renseignement - intelligence sharing : échange en matière de renseignement, partage du renseignement ; 3/ (ind. sing.) renseignements confidentiels (pl.) * intelligent (a) : intelligent(e) * intelligently (adv.) : intelligemment, de façon intelligente, avec intelligence * intelligible (a) : intelligible (anton. unintelligible) * intend (v) : avoir l'intention de + inf. - to be intended to + inf. : être prévu pour + inf., avoir pour but de + inf. * intended (ppa) : 1/ prévu(e), voulu(e), désiré(e) - not to have the intended effect : ne pas avoir l’effet voulu ; 2/ délibéré(e) * intense (a) : intense - an intense scrutiny : un regard intense * intensely (adv.) : intensément * intensify (v) : 1/ (tr.) intensifier ; (intr.) s’intensifier ; 2/ (tr.) exacerber ; (intr.) s’exacerber * intensity (n) : intensité (f) * intensive (a) : intensif/-ive - intensive agriculture : agriculture intensive (f) - intensive care : soins intensifs (pl.), réanimation (f) * intentional (a) : intentionnel(le), délibéré(e) * intentionally (adv.) : intentionnellement, exprès * inter (v) (tr.) : enterrer * interred (pp) : enterré(e) * interact (v) (intr.) : interagir (with sb/sth, avec qn/qch) * interactive (a) : interactif/-ive * inter alia (m d l) (expression latine) : entre autres (syn. among other things) * inter-bank (a) : interbancaire - inter-bank interest rate : taux d’intérêt interbancaire * intercept (v) (tr.) : intercepter - to intercept an unknown craft : intercepter un engin inconnu * intercept (n) : (opération d’)interception * interceptor (n) : intercepteur - jet interceptor : (Av.) appareil d’interception - missile interceptor : intercepteur de missiles * intercession (n) : intercession (f) * interchange (tr.) : permuter (des fils électriques) - to interchange electric wires : permuter des fils électriques * interchangeable (a) : interchangeable * intercollegiate (a) : interuniversitaire, entre universités - intercollegiate football game : match de football interuniversitaire * intercom (n) : poste d’intercommunication, interphone * interconnect (v) : (tr.) interconnecter ; (intr.) s’interconnecter * interconnected (ppa) : interconnecté(e) - interconnected laboratories : labotaroires travaillant en réseau * interconnection (n) : interconnexion (f) * intercontinental (a) : intercontinental(e) - intercontinental travel : déplacements intercontinentaux * interdict (n) : interdit (n), interdiction (f) * interdict (v) (tr.) : interdire * interdisciplinary (a) : interdisciplinaire * interest (n) : 1/ curiosité (f) ; 2/ intérêt, centre d’intérêt - interests (pl.) (fa) : champs d’intérêt, centres d’intérêt - conflict of interests : conflit d’intérêts - activities and interests : activités extra-professionnelles (f pl.) ; 3/ (Fin.) intérêt - interest rate : taux d’intérêt ; 4/ intérêt personnel - interest group : groupe d’intérêt, groupe de pression * interest-free (ac) : (Fin.) sans intérêts * interesting (a) : intéressant(e) * interestingly (adv.) : de façon intéressante * Interestingly enough, … (a m p) (t d p) : Il est intéressant de constater / noter que … * interethnic (a) : interethnique - interethnic relations : rapports interethniques * interface (n) : (Inf.) interface (f) - user interface : interface d’utilisation - windowing interface : interface à fenêtres, interface multi-fenêtre * interface (v) (intr.) : s’interfacer (with sth, avec qch) * interfacing (n) : (Inf.) interfaçage * interfere (v) (intr.) : 1/ s'interposer ; 2/ - to interfere with : faire obstacle à - to interfere with a witness : faire pression sur un témoin * interference (n) (fa) : immixtion (f), intrusion (f) * intergalactic (a) : intergalactique - intergalactic adventures : aventures intergalactiques - intergalactic space : (l')espace intergalactique * interglacial (a) : interglaciaire - interglacial warm period : période de réchauffement interglaciaire * interindustry (a) : inter-industriel(le) - interindustry exchanges : échanges inter-industriels * interior (n) : intérieur (n) * interlace (v) (tr.) : (Électron.) entrelacer * interlanguage (n) : interlangue (f) - a learner’s interlanguage : l’interlangue d’un apprenant * interlayer (n) : couche intermédiaire (f) * interleave (-leaved, -leaved) (v) : (tr.) imbriquer, entrelacer ; (intr.) [tâches] s’imbriquer, s’entrelacer * interlink (v) : (tr.) relier (entre eux/elles), interconnecter ; (intr.) se relier entre eux/elles, s’interconnecter * interlock (n) : verrouillage réciproque, solidarisation (f) * interlock (v) : (tr.) interverrouiller, solidariser entre eux/elles ; (intr.) se verrouiller mutuellement, se solidariser * interlocutor (n) : interlocuteur, interlocutrice * interloper (n) : intrus(e) * interlude (n) : (amér.) entracte (f) (syn. amér. intermission - syn. brit. interval) * intermediate (a) : intermédiaire - intermediate level : niveau intermédiaire - intermediate missile : missile intermédiaire * interment (n) (arch.) : enterrement (syn. burial) * intermingle : (tr.) entremêler ; (intr.) s'entremêler * intermission (n) (amér.) : entracte (syn. interlude (amér.) - interval (brit.)) * in terms of (loc. prép.) : 1/ en + unité de mesure - Distances are expressed in terms of kilometers as well as miles : Les distances s'expriment en kilomètres ainsi qu'en miles ; 2/ relativement à, par rapport à, si l'on se réfère à, au regard de ; 3/ a/ pour ce qui est de, en ce qui concerne, concernant, en matière de, en fait de, au sujet de, quant à, sous l'angle de, sous le rapport de, sur le plan de, sur le plan de, au niveau de, du point de vue de - the fastest processor in terms of clock speed : le processeur le plus rapide en matière de vitesse d'horloge - The company failed to match its competitors in terms of productivity : La société fut impuissante à égaler ses concurrents sur le plan de la productivité ; b/ (selon le cas) en, par - Engine overhauls are very demanding in terms of tools and instruments : Les révisions de moteurs sont très gourmandes en outils et instruments - IndiGo is the largest airline in terms of passengers carried : IndiGo est en tête des compagnies aériennes par le nombre de voyageurs transportés * intern (n) (amér.) : stagiaire - hospital intern : interne (n) des hôpitaux * internal (a) : interne, intérieur - internal flaw : défaut interne, défaut à cœur * internally (adv) : intérieurement, à l’intérieur - Internally, … (a m p) (t d p) : Intérieurement, ..., À l'intérieur, … * international (a) : international(e) - international financier : bailleur de fonds international - international law : (le) droit international * internationally (adv.) : 1/ internationalement, sur le plan international, au niveau international, dans le monde entier ; 2/ à l’étranger (anton. domestically) * internationally acknowledged (ac) : reconnu(e) internationalement * internationally-branded (ac) ; sous enseigne internationale - internationally-branded hotel : hotel sous enseigne internationale * internationally oriented (ac) : à vocation internationale, international(e) - internationally oriented organisation : organisme à vocation internationale, organisme international * internationally published (ac) : (Presse) [publication] international(e) - internationally published journal : revue (savante ou universitaire) internationale (f) * internationally recognized (ac) : reconnu(e) dans le monde entier - internationally recognized set of computer communications protocols : (Inf.) ensemble de protocoles de communication entre ordinateurs reconnu par tous les pays * Internet (n pr.) : - the Internet : Internet (sans article défini, en France) ou l’Internet (avec article défini, au Canada) - the Internet of Things : l’Internet des objets (connectés) - Internet surfing : navigation sur l’Internet * Internet-centric (ac) : centré(e) (sur l’)Internet - Internet-centric terminal : terminal spécialement conçu pour la navigation sur l’Internet mobile (syn. Net-centric, avec majuscule à Net) * Internet-enabled (ac) : exploitant l’Internet, passant par l’Internet – Internet-enabled television : télévision passant par l’Internet * internetwork (n) : interréseau * internship (n) (amér.) : stage (syn. brit. placement) - to do / to take an internship in a company as part of one’s school or university course : suivre un stage en entreprise dans le cadre de son cursus scolaire ou universitaire - internship in computer programming : stage en programmation informatique - length of internship : durée de stage - official internship : stage conventionné - unpaid internship : stage non rémunéré - internship agreement : convention de stage - internship opportunities : occasions de stage - internship position : place de stagiaire * interoperate (v) (intr.) : interfonctionner (with, avec), interopérer (with, avec) * interplanetary (a) : interplanétaire - interplanetary space : (l')espace interplanétaire - interplanetary warfare : (les) guerres interplanétaires (pl.) * interplay (n) : interaction (f) * interpret (v) (tr.) : interpréter * interpretation (n) : (l’)interprétariat * interpreter (n) : interprète (m/f) * interpreting (n) : (l’)interprétariat * interrogate (v) (tr.) : questionner * interrupt (v) (tr.) : interrompre - to interrupt production : interrompre la production * interspersed (pp) : parsemé(e) (with quotations, de citations, with flowers, de fleurs, etc.) * interstate (a) : inter-États (inv.) * interstellar (a) : interstellaire - interstellar probe : sonde interstellaire * interurban (a) : interurbain(e) - interurban transport network : réseau de transport interurbain * interval (n) (brit.) (fa p) : entracte * intervene (v) (intr.) : 1/ intervenir ; 2/ s’interposer * intervention (n) : intervention (militaire) (f) - foreign intervention : intervention étrangère * interventionism (a) : interventionnisme * interventionist (a) : interventionniste * interventionist (n) : interventionniste (m/f) * interview (n) : interrogatoire, entrevue (f), entretien, interview (m ou f) - to call off an interview : annuler une interview - mock interview : simulation d’entretien, fausse interview - platitudinous interview : entretien d’une grande platitude - taped interview : entretien enregistré - interview room : salle d'interrogatoire * interview (v) (tr.) : interroger (qn), s’entretenir avec (qn) * interviewee (n) : personne interrogée * interviewer (n) : intervieweur - political interviewer : intervieweur de personnalités politiques * interview-worthy (ac) : [individu] digne d’une entrevue, digne d’un entretien * intertwine (v) : (tr.) entremêler, entrelacer, entrecroiser (with sth, à qch) ; (intr.) s’entremêler, s’entrelacer, s’entrecroiser * interwind (v) (-wound, wound) (tr.) : enrouler ensemble, entrelacer * in that (loc. conj. de cause) (après prop. princ.) : en ce sens que, en ce que, dans la mesure où, « : » * in that case (m d l) : en ce cas-là, dans ce cas-là * in the absence of (loc. prép.) : en l’absence de, à défaut de (syn. amér. absent, prép.) * in the event of (loc. prép.) : dans l'éventualité de, en cas de - in the event of a complete core meltdown in a PWR : en cas de fusion complète du cœur dans un REP * in the event that (loc. conj.) (t d p) : 1/ (éventualité présente) si ; 2/ (éventualité à venir, raison possible, crainte) au cas où, pour le cas où * in the face of (loc. prép.) : devant, face à * in the first place (loc. adv.) : en premier lieu * in the first place, … in the second place, … (m d l) : en premier lieu, … en second lieu, … * in the main (loc. adv.) : Pour l'essentiel * in theory (loc. adv.) en théorie * in the same way (m d l) : de même * in the sense that (loc. conj. de cause) : en ce sens que, dans la mesure où * in this case (m d l) : en ce cas, dans ce cas * intimate (a) : intime * intimate (v) (tr.) (fa) : 1/ laisser entendre, sous-entendre, insinuer, annoncer, faire savoir - to intimate that… : laisser entendre que… * intimately (adv.) : intimement * into (prép.) : 1/ (avec mouvement) dans - descent into madness : descente dans la folie - to send humans into space : envoyer des hommes dans l'espace ; 2/ (incorporation) dans, à - to marry into a family : s’allier (par le mariage) à une famille ; 3/ (transformation) en ; 4/ en plein dans - approximately 10 minutes into the documentary : 10 minutes environ après le début du documentaire * into and out of (prép. coordonnées) (avec mouvement) : en entrant et en quittant + subst. * intonation (n) : intonation (f) - question with a rising intonation : question à l’intonation montante * intoxicate (v) (tr.) (fa) : enivrer * intoxicated (a) (fa) : enivré(e) - to be intoxicated : être sous l'emprise de l'alcool, être en état d'ébriété, être ivre * intoxicating (a) : 1/ (prop. et fig.) enivrant(e), qui monte à la tête ; 2/ [boisson] très alcoolisé(e) - intoxicating liquor : boisson très alcoolisée * intoxication (n) (fa) : ivresse (f), griserie (f) * intractable (a) : réfractaire * intraday (a) : intrajournalier/-ière * intransitive (a) : (Gram.) intransitif/-ive - intransitive verb : verbe intransitif * intrasystem (a) : à l’intérieur d’un système * intra-uterine / intrauterine (a) : intra-utérin(e) - intra-uterine device : dispositif intra-utérin, stérilet * intriguer (n) : intrigant (n masc.), intrigante (n f) * intro (n) (tronc. de introduction introduction) : 1/ intro (f) - brief intro : courte intro - drop intro : intro à effet de retardement, intro à retardement ; 2/ (Presse) chapeau, chapô ; 3/ (Mus.) intro (f) * intro (a) (tronc. de introductory) : (Mus.) d’intro - the intro music : la musique d’intro * introduce (v) (tr.) (fa p) : 1/ présenter (un produit), sortir (un produit), employer (un produit) pour la première fois, instaurer (une mesure) – (Cin., dans un générique) introducing + nom de comédien : avec, pour la première fois à l’écran, + nom du comédien ; 2/ présenter (sb, qn) - to introduce oneself : se présenter - Allow me to introduce myself : Permettez-moi de me présenter ; 3/ exposer (une idée, une théorie) - to introduce a theory : exposer une théorie ; 4/ aborder (un sujet, un thème) - to introduce a topic : aborder un sujet * introducer (n) : dispositif d’introduction, introducteur ; 2/ (Méd.) intubateur * introduction (n) (fa p) : 1/ introduction (f) ; 2/ arrivée (f), avènement * introvert (a) : introverti(e) * introvert (n) : introverti(e) * introvert (v) (tr.) : introvertir - Introvert yourself more : Entrez davantage en vous-même * introverted (a) : introverti(e) * intrude (v) (intr.) : s’imposer (en importun) (on sb, à qn) * inundate (v) (tr.) : inonder (syn. to flood) * invade (v) (tr.) : envahir * invader (n) : envahisseur - invaders from Mars : envahisseurs venant de Mars * in vain (loc. adv.) : en vain * invalid (a) : malade * invaluable (a) : inestimable * invariably (adv.) : invariablement - Invariably, … (a m p) (t d p) : À tous les coups, … * invasion (n) : invasion (f) * invasive (a) : 1/ [personne] envahissant(e) ; 2/ [espèce] invasif/-ive - invasive species : espèce invasive (f) ; 3/ [méthode] invasif/-ive * inveigh (v) (intr.) : fulminer (against, contre), s’emporter (against, contre) * inveigle (v) : (tr.) enjôler, séduire, leurrer ; (intr.) - to inveigle sb into sth : entraîner qn par ruse ou par flatterie dans qch, amener qn par ruse ou par flatterie à qch * invent (v) (tr.) : inventer * invented (a) : inventé(e) - invented language : langage inventé * inventor (n) : inventeur, inventrice * inventory (n) (pl. inventories) (fa p) : 1/ (liste d’ojets) inventaire, catalogue - to draw up an inventory : dresser un inventaire ; 2/ (amér.) réserve(s) (f) (de matières premières, de produits en cours de fabrication ou ou de marchandises finies), stock(s) (de marchandises) - to reduce inventory : réduire les stocks - to liquidate one’s inventory of old models : liquider son stock de vieux modèles - low inventory : stocks bas - inventory reduction : réduction des stocks - inventory report : état des stocks - inventory tracking : suivi des stocks * inventory (v) (tr.) : inventorier (des articles, des marchandises) * inventory-intensive (ac) : [industrie, entreprise] exigeant beaucoup de stocks - inventory-intensive businesses : entreprises exigeant un haut niveau de stocks * inversion (n) : 1/ inversion (f) ; 2/ renversement * inverted (a) : 1/ inversé(e) - inverted comma (brit.) : guillemet inversé, guillemet anglais ; 2/ renversé(e) * inverter (n) : (Électron.) onduleur * invest (v) (intr.) : investir * investigate (v) (tr.) : enquêter sur, examiner - to investigate a UFO sighting : enquêter sur une observation d'ovni * investigation (n) : enquête (f), recherche (f) * investigative (a) : d’enquête - investigative journalism : journalisme d'enquête * investigator (n) : enquêteur, chercheur * investment (n) : investissement, placement - investment broker : courtier en placements - investment trust : société d'investissement * in view of (loc. prép.) : 1/ en fonction de ; 2/ étant donné, en raison de, compte tenu de - in view of the building’s architectural value : étant donné la qualité architecturale du bâtiment * in view of the fact that (loc. conj. de cause) : étant donné que, vu que * invigilate (v) : (Éduc.) (tr.) surveiller (un examen); (intr.) être de surveillance * invigilator (n) : (Éduc.) surveillant - exam invigilator : surveillant d'examen * invisibility (n) : invisibilité (f) - invisibility cloak : cape d’invisibilité * invisible (a) : invisible - the invisible Web : la Toile invisible * invitation (n) : invitation (f) - to take up an invitation : accepter une invitation * invite (n) (fam.) : invitation (f), invit’ (f) - Thank you for the invite : Merci de l’invitation - under official invite from the Syrian government : à l’invitation officielle du gouvernement syrien * invite (v) (tr.) : inviter * inviting (a) : engageant(e), accueillant(e) * involuntary (a) : involontaire - involuntary manslaughter : homicide involontaire * involve (v) (tr.) : impliquer - to be involved in a plot : être impliqué(e) dans un complot - to become involved : s’impliquer * involvement (n) : engagement, implication (f) * invulnerability (n) : invulnérabilité (f) * invulnerable (a) : invulnérable * inward-curving (ac) : s’incurvant vers l’intérieur, concave * inward-looking (ac) : renfermé(e) * inwardly (adv.) : intérieurement, en son for intérieur - Inwardly, … (a m p) (t d p) : Intérieurement ..., À l'intérieur, … * in which case (m d l) (après virgule) : auquel cas, et dans ce cas * iodine (n) : iode (f) - iodine pill : pilule d’iode * IOU (n) (abr. de I owe you : litt. « je vous dois ») : reconnaisance de dette * IP (n) (init. de information provider : fournisseur d’informations) * IPA (n) (init. de International Phonetic Alphabet) : alphabet phonétique international (API) - IPA pronunciation : prononciation selon l’API * ipso jure (loc. adv.) (Lat.) : de plein droit * Iran (n pr.) : (l’)Iran * Iranian (a) : iranien(ne) (sans maj.) * Iranian (n pr.) : Iranien (le ressortissant), Iranienne (la ressortissante) * Iraq (n pr.) : Irak (noter la diff. ortho.) * Iraqi (a) : irakien(ne) (sans maj.) * Iraqi (n pr.) : Irakien (le ressortissant) * irate (a) : furieux/-euse * ire (n) (lit.) : ire (f), courroux - to draw the ire of sb : s’attirer la colère de qn * Ireland (n pr.) : (l’)Irlande (f) - Northern Ireland : (l’)Irlande du Nord * Irish (a) : irlandais(e) (sans maj.) * Irishman (n pr.) : Irlandais (le ressortissant), Irlandaise (la ressortissante) * Irishwoman (n pr.) : Irlandaise (la ressortissante) * irk (v) (tr.) : ennuyer * irksome (a) : ennuyeux/-euse, rasoir (inv.) (fam.) * iron (n) : 1/ fer (le métal) - cast iron : fonte (f) - corrugated iron ; tôle ondulée - pig iron : fonte brute - scrap iron : ferraille (f) - sectional iron : fer profilé - iron ore : minerai de fer - iron hand pump : pompe manuelle en fer ; 2/ fer (à repasser, à souder) - soldering iron : fer à souder * iron (v) (tr.) : repasser (avec un fer) * iron-headed (ac) : à tête de fer, ferré(e) - iron-headed club : bâton à tête de fer, bâton ferré * ironing (n) : repassage (avec un fer) - ironing board : planche à repasser * ironmonger (n) : quincailler * ironmongery (n) : quincaillerie (f) (syn. ironware) * iron out (v) (tr.) : aplanir - to iron out problems : aplanir les difficultés * ironsmith (n) : chaudronnier * ironware (n ind. sing.) : quincaillerie (f) (syn. ironmongery) * ironworker (n) : ferronnier * ironworks (n) (faux pl.) : 1/ fonderie (f) ; 2/ ferronnerie (f) * irony (n) (pl. ironies) : ironie (f) - But (leaving) irony aside… : Mais trêve d’ironie… - By a grim irony : Ironie tragique, ... * irreconcilable (a) : inconciliable * irregular (a) : irrégulier/-ière - irregular verb : (Gram.) verbe irrégulier * irregularity (n) : irrégularité (f) * irregularly (adv.) : irrégulièrement * irrelevant (a) : qui ne s’applique pas, sans intérêt, hors-de-propos, hors sujet - irrelevant content : contenu hors sujet - irrelevant to sans rapport (avec), étranger/-ère (à) * irrespective of (loc. prép.) : sans tenir compte de, indépendamment de, quel / quels que soit / soient … - expansion slots running at 8 MHz irrespective of processor speed : logements d'extension configurés à 8 Mhz indépendamment de la vitesse du processeur * irresponsible (a) : irresponsable * irretrievable (a) : irrécupérable * irretrievably (adv.) : irrémédiablement * irritability (n) : irritabilité (f) * irritable (a) : irritable * irritate (v) (tr.) : irriter * irritating (a) : irritant(e) * ischaemia (brit.) / ischemia (amér.) (n) : ischémie (f) * island (n) : 1/ île (f) - fog-shrouded island : île enveloppée de brouillard ; 2/ - traffic island : (Voirie) refuge * island (subst. adj.) : insulaire * isolate (v) (tr.) 1/ isoler ; 2/ (Maint.) identifier (une panne) * isolated (ppa) : 1/ [lieu] isolé(e), à l’écart ; 2/ [cas, incident] isolé(e), unique, rare ; 3/ [individu] seul(e), isolé(e) * isolationism (n) : isolationnisme * isothermal (a) : isotherme - isothermal container : bac isotherme * ISP (n) (init. de Internet service provider fournisseur de services Internet) : FSI (ou encore FAI (fournisseur d'accès à l'Internet)) * Israel (n pr.) : Israël (sans article défini), (l’)État d’Israël * Israeli (a) : israélien(ne) (sans maj.) * ISS (n) (abr. de international space station : station spatiale internationale) * Israeli (n pr.) : Israélien (le ressortissant) * issue (n) (fa) : 1/ sujet, question (f) (dont débattre), problème (à traiter), point (à aborder, débattu) - at the heart of the issue : au cœur du problème - the issue is whether… : le problème est de savoir si… - to address an issue : traiter d'une question - to take issue with sth : exprimer des réserves quant à qch, s’inscrire en faux contre qch, s’insurger contre qch, contester qch - the global warming issue : la question du réchauffement planétaire - comment-worthy issue : question qui mérite qu’on s’y arrête, question qui mérite d’être notée - crucial issue : question cruciale - hot issue : sujet brûlant - key issue : problème crucial - perennial issue : éternelle question, marronnier (fig.) - pressing issue : problème urgent - thorny issue : problème épineux - [flight] to experience an engine issue : [vol] rencontrer un problème avec les réacteurs - vital issue : question vitale ; 2/ problème, ennui, souci - [car, plane, etc.] to have tech issues : [voiture, avion, etc.] avoir des ennuis techniques - The helicopter that crashed had tech issues : L’hélicoptère qui s’est écrasé avait des ennuis techniques ¬- to run into tech issues : rencontrer des problèmes techniques ; 3/ livraison (f), parution (f), sortie (f) (d’un périodique) ; 4/ numéro (d'un magazine par exemple) - back issue : numéro ancien - current issue : dernier numéro (en date) ; 5/ émission (f) (d’actions) - a new issue of shares : une nouvelle émission d'actions * issue (v) (tr.) : fournir, pourvoir, émettre (un chèque, des actions), publier (un rapport) - to issue a directive : publier une consigne - to issue a white paper : publier un livre blanc * it (pro. pers.) : 1/ (sujet) il, elle ; 2/ (objet) le, la ; (après proposition) lui ; 3/ ça ; 4/ (expressions) He is past it : Il est dépassé, Il n’est plus dans le coup - He has had it : Il est fini, il a eu son moment de succès - That’s all there is to it : C’est tout ce qu’il y a, C’est la seule raison, Il n’y a pas d’autre raison, Il n’y a rien d’autre * Italian (a) : italien(ne) (sans maj.) * Italian (n pr.) : Italien (le ressortissant) * Italian (n) : italien (la langue) * Italy (n pr.) : (l’)Italie * item (n) : élément, article, objet, pièce - item of equipment : équipement, engin - item of news : nouvelle (f), information (var. news item) - an item of memorabilia : un objet rappelant le passé - consumer electronics item : article d’électronique grand public - data item : donnée (f) - duty-free items : articles détaxés - fabricated item : pièce manufacturée (f) - filler item : (Presse) article bouche-trou, petit article pour combler - an information item : un élément d’information, une information - structural item : pièce de structure * itemise (brit.) / itemize (amér.) (v) (tr.) : détailler * IUD (init. de intra-uterine device : dispositif intra-utérin) DIU (stérilet) * Ivorian (a) : ivoirien(ne) (sans maj.) * Ivorian (n pr.) : Ivoirien (le ressortissant) * Ivory Coast (n pr.) : (la) Côte d’Ivoire * IYA (jarg. Web) (init. de in your ass, dans ton cul) DTC * IYDA (jarg. Web) (init. de in your deep ass, bien profond) DTC s6476zck9w2rqllhlkk58u50tanm3mv Fonctionnement d'un ordinateur/Les bascules : des mémoires de 1 bit 0 78071 768010 765343 2026-06-18T14:31:21Z Mewtow 31375 /* Les bascules JK conçues à partir de bascules RS */ 768010 wikitext text/x-wiki La totalité de l'électronique grand public est basée sur des circuits combinatoires auxquels on ajoute des mémoires. Pour le moment, on sait créer des circuits combinatoires, mais on ne sait pas faire des mémoires. Pourtant, on a déjà tout ce qu'il faut. Il est en effet parfaitement possible de créer des mémoires avec des portes logiques. Toutes les mémoires sont conçues à partir de circuits capables de mémoriser un bit, qui sont appelés des '''bascules''', ou ''latches''. Nous alloons voir ces bascules dans ce chapitre, nous verrons comment les combiner pour former une mémoire ou des compteurs dans le chapitre suivant. ==L'interface d'une bascule== Avant de voir comment sont fabriquées les bascules, nous allons voir quelle est leur '''interface''', à savoir quelles sont leurs entrées et leurs sorties. La raison à cela est que des bascules avec la même interface peuvent être construites avec des circuits totalement différents. Si on ne regarde que les entrées-sorties, on peut grosso-modo classer les bascules en quelques grands types principaux : les bascules RS, les bascules JK et les bascules D. Avant toute chose, faisons quelques précisions. Sur les schéma qui vont suivre, les entrées sont à gauche, les sorties sont à droite. Beaucoup de bascules disposent de deux sorties, nommées Q et <math>\overline{Q}</math>, même si ce n'est pas systématique. La sortie Q fournit le bit mémorisé dans la bascule. C'est sur cette sortie qu'on peut lire le bit mémorisé, le récupérer. La sortie <math>\overline{Q}</math> fournit quant à elle l'inverse de ce bit mémorisé. Par inverse, on veut dire qu'elle fournit un 0 si le bit mémorisé est à 1, un 1 s'il vaut 0. Il est possible de créer des bascules sans sortie <math>\overline{Q}</math>, mais nous verrons des exemples avec cette sortie. ===Les bascules D=== [[File:Transparent Latch Symbol.svg|vignette|upright=0.5|Interface d'une bascule D.]] Les bascules les plus simples sont les '''bascules D'''. Elles ont deux entrées appelées D et E : D pour ''Data'', E pour ''Enable''. Le bit à mémoriser est envoyé directement sur l'entrée D. L'entrée Enable permet d'autoriser ou d'interdire les écritures dans la bascule. Il faut que l'entrée Enable passe à 1 pour que l'entrée soit recopiée dans la bascule et mémorisée. Tant que l'entrée Enable reste à 0, le bit mémorisé par la bascule reste le même, le circuit est insensible à l'entrée D. ===Les bascules RS=== [[File:SR Latch Symbol.svg|vignette|upright=0.5|Interface d'une bascule RS.]] En second lieu, on trouve les '''bascules RS''', qui possèdent deux entrées. Les deux entrées permettent de placer un 1 ou un 0 dans la bascule. L'entrée R permet de mettre un 1, l'entrée S permet d'y injecter un 0. Pour vous en rappeler, sachez que les entrées de la bascule ne sont nommées ainsi par hasard : R signifie Reset (qui signifie mise à zéro en anglais) et S signifie Set (qui veut dire mise à un en anglais). Le principe de ces bascules est assez simple : * si on met un 1 sur l'entrée R et un 0 sur l'entrée S, la bascule mémorise un zéro ; * si on met un 0 sur l'entrée R et un 1 sur l'entrée S, la bascule mémorise un un ; * si on met un zéro sur les deux entrées, la sortie Q sera égale à la valeur mémorisée juste avant. * Si on met un 1 sur les deux entrées, le comportement dépend du sous-type de bascule RS. {|class="wikitable" |- !Entrée Reset!!Entrée Set!!Sortie Q |- ||0||0||Bit mémorisé par la bascule |- ||0||1||1 |- ||1||0||0 |- ||1||1||Dépend de la bascule |} Le comportement obtenu quand on met deux 1 en entrée dépend de la bascule. Il faut dire que cette combinaison demande de mettre le circuit à la fois à 0 (entrée R) et à 1 (entrée S). Sur certaines bascules, appelées '''bascules à entrées non-dominantes''', la combinaison est interdite : elle fait dysfonctionner le circuit et le résultat est imprédictible. Mais sur d'autres bascules dites '''à entrée R ou S dominante''', une entrée sera prioritaire sur l'autre. Sur les bascules à entrée R dominante, l'entrée R surpasse l'entrée S : la bascule est mise à 0 quand les deux entrées sont à 1. À l'inverse, sur les bascules à entrée S dominante, l'entrée S surpasse l'entrée R : la bascule est mise à 1 quand les deux entrées sont à 1. ===Les bascules RS inversées=== [[File:Inverted SR Flip-flop.svg|vignette|upright=0.5|Bascule RS inversée.]] Il existe aussi des '''bascules RS inversées''', où les entrées doivent être mises à 0 pour faire ce qu'on leur demande. Ces bascules fonctionnent différemment de la bascule précédente : * si on met un 1 sur l'entrée R et un 0 sur l'entrée S, la bascule mémorise un 1 ; * si on met un 0 sur l'entrée R et un 1 sur l'entrée S, la bascule mémorise un 0 ; * si on met un 1 sur les deux entrées, la sortie Q sera égale à la valeur mémorisée juste avant ; * si on met un 0 sur les deux entrées, le résultat est indéterminé. {|class="wikitable" |- !Entrée /R!!Entrée /S!!Sortie Q |- ||0||0||Dépend de la bascule |- ||0||1||0 |- ||1||0||1 |- ||1||1||Bit mémorisé par la bascule |} Là encore, quand les deux entrées sont à 0, on fait face à trois possibilités, comme sur les bascules RS normales : soit le résultat est indéterminé, soit l'entrée R prédomine, soit l'entrée S prédomine. ===Les bascules JK=== [[File:JK latch.svg|vignette|upright=0.5|Bascule JK.]] Les '''bascules JK''' peuvent être vues comme des bascules RS améliorées. La seule différence est ce qui se passe quand on envoie un 1 sur les entrées R et S. Sur une bascule RS, le résultat dépend de la bascule, il est indéterminé. Sur les bascules JK, le contenu de la bascule est inversée. {|class="wikitable" |- !Entrée J!!Entrée K!!Sortie Q |- ||0||0||Bit mémorisé par la bascule |- ||0||1||1 |- ||1||0||0 |- ||1||1||Inversion du bit mémorisé |} ===Les bascules JK, RS et RS inversées à entrée ''Enable''=== [[File:Gated SR flip-flop Symbol.svg|vignette|upright=0.5|Bascule RS à entrée Enable.]] Il est possible de modifier les bascules JK, RS et RS inversées, pour faire permettre d' « activer » ou d' « éteindre » les entrées R et S à volonté. En faisant cela, les entrées R et S ne fonctionnent que si l'on autorise la bascule à prendre en compte ses entrées. Pour cela, il suffit de rajouter une entrée E à notre circuit. Suivant la valeur de cette entrée, l'écriture dans la bascule sera autorisée ou interdite. Si l'entrée E vaut zéro, alors tout ce qui se passe sur les entrées RS ou JK ne fera rien : la bascule conservera le bit mémorisé, sans le changer. Par contre, si l'entrée E vaut 1, alors les entrées RS ou JK feront ce qu'il faut et la bascule fonctionnera comme une bascule RS/JK normale. ===La porte C, une bascule spéciale=== [[File:Porte-C.svg|vignette|upright=0.5|Porte-C]] Enfin, nous allons voir la '''porte C''', une bascule particulière qui sera utilisée quand nous verrons les circuits et les bus asynchrones. Elle a deux entrées A et B, comme les bascules RS et les bascules D, mais seulement une sortie. Quand les deux entrées sont identiques, la sortie de la bascule correspond à la valeur des entrées (cette valeur est mémorisée). Quand les deux entrées différent, la sortie correspond au bit mémorisé. {| class="wikitable" ! Entrée A ! Entrée B ! Sortie |- | 0 || 0 || 0 |- | 0 || 1 || Bit mémorisé par la bascule |- | 1 || 0 || Bit mémorisé par la bascule |- | 1 || 1 || 1 |} ==L'implémentation des bascules avec des portes logiques== Le principe qui se cache derrière toutes ces bascules est le même. Elles sont organisées autour d'un circuit dont on boucle la sortie sur son entrée. Cela veut dire que sa sortie est connectée à une de ses entrées, les autres entrées étant utilisées pour commander la bascule. Nous allons distinguer l'entrée bouclée et la ou les entrées de commande. [[File:Bascule - fonctionnement interne.png|centre|vignette|upright=1.5|Bascule - fonctionnement interne.]] Le circuit doit avoir une particularité bien précise : si l'entrée de commande est à la bonne valeur (0 sur certaines bascules, 1 sur d'autres), l'entrée bouclée est recopiée sur la sortie à l'identique. On dit que le circuit a des entrées potentiellement idempotentes. Ainsi, tant que l'entrée de commande est à la bonne valeur, la bascule sera dans un état stable où la sortie et l'entrée de commande restons à la valeur mémorisée. Le circuit en question peut être une porte logique centrale, qui peut être une porte ET, OU, XOR, NAND, NOR, NXOR, ou un multiplexeur. [[File:Bascule - boucle de rétroaction.png|centre|vignette|upright=2|Bascule - boucle de rétroaction]] Toujours est-il qu'un circuit séquentiel contient toujours au moins une entrée reliée sur une sortie, contrairement aux circuits combinatoires, qui ne contiennent jamais la moindre boucle ! : Dans ce qui suit, nous allons omettre volontairement la sortie <math>\overline{Q}</math>, sauf pour les bascules RS. ===La bascule D fabriquée avec un multiplexeur=== Le cas le plus simple de circuit bouclé est la '''bascule D conçue à partir d'un multiplexeur'''. L'idée est très simple. Quand l'entrée Enable est à 0, la sortie du circuit est bouclée sur l'entrée : le bit mémorisé, qui était présent sur la sortie, est alors renvoyé en entrée, formant une boucle. Cette boucle reproduit en permanence le bit mémorisé. Par contre, quand l'entrée Enable vaut 1, la sortie du multiplexeur est reliée à l'entrée D. Ainsi, ce bit est alors renvoyé sur l'autre entrée : les deux entrées du multiplexeur valent le bit envoyé en entrée, mémorisant le bit dans la bascule. [[File:Multiplexer-based latch (positive).svg|class=transparent|centre|Bascule D créée avec un multiplexeur.]] Certaines bascules D ont une entrée R, qui met à zéro le bit mémorisé dans la bascule quand l'entrée R est à 1. Pour cela, elles ajoutent un circuit de mise à zéro, que nous avons déjà vu dans le chapitre sur les opérations bit à bit. Ce circuit de mise à zéro est placé dans la boucle, entre la sortie du multiplexeur et son entrée. ===La bascule RS fabriquée avec une porte OU et une porte ET=== Voyons maintenant comment implémenter une bascule RS. Son implémentation la plus simple est la '''bascule RS de type ET-OU''', composée de trois portes logiques : une porte ET, une porte OU, et éventuellement une porte NON. Un exemple de porte RS de ce type est le suivant, d'autres manières de connecter le tout qui donnent le même résultat. [[File:Flipflop (UND, ODER, NICHT).svg|centre|vignette|Bascule RS de type ET-OU.]] Son fonctionnement est simple à expliquer. La porte ET a deux entrées, dont une est bouclée et l'autre est une entrée de commande. Idem pour la porte OU. Les deux portes recopient leur entrée en sortie si on place ce qu'il faut sur l'entrée de commande. Par contre, toute autre valeur modifie le bit inséré dans la bascule. * Si on place un 0 sur l'entrée de commande de la porte OU, elle recopie l'entrée bouclée sur sa sortie. Par contre, y mettre un 1 donnera un 1 en sortie, peu importe le contenu de l'entrée bouclée. En clair, l'entrée de commande de la porte OU sert d'entrée S à la bascule. * La porte ET recopie l'entrée bouclée, mais seulement si on place un 1 sur l'entrée de commande. Si on place un 0, elle aura une sortie égale à 0, peu importe l'entrée bouclée. En clair, l'entrée de commande de la porte ET est l'inverse de ce qu'on attend de l'entrée R à la bascule RS. Pour obtenir une véritable entrée R, il est possible d'ajouter une porte NON sur l'entrée /R, sur l'entrée de la porte ET. En faisant cela, on obtient une vraie bascule RS. Si on essaye de concevoir le circuit, on se retrouve alors face à un choix : est-ce que la sortie Q est la sortie de la porte OU, ou la sortie de la porte ET ? La seule différence sera ce qu'il se passe quand on active les deux entrées à la fois. Si on prend la sortie de la porte ET, l'entrée ''Reset'' sera prioritaire sur l'entrée ''Set'' quand elles sont toutes les deux à 1. Et inversement, si on prend la sortie de la porte OU, ce sera le signal ''Set'' qui sera prioritaire. Voici ci-dessous les tables de vérité correspondantes pour chaque circuit. {|class="wikitable" |+ Circuit avec la porte ET avant la porte OU |- ! Entrée Reset !! Entrée Set !! Sortie Q !! Circuit |- || 0 || 0 || Bit mémorisé par la bascule || rowspan="3" | [[File:Flipflop SR8 - 002.svg|class=transparent|Porte OU avant la porte ET.]] |- || 1 || 0 || 0 |- || X (0 ou 1) || 1 || 1 |} {|class="wikitable" |+ Circuit avec la porte OU avant la porte ET |- ! Entrée Reset !! Entrée Set !! Sortie Q !! Circuit |- || 0 || 0 || Bit mémorisé par la bascule || rowspan="3" | [[File:Flipflop SR8 - 003.svg|class=transparent|Porte OU avant la porte ET.]] |- || 0 || 1 || 0 |- || 1 || X (0 ou 1) || 1 |} ===Les bascules RS à NOR et à NAND=== Le circuit précédent a bien une sortie Q, mais pas de sortie /Q. Pour la rajouter, il suffit simplement d'ajouter une porte NON sur la sortie Q. Mais faire ainsi ne permet pas de profiter de certaines simplifications bien appréciables. Pour cela, au lieu d'ajouter une porte NON, nous allons ajouter deux portes, en amont de la porte OU. En faisant, le circuit devient celui-ci : [[File:Bascule RS à NOR - conception à partir d'une bascule ET-OU - 1.png|centre|vignette|upright=3|Bascule RS à NOR - conception à partir d'une bascule ET-OU - 1]] On peut alors regrouper des portes logiques consécutives et simplifier le tout, comme indiqué dans le schéma suivant. Le circuit devient donc : [[File:Bascule RS à NOR - conception à partir d'une bascule ET-OU - 2.png|centre|vignette|upright=3|Bascule RS à NOR - conception à partir d'une bascule ET-OU - 2]] Le résultat est ce qu'on appelle une '''bascule RS à NOR''', qui tire son nom du fait qu'elle est fabriquée exclusivement avec des portes logiques NOR. En réorganisant le circuit, on trouve ceci : [[File:RS Flip-flop (NOR).svg|centre|vignette|upright=1|Circuit d'une bascule RS à NOR.]] Dans l'exemple précédent, nous avions pris la sortie Q en sortie de la porte ET, mais il est possible de faire pareil avec une bascule RS inversée de type ET/OU. Le résultat est une '''bascule RS à NAND''', qui est une bascule RS inversée à deux sorties (Q et /Q), composée intégralement de portes NAND. [[File:SR Flip-flop Diagram.svg|centre|vignette|upright=1|Circuit d'une bascule RS à NAND.]] ==Les bascules peuvent se fabriquer à partir d'autres bascules== Il y a quelques chapitres, nous avons vu qu'il est possible de créer une porte logique en combinant d'autres portes logiques entre elles. Et bien sachez qu'il est possible de faire la même chose pour des bascules. On peut par exemple fabriquer une bascule RS à partir d'une bascule D, et réciproquement. Les possibilités sont nombreuses. Et pour cela, il suffit juste d'ajouter un circuit combinatoire qui traduit les entrées de la bascule voulue vers les entrées de la bascule utilisée. Dans ce qui suit, nous allons surtout voir comment fabriquer des bascules communes à partir de bascules RS. ===Le passage d'une bascule RS à une bascule RS inversée (et inversement)=== Il est possible de créér une bascule RS normale à partir d'une bascule RS inversée en inversant simplement les entrées R et S avec une porte NON. Et inversement, le passage d'une bascule RS normale à une bascule RS inversée se fait de la même manière. Il s'agit d'une méthode simple, qui a la particularité de garder le caractère dominant/non-dominant des entrées. [[File:Flipflop RS.svg|centre|vignette|upright=1.5|Bascule RS conçue avec une bascule RS inversée.]] Il est possible de partir d'une bascule RS inversée/normale non-dominante et d'en faire une bascule RS normale/inversée à entrée R ou S dominante. Pour cela, au lieu d'ajouter deux portes NON en entrée du circuit, on ajoute un petit circuit spécialement conçu. Ce circuit de conversion traduit les signaux d’entrée R et S en signaux /R et /S, (ou inversement). Prenons l'exemple d'une bascule RS normale à entrée R prioritaire, fabriquée à partir d'une bascule RS à NAND (inversée à entrée non-dominantes). La table de vérité du circuit de conversion des entrées est la suivante. Rappelez-vous que l'on veut que l'entrée R soit prioritaire. Ce qui veut dire que si R est à 1, alors on garantit que le signal /R est actif et que /S est inactif. On a donc : {|class="wikitable" |- ! R !! S !! !! <math>\overline{R}</math> !! <math>\overline{S}</math> |- | 0 || 0 || || 1 || 1 |- | 0 || 1 || || 1 || 0 |- | 1 || 0 || || 0 || 1 |- | 1 || 1 || || 0 || 1 |} L'entrée <math>\overline{R}</math> n'est autre que l'inverse de l'entrée R, ce qui fait qu'une simple porte NON suffit. L'entrée <math>\overline{S}</math> a pour équation logique : <math>\overline{S} = \overline{ \overline{R} . S }</math> Le tout donne le circuit suivant : [[File:FF NAND-RS R-dominant.svg|centre|vignette|upright=1.5|FF NAND-RS R-dominant]] ===L'implémentation des bascules RS avec une entrée Enable=== Passons maintenant aux bascules RS à entrée Enable. Vous l'avez peut-être senti venir : il est possible de modifier les bascules sans entrée Enable, pour leur en ajouter une. Notamment, il est possible de modifier une bascules RS normale pour lui ajouter une entrée Enable. Pour cela, il suffit d'ajouter un circuit avant les entrées R et S, qui inactivera celles-ci si l'entrée E vaut zéro. La table de vérité de ce circuit est identique à celle d'une simple porte ET. {| |[[File:SR (Clocked) Flip-flop Diagram.svg|centre|vignette|upright=1.5|Circuit d'une bascule RS NOR à entrée Enable.]] |[[File:NAND Gated SR Latch.png|centre|vignette|upright=1.5|Circuit d'une bascule RS NAND à entrée Enable.]] |} ===Les bascules D conçues à partir de bascules RS à entrée Enable=== Passons maintenant aux bascules D construites à partir d'une bascule RS à entrée Enable. L'entrée Enable de la bascule D et de la bascule RS sont la même, elles ont exactement le même comportement et la même utilité. Il suffit de prendre une bascule RS à entrée Enable et d'ajouter un circuit qui convertit l'entrée D en Entrées R et S. [[File:Bascule D fabriquée avec une bascule RS.png|centre|vignette|upright=2|Bascule D fabriquée avec une bascule RS, à NOR.]] Pour une bascule RS normale, on peut remarquer que l'entrée R est toujours égale à l'inverse de D, alors que S est toujours strictement égale à D. Il suffit d'ajouter une porte NON avant l'entrée R d'une bascule RS à entrée Enable, pour obtenir une bascule D. [[File:D-type Transparent Latch (NOR).svg|centre|vignette|upright=1.5|Bascule D à NAND.]] Il est possible d'améliorer légèrement le circuit précédent, afin de retirer la porte NON, en changeant le câblage du circuit. En effet, la porte NON inverse l'entrée D tout le temps, quelle que soit la valeur de l'entrée Enable. Mais on n'en a besoin que lorsque l'entrée Enable est à 1. On peut donc remplacer la porte NON par une porte qui sort un 0 quand l'entrée D et l'entrée Enable sont à 1, mais qui sort un 1 sinon. Il s'agit ni plus ni moins qu'une porte NAND, et le circuit précédent la contient déjà : c'est celle en haut à gauche. On peut donc prendre sa sortie pour l'envoyer au bon endroit, ce qui donne le circuit suivant : [[File:D-Type Transparent Latch.svg|centre|vignette|upright=1.5|Bascule D à NAND.]] Il est possible de fabriquer une bascule D avec une bascule RS à ET/OU. Le circuit obtenu est alors identique au circuit obtenu avec un multiplexeur basé sur des portes logiques. ===Les bascules JK conçues à partir de bascules RS=== Il est possible de construire une bascule JK à partir d'une bascule RS. Ce qui n'est pas étonnant, vu que les bascules RS et JK sont très ressemblantes. Il suffit d'ajouter un circuit qui déduise quoi mettre sur les entrées R et S suivant la valeur sur les entrées J et K. Le circuit en question est composé de deux portes ET, une par entrée. [[File:JK latch circuit.svg|centre|vignette|upright=1.5|Bascule JK obtenue à partir d'une bascule RS.]] Il est possible de faire la même chose avec une bascule RS à entrée Enable, qui donne une bascule JK à entrée Enable. [[File:FlipflopJKlogic.png|centre|vignette|upright=1.5|Bascule JK obtenue à partir d'une bascule RS à entrée Enable.]] <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits incrémenteurs/décrémenteurs | prevText=Les circuits incrémenteurs/décrémenteurs | next=Les circuits synchrones et asynchrones | nextText=Les circuits synchrones et asynchrones }} </noinclude> 9elx16d296rj60cntzpdln4mi7leq95 Fonctionnement d'un ordinateur/Les compteurs et timers 0 78073 767987 767964 2026-06-18T13:40:00Z Mewtow 31375 /* Les compteurs asynchrones */ 767987 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. ==Les compteurs/décompteurs : généralités== Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ===L'interface d'un compteur/décompteur=== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, et nous verrons un usage de ce genre de compteur dans le chapitre suivant. Mais la majorité des compteurs n'incrémente le décompte que sur demande. Pour cela, ils disposent d'une entrée ''Enable'', similaire à celle des registres. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, mais pas si elle est à 0. L'entrée ''Enable'' est séparée de l'entrée d'horloge, le compteur/décompteur est incrémenté seulement si il y a un front sur le signal d'horloge et une entrée Enable à 1. Sur les compteurs/décompteurs, il y a une entrée qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. Les compteurs ont aussi une entrée ''Reset'' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées ''Preload Data'' et ''Preload Enable''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] ===Le circuit d'un compteur : généralités=== Un compteur/décompteur est registre amélioré pour le rendre capable de compter/décompter. Les '''compteurs/décompteurs synchrones''' combinent un registre pour mémoriser le nombre, avec des circuits combinatoires pour calculer la prochaine valeur du compteur. Ce circuit combinatoire est le plus souvent, mais pas toujours, un circuit capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fié une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Il existe des compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. Les compteurs ''modulo'' ont une valeur maximale qui est plus faible que la valeur maximale du registre. Ils sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Dans la suite du chapitre, nous allons créer des compteurs qui incrémentent leur décompte à chaque cycle d'horloge, ou du moins quand leur ''Enable'' le permet. A ce propos, dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs asynchrones== les '''compteurs asynchrones''' utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, un débordement se traduit par un front descendant sur la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le circuit combinatoire incrémente le registre quand on lui ordonne, avec le signal de commande adapté. [[File:Basic Sync Counter.svg|centre|vignette|upright=1.5|Compteur synchrone, cas général.]] ===Les compteurs synchrones à propagation de retenue=== Et pour comprendre comment créer le circuit incrémenteur, reprenons la séquence d'un compteur : * 000 * 001 * 010 * 011 * 100 * 101 * 110 * 111 Il faut remarquer que lors d'une incrémentation, un bit s'inverse quand tous les bits des colonnes précédentes valent 1. Déterminer si les bits des colonnes précédentes sont à 1 demande de faire un simple ET entre les bits en question. Pour implanter cela en circuit, on a besoin de deux choses. En premier lui, on a besoin d'inverseurs commandables, un pour chaque bit de l'opérande. L'inverseur commandable est, pour rappel, une simple XOR. Ensuite, il faut une chaine de portes ET qui détermine si tous les bits précédents valent un. Il y a une porte ET par bit de l'opérande, qui fait un ET entre le bit d'opérande et le résultat des colonnes précédentes. [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=3|Compteur synchrone avec des bascules D.]] ===Les compteurs en cascade=== Il est possible de concevoir des compteurs à partir de compteurs plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs de 4 bits peuvent même être des compteurs asynchrones, ce qui donne un compteur hybride entre synchrone et asynchrone. Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant une entrée en plus, indiquant que le compteur a atteint sa valeur maximale, appelée sortie ''Ripple carry out'' (RCO). La sortie en question est calculée avec une porte ET entre tous les bits du compteur pour un compteur synchrone. Si tous les bits du compteurs sont à 1, cela signifie que le compteur suivant doit être incrémenté au prochain cycle d'horloge. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Pour simplifier les explications, nous allons les classer suivant le type de registre à décalage utilisé. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | (registre simple) || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. À l'exception de certains compteurs ''one-hot'' qui seront vu juste après, ces compteurs sont des '''compteurs à rétroaction'''. Un terme bien barbare pour dire que l'on boucle leur sortie sur leur entrée, parfois en insérant un circuit combinatoire entre les deux. Ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. En conséquence, on peut les réinitialiser, mais pas insérer une valeur dans le compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Un exemple d'utilisation est celui de l'Intel 8008, le tout premier microprocesseur 8 bits commercialisé, où ce genre de compteurs étaient utilisés pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs en anneau et de Johnson (SISO)=== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ====Les compteurs en anneau : les compteurs ''one-hot''==== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ====Les compteurs de Johnson : les compteurs unaires==== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction de type SIPO/PISO=== D'autres compteurs sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur à rétroaction=== Un compteur à rétroaction est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> 660fszu6ersiji07xqwsrrxn69lbi97 767988 767987 2026-06-18T13:40:22Z Mewtow 31375 767988 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. ==Les compteurs/décompteurs : généralités== Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ===L'interface d'un compteur/décompteur=== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, et nous verrons un usage de ce genre de compteur dans le chapitre suivant. Mais la majorité des compteurs n'incrémente le décompte que sur demande. Pour cela, ils disposent d'une entrée ''Enable'', similaire à celle des registres. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, mais pas si elle est à 0. L'entrée ''Enable'' est séparée de l'entrée d'horloge, le compteur/décompteur est incrémenté seulement si il y a un front sur le signal d'horloge et une entrée Enable à 1. Sur les compteurs/décompteurs, il y a une entrée qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. Les compteurs ont aussi une entrée ''Reset'' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées ''Preload Data'' et ''Preload Enable''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] ===Le circuit d'un compteur : généralités=== Un compteur/décompteur est registre amélioré pour le rendre capable de compter/décompter. Les '''compteurs/décompteurs synchrones''' combinent un registre pour mémoriser le nombre, avec des circuits combinatoires pour calculer la prochaine valeur du compteur. Ce circuit combinatoire est le plus souvent, mais pas toujours, un circuit capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fié une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Il existe des compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. Les compteurs ''modulo'' ont une valeur maximale qui est plus faible que la valeur maximale du registre. Ils sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Dans la suite du chapitre, nous allons créer des compteurs qui incrémentent leur décompte à chaque cycle d'horloge, ou du moins quand leur ''Enable'' le permet. A ce propos, dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le circuit combinatoire incrémente le registre quand on lui ordonne, avec le signal de commande adapté. [[File:Basic Sync Counter.svg|centre|vignette|upright=1.5|Compteur synchrone, cas général.]] ===Les compteurs synchrones à propagation de retenue=== Et pour comprendre comment créer le circuit incrémenteur, reprenons la séquence d'un compteur : * 000 * 001 * 010 * 011 * 100 * 101 * 110 * 111 Il faut remarquer que lors d'une incrémentation, un bit s'inverse quand tous les bits des colonnes précédentes valent 1. Déterminer si les bits des colonnes précédentes sont à 1 demande de faire un simple ET entre les bits en question. Pour implanter cela en circuit, on a besoin de deux choses. En premier lui, on a besoin d'inverseurs commandables, un pour chaque bit de l'opérande. L'inverseur commandable est, pour rappel, une simple XOR. Ensuite, il faut une chaine de portes ET qui détermine si tous les bits précédents valent un. Il y a une porte ET par bit de l'opérande, qui fait un ET entre le bit d'opérande et le résultat des colonnes précédentes. [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=3|Compteur synchrone avec des bascules D.]] ===Les compteurs en cascade=== Il est possible de concevoir des compteurs à partir de compteurs plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs de 4 bits peuvent même être des compteurs asynchrones, ce qui donne un compteur hybride entre synchrone et asynchrone. Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant une entrée en plus, indiquant que le compteur a atteint sa valeur maximale, appelée sortie ''Ripple carry out'' (RCO). La sortie en question est calculée avec une porte ET entre tous les bits du compteur pour un compteur synchrone. Si tous les bits du compteurs sont à 1, cela signifie que le compteur suivant doit être incrémenté au prochain cycle d'horloge. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] ==Les compteurs asynchrones== les '''compteurs asynchrones''' utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, un débordement se traduit par un front descendant sur la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Pour simplifier les explications, nous allons les classer suivant le type de registre à décalage utilisé. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | (registre simple) || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. À l'exception de certains compteurs ''one-hot'' qui seront vu juste après, ces compteurs sont des '''compteurs à rétroaction'''. Un terme bien barbare pour dire que l'on boucle leur sortie sur leur entrée, parfois en insérant un circuit combinatoire entre les deux. Ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. En conséquence, on peut les réinitialiser, mais pas insérer une valeur dans le compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Un exemple d'utilisation est celui de l'Intel 8008, le tout premier microprocesseur 8 bits commercialisé, où ce genre de compteurs étaient utilisés pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs en anneau et de Johnson (SISO)=== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ====Les compteurs en anneau : les compteurs ''one-hot''==== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ====Les compteurs de Johnson : les compteurs unaires==== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction de type SIPO/PISO=== D'autres compteurs sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur à rétroaction=== Un compteur à rétroaction est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> 9pepf6ncn7l6iieyc9xs4mf82uig7kf 767989 767988 2026-06-18T13:40:44Z Mewtow 31375 /* Les compteurs en cascade */ 767989 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. ==Les compteurs/décompteurs : généralités== Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ===L'interface d'un compteur/décompteur=== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, et nous verrons un usage de ce genre de compteur dans le chapitre suivant. Mais la majorité des compteurs n'incrémente le décompte que sur demande. Pour cela, ils disposent d'une entrée ''Enable'', similaire à celle des registres. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, mais pas si elle est à 0. L'entrée ''Enable'' est séparée de l'entrée d'horloge, le compteur/décompteur est incrémenté seulement si il y a un front sur le signal d'horloge et une entrée Enable à 1. Sur les compteurs/décompteurs, il y a une entrée qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. Les compteurs ont aussi une entrée ''Reset'' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées ''Preload Data'' et ''Preload Enable''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] ===Le circuit d'un compteur : généralités=== Un compteur/décompteur est registre amélioré pour le rendre capable de compter/décompter. Les '''compteurs/décompteurs synchrones''' combinent un registre pour mémoriser le nombre, avec des circuits combinatoires pour calculer la prochaine valeur du compteur. Ce circuit combinatoire est le plus souvent, mais pas toujours, un circuit capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fié une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Il existe des compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. Les compteurs ''modulo'' ont une valeur maximale qui est plus faible que la valeur maximale du registre. Ils sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Dans la suite du chapitre, nous allons créer des compteurs qui incrémentent leur décompte à chaque cycle d'horloge, ou du moins quand leur ''Enable'' le permet. A ce propos, dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le circuit combinatoire incrémente le registre quand on lui ordonne, avec le signal de commande adapté. [[File:Basic Sync Counter.svg|centre|vignette|upright=1.5|Compteur synchrone, cas général.]] ===Les compteurs synchrones à propagation de retenue=== Et pour comprendre comment créer le circuit incrémenteur, reprenons la séquence d'un compteur : * 000 * 001 * 010 * 011 * 100 * 101 * 110 * 111 Il faut remarquer que lors d'une incrémentation, un bit s'inverse quand tous les bits des colonnes précédentes valent 1. Déterminer si les bits des colonnes précédentes sont à 1 demande de faire un simple ET entre les bits en question. Pour implanter cela en circuit, on a besoin de deux choses. En premier lui, on a besoin d'inverseurs commandables, un pour chaque bit de l'opérande. L'inverseur commandable est, pour rappel, une simple XOR. Ensuite, il faut une chaine de portes ET qui détermine si tous les bits précédents valent un. Il y a une porte ET par bit de l'opérande, qui fait un ET entre le bit d'opérande et le résultat des colonnes précédentes. [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=3|Compteur synchrone avec des bascules D.]] ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs de 4 bits peuvent même être des compteurs asynchrones, ce qui donne un compteur hybride entre synchrone et asynchrone. Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant une entrée en plus, indiquant que le compteur a atteint sa valeur maximale, appelée sortie ''Ripple carry out'' (RCO). La sortie en question est calculée avec une porte ET entre tous les bits du compteur pour un compteur synchrone. Si tous les bits du compteurs sont à 1, cela signifie que le compteur suivant doit être incrémenté au prochain cycle d'horloge. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] ==Les compteurs asynchrones== les '''compteurs asynchrones''' utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, un débordement se traduit par un front descendant sur la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Pour simplifier les explications, nous allons les classer suivant le type de registre à décalage utilisé. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | (registre simple) || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. À l'exception de certains compteurs ''one-hot'' qui seront vu juste après, ces compteurs sont des '''compteurs à rétroaction'''. Un terme bien barbare pour dire que l'on boucle leur sortie sur leur entrée, parfois en insérant un circuit combinatoire entre les deux. Ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. En conséquence, on peut les réinitialiser, mais pas insérer une valeur dans le compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Un exemple d'utilisation est celui de l'Intel 8008, le tout premier microprocesseur 8 bits commercialisé, où ce genre de compteurs étaient utilisés pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs en anneau et de Johnson (SISO)=== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ====Les compteurs en anneau : les compteurs ''one-hot''==== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ====Les compteurs de Johnson : les compteurs unaires==== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction de type SIPO/PISO=== D'autres compteurs sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur à rétroaction=== Un compteur à rétroaction est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> f1el1cjixnvh6e1e98pwiiyvr92m748 767990 767989 2026-06-18T13:54:50Z Mewtow 31375 /* L'interface d'un compteur/décompteur */ 767990 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. ==Les compteurs/décompteurs : généralités== Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ===L'interface d'un compteur/décompteur=== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée ''Enable'', similaire à celle des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Sur les compteurs/décompteurs, il y a une entrée qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. Les compteurs ont aussi une entrée ''Reset'' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées ''Preload Data'' et ''Preload Enable''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] ===Le circuit d'un compteur : généralités=== Un compteur/décompteur est registre amélioré pour le rendre capable de compter/décompter. Les '''compteurs/décompteurs synchrones''' combinent un registre pour mémoriser le nombre, avec des circuits combinatoires pour calculer la prochaine valeur du compteur. Ce circuit combinatoire est le plus souvent, mais pas toujours, un circuit capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fié une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Il existe des compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. Les compteurs ''modulo'' ont une valeur maximale qui est plus faible que la valeur maximale du registre. Ils sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Dans la suite du chapitre, nous allons créer des compteurs qui incrémentent leur décompte à chaque cycle d'horloge, ou du moins quand leur ''Enable'' le permet. A ce propos, dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le circuit combinatoire incrémente le registre quand on lui ordonne, avec le signal de commande adapté. [[File:Basic Sync Counter.svg|centre|vignette|upright=1.5|Compteur synchrone, cas général.]] ===Les compteurs synchrones à propagation de retenue=== Et pour comprendre comment créer le circuit incrémenteur, reprenons la séquence d'un compteur : * 000 * 001 * 010 * 011 * 100 * 101 * 110 * 111 Il faut remarquer que lors d'une incrémentation, un bit s'inverse quand tous les bits des colonnes précédentes valent 1. Déterminer si les bits des colonnes précédentes sont à 1 demande de faire un simple ET entre les bits en question. Pour implanter cela en circuit, on a besoin de deux choses. En premier lui, on a besoin d'inverseurs commandables, un pour chaque bit de l'opérande. L'inverseur commandable est, pour rappel, une simple XOR. Ensuite, il faut une chaine de portes ET qui détermine si tous les bits précédents valent un. Il y a une porte ET par bit de l'opérande, qui fait un ET entre le bit d'opérande et le résultat des colonnes précédentes. [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=3|Compteur synchrone avec des bascules D.]] ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs de 4 bits peuvent même être des compteurs asynchrones, ce qui donne un compteur hybride entre synchrone et asynchrone. Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant une entrée en plus, indiquant que le compteur a atteint sa valeur maximale, appelée sortie ''Ripple carry out'' (RCO). La sortie en question est calculée avec une porte ET entre tous les bits du compteur pour un compteur synchrone. Si tous les bits du compteurs sont à 1, cela signifie que le compteur suivant doit être incrémenté au prochain cycle d'horloge. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] ==Les compteurs asynchrones== les '''compteurs asynchrones''' utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, un débordement se traduit par un front descendant sur la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Pour simplifier les explications, nous allons les classer suivant le type de registre à décalage utilisé. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | (registre simple) || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. À l'exception de certains compteurs ''one-hot'' qui seront vu juste après, ces compteurs sont des '''compteurs à rétroaction'''. Un terme bien barbare pour dire que l'on boucle leur sortie sur leur entrée, parfois en insérant un circuit combinatoire entre les deux. Ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. En conséquence, on peut les réinitialiser, mais pas insérer une valeur dans le compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Un exemple d'utilisation est celui de l'Intel 8008, le tout premier microprocesseur 8 bits commercialisé, où ce genre de compteurs étaient utilisés pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs en anneau et de Johnson (SISO)=== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ====Les compteurs en anneau : les compteurs ''one-hot''==== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ====Les compteurs de Johnson : les compteurs unaires==== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction de type SIPO/PISO=== D'autres compteurs sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur à rétroaction=== Un compteur à rétroaction est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> 8wslvh2yn7hl6v91330ipyw7rhgngvw 767991 767990 2026-06-18T13:55:09Z Mewtow 31375 767991 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée ''Enable'', similaire à celle des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Sur les compteurs/décompteurs, il y a une entrée qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. Les compteurs ont aussi une entrée ''Reset'' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées ''Preload Data'' et ''Preload Enable''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] ===Le circuit d'un compteur : généralités=== Un compteur/décompteur est registre amélioré pour le rendre capable de compter/décompter. Les '''compteurs/décompteurs synchrones''' combinent un registre pour mémoriser le nombre, avec des circuits combinatoires pour calculer la prochaine valeur du compteur. Ce circuit combinatoire est le plus souvent, mais pas toujours, un circuit capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fié une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Il existe des compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. Les compteurs ''modulo'' ont une valeur maximale qui est plus faible que la valeur maximale du registre. Ils sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Dans la suite du chapitre, nous allons créer des compteurs qui incrémentent leur décompte à chaque cycle d'horloge, ou du moins quand leur ''Enable'' le permet. A ce propos, dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le circuit combinatoire incrémente le registre quand on lui ordonne, avec le signal de commande adapté. [[File:Basic Sync Counter.svg|centre|vignette|upright=1.5|Compteur synchrone, cas général.]] ===Les compteurs synchrones à propagation de retenue=== Et pour comprendre comment créer le circuit incrémenteur, reprenons la séquence d'un compteur : * 000 * 001 * 010 * 011 * 100 * 101 * 110 * 111 Il faut remarquer que lors d'une incrémentation, un bit s'inverse quand tous les bits des colonnes précédentes valent 1. Déterminer si les bits des colonnes précédentes sont à 1 demande de faire un simple ET entre les bits en question. Pour implanter cela en circuit, on a besoin de deux choses. En premier lui, on a besoin d'inverseurs commandables, un pour chaque bit de l'opérande. L'inverseur commandable est, pour rappel, une simple XOR. Ensuite, il faut une chaine de portes ET qui détermine si tous les bits précédents valent un. Il y a une porte ET par bit de l'opérande, qui fait un ET entre le bit d'opérande et le résultat des colonnes précédentes. [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=3|Compteur synchrone avec des bascules D.]] ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs de 4 bits peuvent même être des compteurs asynchrones, ce qui donne un compteur hybride entre synchrone et asynchrone. Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant une entrée en plus, indiquant que le compteur a atteint sa valeur maximale, appelée sortie ''Ripple carry out'' (RCO). La sortie en question est calculée avec une porte ET entre tous les bits du compteur pour un compteur synchrone. Si tous les bits du compteurs sont à 1, cela signifie que le compteur suivant doit être incrémenté au prochain cycle d'horloge. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] ==Les compteurs asynchrones== les '''compteurs asynchrones''' utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, un débordement se traduit par un front descendant sur la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Pour simplifier les explications, nous allons les classer suivant le type de registre à décalage utilisé. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | (registre simple) || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. À l'exception de certains compteurs ''one-hot'' qui seront vu juste après, ces compteurs sont des '''compteurs à rétroaction'''. Un terme bien barbare pour dire que l'on boucle leur sortie sur leur entrée, parfois en insérant un circuit combinatoire entre les deux. Ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. En conséquence, on peut les réinitialiser, mais pas insérer une valeur dans le compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Un exemple d'utilisation est celui de l'Intel 8008, le tout premier microprocesseur 8 bits commercialisé, où ce genre de compteurs étaient utilisés pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs en anneau et de Johnson (SISO)=== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ====Les compteurs en anneau : les compteurs ''one-hot''==== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ====Les compteurs de Johnson : les compteurs unaires==== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction de type SIPO/PISO=== D'autres compteurs sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur à rétroaction=== Un compteur à rétroaction est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> qum86hu4z783l3djt1zkkpq5hswinr1 767992 767991 2026-06-18T13:55:46Z Mewtow 31375 767992 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. ==Le décompte : la valeur à incrémenter/décrémenter== Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée ''Enable'', similaire à celle des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Sur les compteurs/décompteurs, il y a une entrée qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. Les compteurs ont aussi une entrée ''Reset'' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées ''Preload Data'' et ''Preload Enable''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] ==Le circuit d'un compteur : généralités== Un compteur/décompteur est registre amélioré pour le rendre capable de compter/décompter. Les '''compteurs/décompteurs synchrones''' combinent un registre pour mémoriser le nombre, avec des circuits combinatoires pour calculer la prochaine valeur du compteur. Ce circuit combinatoire est le plus souvent, mais pas toujours, un circuit capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fié une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Il existe des compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. Les compteurs ''modulo'' ont une valeur maximale qui est plus faible que la valeur maximale du registre. Ils sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Dans la suite du chapitre, nous allons créer des compteurs qui incrémentent leur décompte à chaque cycle d'horloge, ou du moins quand leur ''Enable'' le permet. A ce propos, dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le circuit combinatoire incrémente le registre quand on lui ordonne, avec le signal de commande adapté. [[File:Basic Sync Counter.svg|centre|vignette|upright=1.5|Compteur synchrone, cas général.]] ===Les compteurs synchrones à propagation de retenue=== Et pour comprendre comment créer le circuit incrémenteur, reprenons la séquence d'un compteur : * 000 * 001 * 010 * 011 * 100 * 101 * 110 * 111 Il faut remarquer que lors d'une incrémentation, un bit s'inverse quand tous les bits des colonnes précédentes valent 1. Déterminer si les bits des colonnes précédentes sont à 1 demande de faire un simple ET entre les bits en question. Pour implanter cela en circuit, on a besoin de deux choses. En premier lui, on a besoin d'inverseurs commandables, un pour chaque bit de l'opérande. L'inverseur commandable est, pour rappel, une simple XOR. Ensuite, il faut une chaine de portes ET qui détermine si tous les bits précédents valent un. Il y a une porte ET par bit de l'opérande, qui fait un ET entre le bit d'opérande et le résultat des colonnes précédentes. [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=3|Compteur synchrone avec des bascules D.]] ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs de 4 bits peuvent même être des compteurs asynchrones, ce qui donne un compteur hybride entre synchrone et asynchrone. Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant une entrée en plus, indiquant que le compteur a atteint sa valeur maximale, appelée sortie ''Ripple carry out'' (RCO). La sortie en question est calculée avec une porte ET entre tous les bits du compteur pour un compteur synchrone. Si tous les bits du compteurs sont à 1, cela signifie que le compteur suivant doit être incrémenté au prochain cycle d'horloge. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] ==Les compteurs asynchrones== les '''compteurs asynchrones''' utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, un débordement se traduit par un front descendant sur la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Pour simplifier les explications, nous allons les classer suivant le type de registre à décalage utilisé. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | (registre simple) || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. À l'exception de certains compteurs ''one-hot'' qui seront vu juste après, ces compteurs sont des '''compteurs à rétroaction'''. Un terme bien barbare pour dire que l'on boucle leur sortie sur leur entrée, parfois en insérant un circuit combinatoire entre les deux. Ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. En conséquence, on peut les réinitialiser, mais pas insérer une valeur dans le compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Un exemple d'utilisation est celui de l'Intel 8008, le tout premier microprocesseur 8 bits commercialisé, où ce genre de compteurs étaient utilisés pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs en anneau et de Johnson (SISO)=== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ====Les compteurs en anneau : les compteurs ''one-hot''==== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ====Les compteurs de Johnson : les compteurs unaires==== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction de type SIPO/PISO=== D'autres compteurs sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur à rétroaction=== Un compteur à rétroaction est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> ae3waorvofhm63ksk2stg04ekuqoxmt 767993 767992 2026-06-18T13:56:43Z Mewtow 31375 /* Le décompte : la valeur à incrémenter/décrémenter */ 767993 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée ''Enable'', similaire à celle des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Sur les compteurs/décompteurs, il y a une entrée qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. Les compteurs ont aussi une entrée ''Reset'' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées ''Preload Data'' et ''Preload Enable''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] ==Le circuit d'un compteur : généralités== Un compteur/décompteur est registre amélioré pour le rendre capable de compter/décompter. Les '''compteurs/décompteurs synchrones''' combinent un registre pour mémoriser le nombre, avec des circuits combinatoires pour calculer la prochaine valeur du compteur. Ce circuit combinatoire est le plus souvent, mais pas toujours, un circuit capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fié une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Il existe des compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. Les compteurs ''modulo'' ont une valeur maximale qui est plus faible que la valeur maximale du registre. Ils sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Dans la suite du chapitre, nous allons créer des compteurs qui incrémentent leur décompte à chaque cycle d'horloge, ou du moins quand leur ''Enable'' le permet. A ce propos, dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le circuit combinatoire incrémente le registre quand on lui ordonne, avec le signal de commande adapté. [[File:Basic Sync Counter.svg|centre|vignette|upright=1.5|Compteur synchrone, cas général.]] ===Les compteurs synchrones à propagation de retenue=== Et pour comprendre comment créer le circuit incrémenteur, reprenons la séquence d'un compteur : * 000 * 001 * 010 * 011 * 100 * 101 * 110 * 111 Il faut remarquer que lors d'une incrémentation, un bit s'inverse quand tous les bits des colonnes précédentes valent 1. Déterminer si les bits des colonnes précédentes sont à 1 demande de faire un simple ET entre les bits en question. Pour implanter cela en circuit, on a besoin de deux choses. En premier lui, on a besoin d'inverseurs commandables, un pour chaque bit de l'opérande. L'inverseur commandable est, pour rappel, une simple XOR. Ensuite, il faut une chaine de portes ET qui détermine si tous les bits précédents valent un. Il y a une porte ET par bit de l'opérande, qui fait un ET entre le bit d'opérande et le résultat des colonnes précédentes. [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=3|Compteur synchrone avec des bascules D.]] ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs de 4 bits peuvent même être des compteurs asynchrones, ce qui donne un compteur hybride entre synchrone et asynchrone. Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant une entrée en plus, indiquant que le compteur a atteint sa valeur maximale, appelée sortie ''Ripple carry out'' (RCO). La sortie en question est calculée avec une porte ET entre tous les bits du compteur pour un compteur synchrone. Si tous les bits du compteurs sont à 1, cela signifie que le compteur suivant doit être incrémenté au prochain cycle d'horloge. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] ==Les compteurs asynchrones== les '''compteurs asynchrones''' utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, un débordement se traduit par un front descendant sur la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Pour simplifier les explications, nous allons les classer suivant le type de registre à décalage utilisé. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | (registre simple) || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. À l'exception de certains compteurs ''one-hot'' qui seront vu juste après, ces compteurs sont des '''compteurs à rétroaction'''. Un terme bien barbare pour dire que l'on boucle leur sortie sur leur entrée, parfois en insérant un circuit combinatoire entre les deux. Ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. En conséquence, on peut les réinitialiser, mais pas insérer une valeur dans le compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Un exemple d'utilisation est celui de l'Intel 8008, le tout premier microprocesseur 8 bits commercialisé, où ce genre de compteurs étaient utilisés pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs en anneau et de Johnson (SISO)=== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ====Les compteurs en anneau : les compteurs ''one-hot''==== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ====Les compteurs de Johnson : les compteurs unaires==== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction de type SIPO/PISO=== D'autres compteurs sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur à rétroaction=== Un compteur à rétroaction est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> icllegcjx2zsbvaq03z9huvnpm8l8hf 767994 767993 2026-06-18T13:57:40Z Mewtow 31375 /* Les compteurs synchrones */ 767994 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée ''Enable'', similaire à celle des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Sur les compteurs/décompteurs, il y a une entrée qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. Les compteurs ont aussi une entrée ''Reset'' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées ''Preload Data'' et ''Preload Enable''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] ==Le circuit d'un compteur : généralités== Un compteur/décompteur est registre amélioré pour le rendre capable de compter/décompter. Les '''compteurs/décompteurs synchrones''' combinent un registre pour mémoriser le nombre, avec des circuits combinatoires pour calculer la prochaine valeur du compteur. Ce circuit combinatoire est le plus souvent, mais pas toujours, un circuit capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fié une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Il existe des compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. Les compteurs ''modulo'' ont une valeur maximale qui est plus faible que la valeur maximale du registre. Ils sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Dans la suite du chapitre, nous allons créer des compteurs qui incrémentent leur décompte à chaque cycle d'horloge, ou du moins quand leur ''Enable'' le permet. A ce propos, dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ===Les compteurs synchrones à propagation de retenue=== Et pour comprendre comment créer le circuit incrémenteur, reprenons la séquence d'un compteur : * 000 * 001 * 010 * 011 * 100 * 101 * 110 * 111 Il faut remarquer que lors d'une incrémentation, un bit s'inverse quand tous les bits des colonnes précédentes valent 1. Déterminer si les bits des colonnes précédentes sont à 1 demande de faire un simple ET entre les bits en question. Pour implanter cela en circuit, on a besoin de deux choses. En premier lui, on a besoin d'inverseurs commandables, un pour chaque bit de l'opérande. L'inverseur commandable est, pour rappel, une simple XOR. Ensuite, il faut une chaine de portes ET qui détermine si tous les bits précédents valent un. Il y a une porte ET par bit de l'opérande, qui fait un ET entre le bit d'opérande et le résultat des colonnes précédentes. [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=3|Compteur synchrone avec des bascules D.]] ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs de 4 bits peuvent même être des compteurs asynchrones, ce qui donne un compteur hybride entre synchrone et asynchrone. Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant une entrée en plus, indiquant que le compteur a atteint sa valeur maximale, appelée sortie ''Ripple carry out'' (RCO). La sortie en question est calculée avec une porte ET entre tous les bits du compteur pour un compteur synchrone. Si tous les bits du compteurs sont à 1, cela signifie que le compteur suivant doit être incrémenté au prochain cycle d'horloge. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] ==Les compteurs asynchrones== les '''compteurs asynchrones''' utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, un débordement se traduit par un front descendant sur la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Pour simplifier les explications, nous allons les classer suivant le type de registre à décalage utilisé. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | (registre simple) || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. À l'exception de certains compteurs ''one-hot'' qui seront vu juste après, ces compteurs sont des '''compteurs à rétroaction'''. Un terme bien barbare pour dire que l'on boucle leur sortie sur leur entrée, parfois en insérant un circuit combinatoire entre les deux. Ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. En conséquence, on peut les réinitialiser, mais pas insérer une valeur dans le compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Un exemple d'utilisation est celui de l'Intel 8008, le tout premier microprocesseur 8 bits commercialisé, où ce genre de compteurs étaient utilisés pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs en anneau et de Johnson (SISO)=== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ====Les compteurs en anneau : les compteurs ''one-hot''==== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ====Les compteurs de Johnson : les compteurs unaires==== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction de type SIPO/PISO=== D'autres compteurs sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur à rétroaction=== Un compteur à rétroaction est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> h3dbxdjefshsuqz96zpmrgqss87v7d5 767995 767994 2026-06-18T13:58:25Z Mewtow 31375 /* Le circuit d'un compteur : généralités */ 767995 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée ''Enable'', similaire à celle des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Sur les compteurs/décompteurs, il y a une entrée qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. Les compteurs ont aussi une entrée ''Reset'' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées ''Preload Data'' et ''Preload Enable''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Ce circuit combinatoire est le plus souvent, mais pas toujours, un circuit capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fié une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Il existe des compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. Les compteurs ''modulo'' ont une valeur maximale qui est plus faible que la valeur maximale du registre. Ils sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Dans la suite du chapitre, nous allons créer des compteurs qui incrémentent leur décompte à chaque cycle d'horloge, ou du moins quand leur ''Enable'' le permet. A ce propos, dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ===Les compteurs synchrones à propagation de retenue=== Et pour comprendre comment créer le circuit incrémenteur, reprenons la séquence d'un compteur : * 000 * 001 * 010 * 011 * 100 * 101 * 110 * 111 Il faut remarquer que lors d'une incrémentation, un bit s'inverse quand tous les bits des colonnes précédentes valent 1. Déterminer si les bits des colonnes précédentes sont à 1 demande de faire un simple ET entre les bits en question. Pour implanter cela en circuit, on a besoin de deux choses. En premier lui, on a besoin d'inverseurs commandables, un pour chaque bit de l'opérande. L'inverseur commandable est, pour rappel, une simple XOR. Ensuite, il faut une chaine de portes ET qui détermine si tous les bits précédents valent un. Il y a une porte ET par bit de l'opérande, qui fait un ET entre le bit d'opérande et le résultat des colonnes précédentes. [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=3|Compteur synchrone avec des bascules D.]] ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs de 4 bits peuvent même être des compteurs asynchrones, ce qui donne un compteur hybride entre synchrone et asynchrone. Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant une entrée en plus, indiquant que le compteur a atteint sa valeur maximale, appelée sortie ''Ripple carry out'' (RCO). La sortie en question est calculée avec une porte ET entre tous les bits du compteur pour un compteur synchrone. Si tous les bits du compteurs sont à 1, cela signifie que le compteur suivant doit être incrémenté au prochain cycle d'horloge. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] ==Les compteurs asynchrones== les '''compteurs asynchrones''' utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, un débordement se traduit par un front descendant sur la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Pour simplifier les explications, nous allons les classer suivant le type de registre à décalage utilisé. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | (registre simple) || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. À l'exception de certains compteurs ''one-hot'' qui seront vu juste après, ces compteurs sont des '''compteurs à rétroaction'''. Un terme bien barbare pour dire que l'on boucle leur sortie sur leur entrée, parfois en insérant un circuit combinatoire entre les deux. Ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. En conséquence, on peut les réinitialiser, mais pas insérer une valeur dans le compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Un exemple d'utilisation est celui de l'Intel 8008, le tout premier microprocesseur 8 bits commercialisé, où ce genre de compteurs étaient utilisés pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs en anneau et de Johnson (SISO)=== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ====Les compteurs en anneau : les compteurs ''one-hot''==== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ====Les compteurs de Johnson : les compteurs unaires==== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction de type SIPO/PISO=== D'autres compteurs sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur à rétroaction=== Un compteur à rétroaction est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> a5kzbojcpo18afi69onkfi3tqfdefg5 767996 767995 2026-06-18T13:58:51Z Mewtow 31375 /* Les compteurs synchrones */ 767996 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée ''Enable'', similaire à celle des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Sur les compteurs/décompteurs, il y a une entrée qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. Les compteurs ont aussi une entrée ''Reset'' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées ''Preload Data'' et ''Preload Enable''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Ce circuit combinatoire est le plus souvent, mais pas toujours, un circuit capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fié une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Il existe des compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. Les compteurs ''modulo'' ont une valeur maximale qui est plus faible que la valeur maximale du registre. Ils sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] ===Les compteurs synchrones à propagation de retenue=== Et pour comprendre comment créer le circuit incrémenteur, reprenons la séquence d'un compteur : * 000 * 001 * 010 * 011 * 100 * 101 * 110 * 111 Il faut remarquer que lors d'une incrémentation, un bit s'inverse quand tous les bits des colonnes précédentes valent 1. Déterminer si les bits des colonnes précédentes sont à 1 demande de faire un simple ET entre les bits en question. Pour implanter cela en circuit, on a besoin de deux choses. En premier lui, on a besoin d'inverseurs commandables, un pour chaque bit de l'opérande. L'inverseur commandable est, pour rappel, une simple XOR. Ensuite, il faut une chaine de portes ET qui détermine si tous les bits précédents valent un. Il y a une porte ET par bit de l'opérande, qui fait un ET entre le bit d'opérande et le résultat des colonnes précédentes. [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=3|Compteur synchrone avec des bascules D.]] ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs de 4 bits peuvent même être des compteurs asynchrones, ce qui donne un compteur hybride entre synchrone et asynchrone. Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant une entrée en plus, indiquant que le compteur a atteint sa valeur maximale, appelée sortie ''Ripple carry out'' (RCO). La sortie en question est calculée avec une porte ET entre tous les bits du compteur pour un compteur synchrone. Si tous les bits du compteurs sont à 1, cela signifie que le compteur suivant doit être incrémenté au prochain cycle d'horloge. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] ==Les compteurs asynchrones== les '''compteurs asynchrones''' utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, un débordement se traduit par un front descendant sur la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Pour simplifier les explications, nous allons les classer suivant le type de registre à décalage utilisé. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | (registre simple) || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. À l'exception de certains compteurs ''one-hot'' qui seront vu juste après, ces compteurs sont des '''compteurs à rétroaction'''. Un terme bien barbare pour dire que l'on boucle leur sortie sur leur entrée, parfois en insérant un circuit combinatoire entre les deux. Ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. En conséquence, on peut les réinitialiser, mais pas insérer une valeur dans le compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Un exemple d'utilisation est celui de l'Intel 8008, le tout premier microprocesseur 8 bits commercialisé, où ce genre de compteurs étaient utilisés pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs en anneau et de Johnson (SISO)=== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ====Les compteurs en anneau : les compteurs ''one-hot''==== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ====Les compteurs de Johnson : les compteurs unaires==== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction de type SIPO/PISO=== D'autres compteurs sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur à rétroaction=== Un compteur à rétroaction est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> gxm374ugrpo2awx8dpuwipfmvgweq33 767997 767996 2026-06-18T13:59:15Z Mewtow 31375 /* Les compteurs synchrones */ 767997 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée ''Enable'', similaire à celle des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Sur les compteurs/décompteurs, il y a une entrée qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. Les compteurs ont aussi une entrée ''Reset'' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées ''Preload Data'' et ''Preload Enable''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Ce circuit combinatoire est le plus souvent, mais pas toujours, un circuit capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fié une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. Les compteurs ''modulo'' ont une valeur maximale qui est plus faible que la valeur maximale du registre. Ils sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] ===Les compteurs synchrones à propagation de retenue=== Et pour comprendre comment créer le circuit incrémenteur, reprenons la séquence d'un compteur : * 000 * 001 * 010 * 011 * 100 * 101 * 110 * 111 Il faut remarquer que lors d'une incrémentation, un bit s'inverse quand tous les bits des colonnes précédentes valent 1. Déterminer si les bits des colonnes précédentes sont à 1 demande de faire un simple ET entre les bits en question. Pour implanter cela en circuit, on a besoin de deux choses. En premier lui, on a besoin d'inverseurs commandables, un pour chaque bit de l'opérande. L'inverseur commandable est, pour rappel, une simple XOR. Ensuite, il faut une chaine de portes ET qui détermine si tous les bits précédents valent un. Il y a une porte ET par bit de l'opérande, qui fait un ET entre le bit d'opérande et le résultat des colonnes précédentes. [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=3|Compteur synchrone avec des bascules D.]] ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs de 4 bits peuvent même être des compteurs asynchrones, ce qui donne un compteur hybride entre synchrone et asynchrone. Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant une entrée en plus, indiquant que le compteur a atteint sa valeur maximale, appelée sortie ''Ripple carry out'' (RCO). La sortie en question est calculée avec une porte ET entre tous les bits du compteur pour un compteur synchrone. Si tous les bits du compteurs sont à 1, cela signifie que le compteur suivant doit être incrémenté au prochain cycle d'horloge. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] ==Les compteurs asynchrones== les '''compteurs asynchrones''' utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, un débordement se traduit par un front descendant sur la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Pour simplifier les explications, nous allons les classer suivant le type de registre à décalage utilisé. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | (registre simple) || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. À l'exception de certains compteurs ''one-hot'' qui seront vu juste après, ces compteurs sont des '''compteurs à rétroaction'''. Un terme bien barbare pour dire que l'on boucle leur sortie sur leur entrée, parfois en insérant un circuit combinatoire entre les deux. Ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. En conséquence, on peut les réinitialiser, mais pas insérer une valeur dans le compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Un exemple d'utilisation est celui de l'Intel 8008, le tout premier microprocesseur 8 bits commercialisé, où ce genre de compteurs étaient utilisés pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs en anneau et de Johnson (SISO)=== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ====Les compteurs en anneau : les compteurs ''one-hot''==== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ====Les compteurs de Johnson : les compteurs unaires==== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction de type SIPO/PISO=== D'autres compteurs sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur à rétroaction=== Un compteur à rétroaction est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> g33rvzqkwlwo7gq5d2f1ue7ja86t0v2 767998 767997 2026-06-18T14:03:34Z Mewtow 31375 /* Les compteurs synchrones */ 767998 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée ''Enable'', similaire à celle des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Sur les compteurs/décompteurs, il y a une entrée qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. Les compteurs ont aussi une entrée ''Reset'' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées ''Preload Data'' et ''Preload Enable''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Maintenant, il est intéressant d'étudier le circuit combinatoire. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''circuit incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Le circuit ressemble à un circuit d'addition, nettement simplifié. Il est suffisamment simple pour qu'on l'étudie ici, dans ce chapitre. ===Les compteurs synchrones à propagation de retenue=== Et pour comprendre comment créer le circuit incrémenteur, reprenons la séquence d'un compteur : * 000 * 001 * 010 * 011 * 100 * 101 * 110 * 111 Il faut remarquer que lors d'une incrémentation, un bit s'inverse quand tous les bits des colonnes précédentes valent 1. Déterminer si les bits des colonnes précédentes sont à 1 demande de faire un simple ET entre les bits en question. Pour implanter cela en circuit, on a besoin de deux choses. En premier lui, on a besoin d'inverseurs commandables, un pour chaque bit de l'opérande. L'inverseur commandable est, pour rappel, une simple XOR. Ensuite, il faut une chaine de portes ET qui détermine si tous les bits précédents valent un. Il y a une porte ET par bit de l'opérande, qui fait un ET entre le bit d'opérande et le résultat des colonnes précédentes. [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=3|Compteur synchrone avec des bascules D.]] ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs de 4 bits peuvent même être des compteurs asynchrones, ce qui donne un compteur hybride entre synchrone et asynchrone. Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant une entrée en plus, indiquant que le compteur a atteint sa valeur maximale, appelée sortie ''Ripple carry out'' (RCO). La sortie en question est calculée avec une porte ET entre tous les bits du compteur pour un compteur synchrone. Si tous les bits du compteurs sont à 1, cela signifie que le compteur suivant doit être incrémenté au prochain cycle d'horloge. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] ==Les compteurs asynchrones== les '''compteurs asynchrones''' utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, un débordement se traduit par un front descendant sur la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Pour simplifier les explications, nous allons les classer suivant le type de registre à décalage utilisé. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | (registre simple) || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. À l'exception de certains compteurs ''one-hot'' qui seront vu juste après, ces compteurs sont des '''compteurs à rétroaction'''. Un terme bien barbare pour dire que l'on boucle leur sortie sur leur entrée, parfois en insérant un circuit combinatoire entre les deux. Ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. En conséquence, on peut les réinitialiser, mais pas insérer une valeur dans le compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Un exemple d'utilisation est celui de l'Intel 8008, le tout premier microprocesseur 8 bits commercialisé, où ce genre de compteurs étaient utilisés pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs en anneau et de Johnson (SISO)=== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ====Les compteurs en anneau : les compteurs ''one-hot''==== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ====Les compteurs de Johnson : les compteurs unaires==== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction de type SIPO/PISO=== D'autres compteurs sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur à rétroaction=== Un compteur à rétroaction est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> iqid0gmi5fomlx32ijr8en4emz4n0ew 767999 767998 2026-06-18T14:06:05Z Mewtow 31375 /* Les compteurs asynchrones */ 767999 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée ''Enable'', similaire à celle des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Sur les compteurs/décompteurs, il y a une entrée qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. Les compteurs ont aussi une entrée ''Reset'' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées ''Preload Data'' et ''Preload Enable''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Maintenant, il est intéressant d'étudier le circuit combinatoire. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''circuit incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Le circuit ressemble à un circuit d'addition, nettement simplifié. Il est suffisamment simple pour qu'on l'étudie ici, dans ce chapitre. ===Les compteurs synchrones à propagation de retenue=== Et pour comprendre comment créer le circuit incrémenteur, reprenons la séquence d'un compteur : * 000 * 001 * 010 * 011 * 100 * 101 * 110 * 111 Il faut remarquer que lors d'une incrémentation, un bit s'inverse quand tous les bits des colonnes précédentes valent 1. Déterminer si les bits des colonnes précédentes sont à 1 demande de faire un simple ET entre les bits en question. Pour implanter cela en circuit, on a besoin de deux choses. En premier lui, on a besoin d'inverseurs commandables, un pour chaque bit de l'opérande. L'inverseur commandable est, pour rappel, une simple XOR. Ensuite, il faut une chaine de portes ET qui détermine si tous les bits précédents valent un. Il y a une porte ET par bit de l'opérande, qui fait un ET entre le bit d'opérande et le résultat des colonnes précédentes. [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=3|Compteur synchrone avec des bascules D.]] ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs de 4 bits peuvent même être des compteurs asynchrones, ce qui donne un compteur hybride entre synchrone et asynchrone. Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant une entrée en plus, indiquant que le compteur a atteint sa valeur maximale, appelée sortie ''Ripple carry out'' (RCO). La sortie en question est calculée avec une porte ET entre tous les bits du compteur pour un compteur synchrone. Si tous les bits du compteurs sont à 1, cela signifie que le compteur suivant doit être incrémenté au prochain cycle d'horloge. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] ==Les compteurs asynchrones== les '''compteurs asynchrones''' utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Pour simplifier les explications, nous allons les classer suivant le type de registre à décalage utilisé. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | (registre simple) || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. À l'exception de certains compteurs ''one-hot'' qui seront vu juste après, ces compteurs sont des '''compteurs à rétroaction'''. Un terme bien barbare pour dire que l'on boucle leur sortie sur leur entrée, parfois en insérant un circuit combinatoire entre les deux. Ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. En conséquence, on peut les réinitialiser, mais pas insérer une valeur dans le compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Un exemple d'utilisation est celui de l'Intel 8008, le tout premier microprocesseur 8 bits commercialisé, où ce genre de compteurs étaient utilisés pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs en anneau et de Johnson (SISO)=== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ====Les compteurs en anneau : les compteurs ''one-hot''==== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ====Les compteurs de Johnson : les compteurs unaires==== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction de type SIPO/PISO=== D'autres compteurs sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur à rétroaction=== Un compteur à rétroaction est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> 98fslkqgqmpjvzqep8yqeda5nsvsemt 768000 767999 2026-06-18T14:06:25Z Mewtow 31375 /* L'interface d'un compteur/décompteur */ 768000 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée ''Enable'', similaire à celle des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Sur les compteurs/décompteurs, il y a une entrée qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. Les compteurs ont aussi une entrée ''Reset'' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées ''Preload Data'' et ''Preload Enable''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Maintenant, il est intéressant d'étudier le circuit combinatoire. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''circuit incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Le circuit ressemble à un circuit d'addition, nettement simplifié. Il est suffisamment simple pour qu'on l'étudie ici, dans ce chapitre. ===Les compteurs synchrones à propagation de retenue=== Et pour comprendre comment créer le circuit incrémenteur, reprenons la séquence d'un compteur : * 000 * 001 * 010 * 011 * 100 * 101 * 110 * 111 Il faut remarquer que lors d'une incrémentation, un bit s'inverse quand tous les bits des colonnes précédentes valent 1. Déterminer si les bits des colonnes précédentes sont à 1 demande de faire un simple ET entre les bits en question. Pour implanter cela en circuit, on a besoin de deux choses. En premier lui, on a besoin d'inverseurs commandables, un pour chaque bit de l'opérande. L'inverseur commandable est, pour rappel, une simple XOR. Ensuite, il faut une chaine de portes ET qui détermine si tous les bits précédents valent un. Il y a une porte ET par bit de l'opérande, qui fait un ET entre le bit d'opérande et le résultat des colonnes précédentes. [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=3|Compteur synchrone avec des bascules D.]] ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs de 4 bits peuvent même être des compteurs asynchrones, ce qui donne un compteur hybride entre synchrone et asynchrone. Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant une entrée en plus, indiquant que le compteur a atteint sa valeur maximale, appelée sortie ''Ripple carry out'' (RCO). La sortie en question est calculée avec une porte ET entre tous les bits du compteur pour un compteur synchrone. Si tous les bits du compteurs sont à 1, cela signifie que le compteur suivant doit être incrémenté au prochain cycle d'horloge. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] ==Les compteurs asynchrones== les '''compteurs asynchrones''' utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Pour simplifier les explications, nous allons les classer suivant le type de registre à décalage utilisé. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | (registre simple) || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. À l'exception de certains compteurs ''one-hot'' qui seront vu juste après, ces compteurs sont des '''compteurs à rétroaction'''. Un terme bien barbare pour dire que l'on boucle leur sortie sur leur entrée, parfois en insérant un circuit combinatoire entre les deux. Ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. En conséquence, on peut les réinitialiser, mais pas insérer une valeur dans le compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Un exemple d'utilisation est celui de l'Intel 8008, le tout premier microprocesseur 8 bits commercialisé, où ce genre de compteurs étaient utilisés pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs en anneau et de Johnson (SISO)=== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ====Les compteurs en anneau : les compteurs ''one-hot''==== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ====Les compteurs de Johnson : les compteurs unaires==== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction de type SIPO/PISO=== D'autres compteurs sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur à rétroaction=== Un compteur à rétroaction est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> nqymwhc8qdlh4ri611gq55jrf30byet 768001 768000 2026-06-18T14:07:17Z Mewtow 31375 /* Les compteurs synchrones */ 768001 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée ''Enable'', similaire à celle des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Sur les compteurs/décompteurs, il y a une entrée qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. Les compteurs ont aussi une entrée ''Reset'' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées ''Preload Data'' et ''Preload Enable''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. Maintenant, il est intéressant d'étudier le circuit combinatoire. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''circuit incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Le circuit ressemble à un circuit d'addition, nettement simplifié. Il est suffisamment simple pour qu'on l'étudie ici, dans ce chapitre. ===Les compteurs synchrones à propagation de retenue=== Et pour comprendre comment créer le circuit incrémenteur, reprenons la séquence d'un compteur : * 000 * 001 * 010 * 011 * 100 * 101 * 110 * 111 Il faut remarquer que lors d'une incrémentation, un bit s'inverse quand tous les bits des colonnes précédentes valent 1. Déterminer si les bits des colonnes précédentes sont à 1 demande de faire un simple ET entre les bits en question. Pour implanter cela en circuit, on a besoin de deux choses. En premier lui, on a besoin d'inverseurs commandables, un pour chaque bit de l'opérande. L'inverseur commandable est, pour rappel, une simple XOR. Ensuite, il faut une chaine de portes ET qui détermine si tous les bits précédents valent un. Il y a une porte ET par bit de l'opérande, qui fait un ET entre le bit d'opérande et le résultat des colonnes précédentes. [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=3|Compteur synchrone avec des bascules D.]] ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs de 4 bits peuvent même être des compteurs asynchrones, ce qui donne un compteur hybride entre synchrone et asynchrone. Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant une entrée en plus, indiquant que le compteur a atteint sa valeur maximale, appelée sortie ''Ripple carry out'' (RCO). La sortie en question est calculée avec une porte ET entre tous les bits du compteur pour un compteur synchrone. Si tous les bits du compteurs sont à 1, cela signifie que le compteur suivant doit être incrémenté au prochain cycle d'horloge. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] ==Les compteurs asynchrones== les '''compteurs asynchrones''' utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Pour simplifier les explications, nous allons les classer suivant le type de registre à décalage utilisé. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | (registre simple) || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. À l'exception de certains compteurs ''one-hot'' qui seront vu juste après, ces compteurs sont des '''compteurs à rétroaction'''. Un terme bien barbare pour dire que l'on boucle leur sortie sur leur entrée, parfois en insérant un circuit combinatoire entre les deux. Ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. En conséquence, on peut les réinitialiser, mais pas insérer une valeur dans le compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Un exemple d'utilisation est celui de l'Intel 8008, le tout premier microprocesseur 8 bits commercialisé, où ce genre de compteurs étaient utilisés pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs en anneau et de Johnson (SISO)=== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ====Les compteurs en anneau : les compteurs ''one-hot''==== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ====Les compteurs de Johnson : les compteurs unaires==== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction de type SIPO/PISO=== D'autres compteurs sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur à rétroaction=== Un compteur à rétroaction est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> p5twffyxc905sh7qs056spz3oxbcc8v 768002 768001 2026-06-18T14:09:27Z Mewtow 31375 /* L'interface d'un compteur/décompteur */ 768002 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. Maintenant, il est intéressant d'étudier le circuit combinatoire. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''circuit incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Le circuit ressemble à un circuit d'addition, nettement simplifié. Il est suffisamment simple pour qu'on l'étudie ici, dans ce chapitre. ===Les compteurs synchrones à propagation de retenue=== Et pour comprendre comment créer le circuit incrémenteur, reprenons la séquence d'un compteur : * 000 * 001 * 010 * 011 * 100 * 101 * 110 * 111 Il faut remarquer que lors d'une incrémentation, un bit s'inverse quand tous les bits des colonnes précédentes valent 1. Déterminer si les bits des colonnes précédentes sont à 1 demande de faire un simple ET entre les bits en question. Pour implanter cela en circuit, on a besoin de deux choses. En premier lui, on a besoin d'inverseurs commandables, un pour chaque bit de l'opérande. L'inverseur commandable est, pour rappel, une simple XOR. Ensuite, il faut une chaine de portes ET qui détermine si tous les bits précédents valent un. Il y a une porte ET par bit de l'opérande, qui fait un ET entre le bit d'opérande et le résultat des colonnes précédentes. [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=3|Compteur synchrone avec des bascules D.]] ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs de 4 bits peuvent même être des compteurs asynchrones, ce qui donne un compteur hybride entre synchrone et asynchrone. Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant une entrée en plus, indiquant que le compteur a atteint sa valeur maximale, appelée sortie ''Ripple carry out'' (RCO). La sortie en question est calculée avec une porte ET entre tous les bits du compteur pour un compteur synchrone. Si tous les bits du compteurs sont à 1, cela signifie que le compteur suivant doit être incrémenté au prochain cycle d'horloge. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] ==Les compteurs asynchrones== les '''compteurs asynchrones''' utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Pour simplifier les explications, nous allons les classer suivant le type de registre à décalage utilisé. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | (registre simple) || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. À l'exception de certains compteurs ''one-hot'' qui seront vu juste après, ces compteurs sont des '''compteurs à rétroaction'''. Un terme bien barbare pour dire que l'on boucle leur sortie sur leur entrée, parfois en insérant un circuit combinatoire entre les deux. Ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. En conséquence, on peut les réinitialiser, mais pas insérer une valeur dans le compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Un exemple d'utilisation est celui de l'Intel 8008, le tout premier microprocesseur 8 bits commercialisé, où ce genre de compteurs étaient utilisés pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs en anneau et de Johnson (SISO)=== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ====Les compteurs en anneau : les compteurs ''one-hot''==== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ====Les compteurs de Johnson : les compteurs unaires==== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction de type SIPO/PISO=== D'autres compteurs sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur à rétroaction=== Un compteur à rétroaction est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> pe1a9brd79r7mpbbpp889byin14g85i 768003 768002 2026-06-18T14:09:45Z Mewtow 31375 /* L'interface d'un compteur/décompteur */ 768003 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. Maintenant, il est intéressant d'étudier le circuit combinatoire. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''circuit incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Le circuit ressemble à un circuit d'addition, nettement simplifié. Il est suffisamment simple pour qu'on l'étudie ici, dans ce chapitre. ===Les compteurs synchrones à propagation de retenue=== Et pour comprendre comment créer le circuit incrémenteur, reprenons la séquence d'un compteur : * 000 * 001 * 010 * 011 * 100 * 101 * 110 * 111 Il faut remarquer que lors d'une incrémentation, un bit s'inverse quand tous les bits des colonnes précédentes valent 1. Déterminer si les bits des colonnes précédentes sont à 1 demande de faire un simple ET entre les bits en question. Pour implanter cela en circuit, on a besoin de deux choses. En premier lui, on a besoin d'inverseurs commandables, un pour chaque bit de l'opérande. L'inverseur commandable est, pour rappel, une simple XOR. Ensuite, il faut une chaine de portes ET qui détermine si tous les bits précédents valent un. Il y a une porte ET par bit de l'opérande, qui fait un ET entre le bit d'opérande et le résultat des colonnes précédentes. [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=3|Compteur synchrone avec des bascules D.]] ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs de 4 bits peuvent même être des compteurs asynchrones, ce qui donne un compteur hybride entre synchrone et asynchrone. Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant une entrée en plus, indiquant que le compteur a atteint sa valeur maximale, appelée sortie ''Ripple carry out'' (RCO). La sortie en question est calculée avec une porte ET entre tous les bits du compteur pour un compteur synchrone. Si tous les bits du compteurs sont à 1, cela signifie que le compteur suivant doit être incrémenté au prochain cycle d'horloge. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] ==Les compteurs asynchrones== les '''compteurs asynchrones''' utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Pour simplifier les explications, nous allons les classer suivant le type de registre à décalage utilisé. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | (registre simple) || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. À l'exception de certains compteurs ''one-hot'' qui seront vu juste après, ces compteurs sont des '''compteurs à rétroaction'''. Un terme bien barbare pour dire que l'on boucle leur sortie sur leur entrée, parfois en insérant un circuit combinatoire entre les deux. Ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. En conséquence, on peut les réinitialiser, mais pas insérer une valeur dans le compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Un exemple d'utilisation est celui de l'Intel 8008, le tout premier microprocesseur 8 bits commercialisé, où ce genre de compteurs étaient utilisés pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs en anneau et de Johnson (SISO)=== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ====Les compteurs en anneau : les compteurs ''one-hot''==== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ====Les compteurs de Johnson : les compteurs unaires==== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction de type SIPO/PISO=== D'autres compteurs sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur à rétroaction=== Un compteur à rétroaction est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> 7bpj5r4o64zurt7rqhuzo73klp573a5 768004 768003 2026-06-18T14:16:31Z Mewtow 31375 /* Les compteurs synchrones à propagation de retenue */ 768004 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. Maintenant, il est intéressant d'étudier le circuit combinatoire. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''circuit incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Le circuit ressemble à un circuit d'addition, nettement simplifié. Il est suffisamment simple pour qu'on l'étudie ici, dans ce chapitre. ===Les compteurs synchrones à propagation de retenue=== Et pour comprendre comment créer le circuit incrémenteur, reprenons la séquence d'un compteur de 4 bits : * 0000 * 0001 * 0010 * 0011 * 0100 * 0101 * 0110 * 0111 * 1000 * 1001 * 1010 * 1011 * 1100 * 1101 * 1110 * 1111 Une incrémentation fait passer d'une ligne à la suivante. On peut remarquer qu'un bit s'inverse entre deux lignes, quand tous les bits des colonnes précédentes valent 1, dans la première ligne. par exemple, si je prend la valeur 0011111, son incrémentation va donner 0100000. Déterminer si les bits des colonnes précédentes sont à 1 demande de faire un simple ET entre les bits en question. Pour implanter cela en circuit, on a besoin de deux choses. En premier lui, on a besoin d'inverseurs commandables, un pour chaque bit de l'opérande. L'inverseur commandable est, pour rappel, une simple XOR. Ensuite, il faut une chaine de portes ET qui détermine si tous les bits précédents valent un. Il y a une porte ET par bit de l'opérande, qui fait un ET entre le bit d'opérande et le résultat des colonnes précédentes. [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=3|Compteur synchrone avec des bascules D.]] ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs de 4 bits peuvent même être des compteurs asynchrones, ce qui donne un compteur hybride entre synchrone et asynchrone. Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant une entrée en plus, indiquant que le compteur a atteint sa valeur maximale, appelée sortie ''Ripple carry out'' (RCO). La sortie en question est calculée avec une porte ET entre tous les bits du compteur pour un compteur synchrone. Si tous les bits du compteurs sont à 1, cela signifie que le compteur suivant doit être incrémenté au prochain cycle d'horloge. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] ==Les compteurs asynchrones== les '''compteurs asynchrones''' utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Pour simplifier les explications, nous allons les classer suivant le type de registre à décalage utilisé. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | (registre simple) || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. À l'exception de certains compteurs ''one-hot'' qui seront vu juste après, ces compteurs sont des '''compteurs à rétroaction'''. Un terme bien barbare pour dire que l'on boucle leur sortie sur leur entrée, parfois en insérant un circuit combinatoire entre les deux. Ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. En conséquence, on peut les réinitialiser, mais pas insérer une valeur dans le compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Un exemple d'utilisation est celui de l'Intel 8008, le tout premier microprocesseur 8 bits commercialisé, où ce genre de compteurs étaient utilisés pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs en anneau et de Johnson (SISO)=== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ====Les compteurs en anneau : les compteurs ''one-hot''==== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ====Les compteurs de Johnson : les compteurs unaires==== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction de type SIPO/PISO=== D'autres compteurs sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur à rétroaction=== Un compteur à rétroaction est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> lwt1m4lpix0vktfozjxi4465ux3hb87 768023 768004 2026-06-18T15:02:55Z Mewtow 31375 /* Les compteurs synchrones */ 768023 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les compteurs synchrones à propagation de retenue=== Il est intéressant d'étudier le circuit combinatoire qui incrémente le compteur. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Nous l'avions déjà abordé dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des demi-additionneurs les uns à la suite des autres. Un demi-additionneur additionne deux bits : un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : [[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=3|Compteur synchrone avec des bascules D.]] Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=3|Compteur synchrone avec des bascules D.]] ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs de 4 bits peuvent même être des compteurs asynchrones, ce qui donne un compteur hybride entre synchrone et asynchrone. Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant une entrée en plus, indiquant que le compteur a atteint sa valeur maximale, appelée sortie ''Ripple carry out'' (RCO). La sortie en question est calculée avec une porte ET entre tous les bits du compteur pour un compteur synchrone. Si tous les bits du compteurs sont à 1, cela signifie que le compteur suivant doit être incrémenté au prochain cycle d'horloge. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] ==Les compteurs asynchrones== les '''compteurs asynchrones''' utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Pour simplifier les explications, nous allons les classer suivant le type de registre à décalage utilisé. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | (registre simple) || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. À l'exception de certains compteurs ''one-hot'' qui seront vu juste après, ces compteurs sont des '''compteurs à rétroaction'''. Un terme bien barbare pour dire que l'on boucle leur sortie sur leur entrée, parfois en insérant un circuit combinatoire entre les deux. Ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. En conséquence, on peut les réinitialiser, mais pas insérer une valeur dans le compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Un exemple d'utilisation est celui de l'Intel 8008, le tout premier microprocesseur 8 bits commercialisé, où ce genre de compteurs étaient utilisés pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs en anneau et de Johnson (SISO)=== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ====Les compteurs en anneau : les compteurs ''one-hot''==== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ====Les compteurs de Johnson : les compteurs unaires==== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction de type SIPO/PISO=== D'autres compteurs sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur à rétroaction=== Un compteur à rétroaction est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> 0n52i2yda1a5lg5u04271keevcluwkz 768024 768023 2026-06-18T15:03:30Z Mewtow 31375 /* Les compteurs synchrones à propagation de retenue */ 768024 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les compteurs synchrones à propagation de retenue=== Il est intéressant d'étudier le circuit combinatoire qui incrémente le compteur. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Nous l'avions déjà abordé dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des demi-additionneurs les uns à la suite des autres. Un demi-additionneur additionne deux bits : un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : [[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur synchrone avec des bascules D.]] Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=3|Compteur synchrone avec des bascules D.]] ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs de 4 bits peuvent même être des compteurs asynchrones, ce qui donne un compteur hybride entre synchrone et asynchrone. Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant une entrée en plus, indiquant que le compteur a atteint sa valeur maximale, appelée sortie ''Ripple carry out'' (RCO). La sortie en question est calculée avec une porte ET entre tous les bits du compteur pour un compteur synchrone. Si tous les bits du compteurs sont à 1, cela signifie que le compteur suivant doit être incrémenté au prochain cycle d'horloge. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] ==Les compteurs asynchrones== les '''compteurs asynchrones''' utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Pour simplifier les explications, nous allons les classer suivant le type de registre à décalage utilisé. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | (registre simple) || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. À l'exception de certains compteurs ''one-hot'' qui seront vu juste après, ces compteurs sont des '''compteurs à rétroaction'''. Un terme bien barbare pour dire que l'on boucle leur sortie sur leur entrée, parfois en insérant un circuit combinatoire entre les deux. Ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. En conséquence, on peut les réinitialiser, mais pas insérer une valeur dans le compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Un exemple d'utilisation est celui de l'Intel 8008, le tout premier microprocesseur 8 bits commercialisé, où ce genre de compteurs étaient utilisés pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs en anneau et de Johnson (SISO)=== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ====Les compteurs en anneau : les compteurs ''one-hot''==== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ====Les compteurs de Johnson : les compteurs unaires==== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction de type SIPO/PISO=== D'autres compteurs sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur à rétroaction=== Un compteur à rétroaction est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> 6kopfr8odo0e52fsjjb56390j45lox5 768025 768024 2026-06-18T15:05:26Z Mewtow 31375 /* Les compteurs synchrones à propagation de retenue */ 768025 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les compteurs synchrones à propagation de retenue=== Il est intéressant d'étudier le circuit combinatoire qui incrémente le compteur. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Nous l'avions déjà abordé dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des demi-additionneurs les uns à la suite des autres. Un demi-additionneur additionne deux bits : un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=3|Compteur synchrone avec des bascules D.]] ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs de 4 bits peuvent même être des compteurs asynchrones, ce qui donne un compteur hybride entre synchrone et asynchrone. Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant une entrée en plus, indiquant que le compteur a atteint sa valeur maximale, appelée sortie ''Ripple carry out'' (RCO). La sortie en question est calculée avec une porte ET entre tous les bits du compteur pour un compteur synchrone. Si tous les bits du compteurs sont à 1, cela signifie que le compteur suivant doit être incrémenté au prochain cycle d'horloge. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] ==Les compteurs asynchrones== les '''compteurs asynchrones''' utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Pour simplifier les explications, nous allons les classer suivant le type de registre à décalage utilisé. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | (registre simple) || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. À l'exception de certains compteurs ''one-hot'' qui seront vu juste après, ces compteurs sont des '''compteurs à rétroaction'''. Un terme bien barbare pour dire que l'on boucle leur sortie sur leur entrée, parfois en insérant un circuit combinatoire entre les deux. Ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. En conséquence, on peut les réinitialiser, mais pas insérer une valeur dans le compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Un exemple d'utilisation est celui de l'Intel 8008, le tout premier microprocesseur 8 bits commercialisé, où ce genre de compteurs étaient utilisés pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs en anneau et de Johnson (SISO)=== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ====Les compteurs en anneau : les compteurs ''one-hot''==== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ====Les compteurs de Johnson : les compteurs unaires==== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction de type SIPO/PISO=== D'autres compteurs sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur à rétroaction=== Un compteur à rétroaction est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> 27woqw66h49ohv8epyhjw4hm3t5fdzo 768026 768025 2026-06-18T15:05:49Z Mewtow 31375 /* Les compteurs synchrones à propagation de retenue */ 768026 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les compteurs synchrones à base d'incrémenteurs=== Il est intéressant d'étudier le circuit combinatoire qui incrémente le compteur. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Nous l'avions déjà abordé dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des demi-additionneurs les uns à la suite des autres. Un demi-additionneur additionne deux bits : un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=3|Compteur synchrone avec des bascules D.]] ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs de 4 bits peuvent même être des compteurs asynchrones, ce qui donne un compteur hybride entre synchrone et asynchrone. Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant une entrée en plus, indiquant que le compteur a atteint sa valeur maximale, appelée sortie ''Ripple carry out'' (RCO). La sortie en question est calculée avec une porte ET entre tous les bits du compteur pour un compteur synchrone. Si tous les bits du compteurs sont à 1, cela signifie que le compteur suivant doit être incrémenté au prochain cycle d'horloge. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] ==Les compteurs asynchrones== les '''compteurs asynchrones''' utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Pour simplifier les explications, nous allons les classer suivant le type de registre à décalage utilisé. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | (registre simple) || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. À l'exception de certains compteurs ''one-hot'' qui seront vu juste après, ces compteurs sont des '''compteurs à rétroaction'''. Un terme bien barbare pour dire que l'on boucle leur sortie sur leur entrée, parfois en insérant un circuit combinatoire entre les deux. Ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. En conséquence, on peut les réinitialiser, mais pas insérer une valeur dans le compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Un exemple d'utilisation est celui de l'Intel 8008, le tout premier microprocesseur 8 bits commercialisé, où ce genre de compteurs étaient utilisés pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs en anneau et de Johnson (SISO)=== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ====Les compteurs en anneau : les compteurs ''one-hot''==== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ====Les compteurs de Johnson : les compteurs unaires==== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction de type SIPO/PISO=== D'autres compteurs sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur à rétroaction=== Un compteur à rétroaction est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> avmzevvpneiqj7tr1h95drvk8rtbyom 768027 768026 2026-06-18T15:07:18Z Mewtow 31375 /* Les compteurs synchrones à base d'incrémenteurs */ 768027 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les compteurs synchrones à base d'incrémenteurs=== Il est intéressant d'étudier le circuit combinatoire qui incrémente le compteur. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Nous l'avions déjà abordé dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des demi-additionneurs les uns à la suite des autres. Un demi-additionneur additionne deux bits : un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=3|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs de 4 bits peuvent même être des compteurs asynchrones, ce qui donne un compteur hybride entre synchrone et asynchrone. Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant une entrée en plus, indiquant que le compteur a atteint sa valeur maximale, appelée sortie ''Ripple carry out'' (RCO). La sortie en question est calculée avec une porte ET entre tous les bits du compteur pour un compteur synchrone. Si tous les bits du compteurs sont à 1, cela signifie que le compteur suivant doit être incrémenté au prochain cycle d'horloge. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] ==Les compteurs asynchrones== les '''compteurs asynchrones''' utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Pour simplifier les explications, nous allons les classer suivant le type de registre à décalage utilisé. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | (registre simple) || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. À l'exception de certains compteurs ''one-hot'' qui seront vu juste après, ces compteurs sont des '''compteurs à rétroaction'''. Un terme bien barbare pour dire que l'on boucle leur sortie sur leur entrée, parfois en insérant un circuit combinatoire entre les deux. Ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. En conséquence, on peut les réinitialiser, mais pas insérer une valeur dans le compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Un exemple d'utilisation est celui de l'Intel 8008, le tout premier microprocesseur 8 bits commercialisé, où ce genre de compteurs étaient utilisés pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs en anneau et de Johnson (SISO)=== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ====Les compteurs en anneau : les compteurs ''one-hot''==== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ====Les compteurs de Johnson : les compteurs unaires==== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction de type SIPO/PISO=== D'autres compteurs sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur à rétroaction=== Un compteur à rétroaction est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> bwm77eecgoqsalvlg7cysainre5s5ir 768028 768027 2026-06-18T15:10:18Z Mewtow 31375 /* Les compteurs synchrones à base d'incrémenteurs */ 768028 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les compteurs synchrones à base d'incrémenteurs=== Il est intéressant d'étudier le circuit combinatoire qui incrémente le compteur. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Nous l'avions déjà abordé dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=3|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs de 4 bits peuvent même être des compteurs asynchrones, ce qui donne un compteur hybride entre synchrone et asynchrone. Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant une entrée en plus, indiquant que le compteur a atteint sa valeur maximale, appelée sortie ''Ripple carry out'' (RCO). La sortie en question est calculée avec une porte ET entre tous les bits du compteur pour un compteur synchrone. Si tous les bits du compteurs sont à 1, cela signifie que le compteur suivant doit être incrémenté au prochain cycle d'horloge. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] ==Les compteurs asynchrones== les '''compteurs asynchrones''' utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Pour simplifier les explications, nous allons les classer suivant le type de registre à décalage utilisé. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | (registre simple) || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. À l'exception de certains compteurs ''one-hot'' qui seront vu juste après, ces compteurs sont des '''compteurs à rétroaction'''. Un terme bien barbare pour dire que l'on boucle leur sortie sur leur entrée, parfois en insérant un circuit combinatoire entre les deux. Ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. En conséquence, on peut les réinitialiser, mais pas insérer une valeur dans le compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Un exemple d'utilisation est celui de l'Intel 8008, le tout premier microprocesseur 8 bits commercialisé, où ce genre de compteurs étaient utilisés pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs en anneau et de Johnson (SISO)=== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ====Les compteurs en anneau : les compteurs ''one-hot''==== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ====Les compteurs de Johnson : les compteurs unaires==== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction de type SIPO/PISO=== D'autres compteurs sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur à rétroaction=== Un compteur à rétroaction est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> l5ox6vo1urjcunhbjtwln9zhev1vlda 768029 768028 2026-06-18T15:10:40Z Mewtow 31375 /* Les compteurs synchrones à base d'incrémenteurs */ 768029 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les compteurs synchrones à base d'incrémenteurs=== Il est intéressant d'étudier le circuit combinatoire qui incrémente le compteur. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Nous l'avions déjà abordé dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs de 4 bits peuvent même être des compteurs asynchrones, ce qui donne un compteur hybride entre synchrone et asynchrone. Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant une entrée en plus, indiquant que le compteur a atteint sa valeur maximale, appelée sortie ''Ripple carry out'' (RCO). La sortie en question est calculée avec une porte ET entre tous les bits du compteur pour un compteur synchrone. Si tous les bits du compteurs sont à 1, cela signifie que le compteur suivant doit être incrémenté au prochain cycle d'horloge. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] ==Les compteurs asynchrones== les '''compteurs asynchrones''' utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Pour simplifier les explications, nous allons les classer suivant le type de registre à décalage utilisé. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | (registre simple) || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. À l'exception de certains compteurs ''one-hot'' qui seront vu juste après, ces compteurs sont des '''compteurs à rétroaction'''. Un terme bien barbare pour dire que l'on boucle leur sortie sur leur entrée, parfois en insérant un circuit combinatoire entre les deux. Ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. En conséquence, on peut les réinitialiser, mais pas insérer une valeur dans le compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Un exemple d'utilisation est celui de l'Intel 8008, le tout premier microprocesseur 8 bits commercialisé, où ce genre de compteurs étaient utilisés pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs en anneau et de Johnson (SISO)=== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ====Les compteurs en anneau : les compteurs ''one-hot''==== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ====Les compteurs de Johnson : les compteurs unaires==== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction de type SIPO/PISO=== D'autres compteurs sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur à rétroaction=== Un compteur à rétroaction est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> 9qny3k7i6kber81vpf5w02kjd6n6awi 768030 768029 2026-06-18T15:14:10Z Mewtow 31375 /* Les compteurs en cascade */ 768030 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les compteurs synchrones à base d'incrémenteurs=== Il est intéressant d'étudier le circuit combinatoire qui incrémente le compteur. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Nous l'avions déjà abordé dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs de 4 bits peuvent même être des compteurs asynchrones, ce qui donne un compteur hybride entre synchrone et asynchrone. Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. Pour la retenue sortante, elle indique que le compteur déborde et fournit la retenue pour le compteur suivant. La sortie associée est appelée sortie ''Ripple carry out'' (RCO). [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] ==Les compteurs asynchrones== les '''compteurs asynchrones''' utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Pour simplifier les explications, nous allons les classer suivant le type de registre à décalage utilisé. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | (registre simple) || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. À l'exception de certains compteurs ''one-hot'' qui seront vu juste après, ces compteurs sont des '''compteurs à rétroaction'''. Un terme bien barbare pour dire que l'on boucle leur sortie sur leur entrée, parfois en insérant un circuit combinatoire entre les deux. Ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. En conséquence, on peut les réinitialiser, mais pas insérer une valeur dans le compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Un exemple d'utilisation est celui de l'Intel 8008, le tout premier microprocesseur 8 bits commercialisé, où ce genre de compteurs étaient utilisés pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs en anneau et de Johnson (SISO)=== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ====Les compteurs en anneau : les compteurs ''one-hot''==== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ====Les compteurs de Johnson : les compteurs unaires==== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction de type SIPO/PISO=== D'autres compteurs sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur à rétroaction=== Un compteur à rétroaction est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> g3p3yk6mliubz94zs9b27283i2jxuaa 768031 768030 2026-06-18T15:15:20Z Mewtow 31375 /* Les compteurs en cascade */ 768031 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les compteurs synchrones à base d'incrémenteurs=== Il est intéressant d'étudier le circuit combinatoire qui incrémente le compteur. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Nous l'avions déjà abordé dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ==Les compteurs asynchrones== les '''compteurs asynchrones''' utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Pour simplifier les explications, nous allons les classer suivant le type de registre à décalage utilisé. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | (registre simple) || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. À l'exception de certains compteurs ''one-hot'' qui seront vu juste après, ces compteurs sont des '''compteurs à rétroaction'''. Un terme bien barbare pour dire que l'on boucle leur sortie sur leur entrée, parfois en insérant un circuit combinatoire entre les deux. Ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. En conséquence, on peut les réinitialiser, mais pas insérer une valeur dans le compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Un exemple d'utilisation est celui de l'Intel 8008, le tout premier microprocesseur 8 bits commercialisé, où ce genre de compteurs étaient utilisés pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs en anneau et de Johnson (SISO)=== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ====Les compteurs en anneau : les compteurs ''one-hot''==== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ====Les compteurs de Johnson : les compteurs unaires==== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction de type SIPO/PISO=== D'autres compteurs sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur à rétroaction=== Un compteur à rétroaction est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> qr7glsasj0jpzv5rlxq8gcicqt9yc4d 768032 768031 2026-06-18T15:16:54Z Mewtow 31375 /* Les compteurs en cascade */ 768032 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les compteurs synchrones à base d'incrémenteurs=== Il est intéressant d'étudier le circuit combinatoire qui incrémente le compteur. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Nous l'avions déjà abordé dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ==Les compteurs asynchrones== les '''compteurs asynchrones''' utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Pour simplifier les explications, nous allons les classer suivant le type de registre à décalage utilisé. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | (registre simple) || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. À l'exception de certains compteurs ''one-hot'' qui seront vu juste après, ces compteurs sont des '''compteurs à rétroaction'''. Un terme bien barbare pour dire que l'on boucle leur sortie sur leur entrée, parfois en insérant un circuit combinatoire entre les deux. Ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. En conséquence, on peut les réinitialiser, mais pas insérer une valeur dans le compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Un exemple d'utilisation est celui de l'Intel 8008, le tout premier microprocesseur 8 bits commercialisé, où ce genre de compteurs étaient utilisés pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs en anneau et de Johnson (SISO)=== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ====Les compteurs en anneau : les compteurs ''one-hot''==== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ====Les compteurs de Johnson : les compteurs unaires==== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction de type SIPO/PISO=== D'autres compteurs sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur à rétroaction=== Un compteur à rétroaction est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> bgbys7iqh2sy3h0kw1qamizck42l8ya 768034 768032 2026-06-18T15:18:49Z Mewtow 31375 /* Les compteurs synchrones */ 768034 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. ===Les compteurs synchrones à base d'incrémenteurs=== Il est intéressant d'étudier le circuit combinatoire qui incrémente le compteur. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Nous l'avions déjà abordé dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs synchrones modulo=== Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ==Les compteurs asynchrones== les '''compteurs asynchrones''' utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Pour simplifier les explications, nous allons les classer suivant le type de registre à décalage utilisé. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | (registre simple) || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. À l'exception de certains compteurs ''one-hot'' qui seront vu juste après, ces compteurs sont des '''compteurs à rétroaction'''. Un terme bien barbare pour dire que l'on boucle leur sortie sur leur entrée, parfois en insérant un circuit combinatoire entre les deux. Ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. En conséquence, on peut les réinitialiser, mais pas insérer une valeur dans le compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Un exemple d'utilisation est celui de l'Intel 8008, le tout premier microprocesseur 8 bits commercialisé, où ce genre de compteurs étaient utilisés pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs en anneau et de Johnson (SISO)=== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ====Les compteurs en anneau : les compteurs ''one-hot''==== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ====Les compteurs de Johnson : les compteurs unaires==== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction de type SIPO/PISO=== D'autres compteurs sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur à rétroaction=== Un compteur à rétroaction est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> 6bklqmmvtaj6zijn22brda2cm6sg04e 768035 768034 2026-06-18T15:30:57Z Mewtow 31375 768035 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. ===Les compteurs synchrones à base d'incrémenteurs=== Il est intéressant d'étudier le circuit combinatoire qui incrémente le compteur. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Nous l'avions déjà abordé dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs synchrones modulo=== Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Pour simplifier les explications, nous allons les classer suivant le type de registre à décalage utilisé. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | (registre simple) || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. ===Les compteurs asynchrones=== Les '''compteurs asynchrones''' sont des compteurs fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ===Les compteurs en anneau et de Johnson (SISO)=== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ====Les compteurs en anneau : les compteurs ''one-hot''==== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ====Les compteurs de Johnson : les compteurs unaires==== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction de type SIPO/PISO=== D'autres compteurs sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur à rétroaction=== Un compteur à rétroaction est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> 4sa9og1cxnwku9rmh905to1s8d04d91 768036 768035 2026-06-18T15:31:58Z Mewtow 31375 /* Les registres à décalage à rétroaction de type SIPO/PISO */ 768036 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. ===Les compteurs synchrones à base d'incrémenteurs=== Il est intéressant d'étudier le circuit combinatoire qui incrémente le compteur. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Nous l'avions déjà abordé dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs synchrones modulo=== Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Pour simplifier les explications, nous allons les classer suivant le type de registre à décalage utilisé. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | (registre simple) || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. ===Les compteurs asynchrones=== Les '''compteurs asynchrones''' sont des compteurs fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ===Les compteurs en anneau et de Johnson (SISO)=== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ====Les compteurs en anneau : les compteurs ''one-hot''==== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ====Les compteurs de Johnson : les compteurs unaires==== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction=== Les '''compteurs à rétroaction''' sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur à rétroaction=== Un compteur à rétroaction est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> 4psfxaj1fv4obsix75mvsehv4yamblb 768037 768036 2026-06-18T15:32:43Z Mewtow 31375 768037 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. Il existe des compteurs qui conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Un exemple d'utilisation est celui de l'Intel 8008, le tout premier microprocesseur 8 bits commercialisé, où ce genre de compteurs étaient utilisés pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. ===Les compteurs synchrones à base d'incrémenteurs=== Il est intéressant d'étudier le circuit combinatoire qui incrémente le compteur. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Nous l'avions déjà abordé dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs synchrones modulo=== Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Pour simplifier les explications, nous allons les classer suivant le type de registre à décalage utilisé. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | (registre simple) || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. ===Les compteurs asynchrones=== Les '''compteurs asynchrones''' sont des compteurs fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ===Les compteurs en anneau et de Johnson (SISO)=== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ====Les compteurs en anneau : les compteurs ''one-hot''==== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ====Les compteurs de Johnson : les compteurs unaires==== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction=== Les '''compteurs à rétroaction''' sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur à rétroaction=== Un compteur à rétroaction est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> pdna6rhfylhu5iuvo0ijxgki60qywf3 768038 768037 2026-06-18T15:33:22Z Mewtow 31375 /* Les compteurs asynchrones */ 768038 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. Il existe des compteurs qui conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Un exemple d'utilisation est celui de l'Intel 8008, le tout premier microprocesseur 8 bits commercialisé, où ce genre de compteurs étaient utilisés pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. ===Les compteurs synchrones à base d'incrémenteurs=== Il est intéressant d'étudier le circuit combinatoire qui incrémente le compteur. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Nous l'avions déjà abordé dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs synchrones modulo=== Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Pour simplifier les explications, nous allons les classer suivant le type de registre à décalage utilisé. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | (registre simple) || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. ===Les compteurs asynchrones (SIPO)=== Les '''compteurs asynchrones''' sont des compteurs fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ===Les compteurs en anneau et de Johnson (SISO)=== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ====Les compteurs en anneau : les compteurs ''one-hot''==== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ====Les compteurs de Johnson : les compteurs unaires==== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction=== Les '''compteurs à rétroaction''' sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur à rétroaction=== Un compteur à rétroaction est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> kw4vj784xsxq45n5yhpmem1g0r4498q 768039 768038 2026-06-18T15:33:32Z Mewtow 31375 /* Les compteurs asynchrones (SIPO) */ 768039 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. Il existe des compteurs qui conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Un exemple d'utilisation est celui de l'Intel 8008, le tout premier microprocesseur 8 bits commercialisé, où ce genre de compteurs étaient utilisés pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. ===Les compteurs synchrones à base d'incrémenteurs=== Il est intéressant d'étudier le circuit combinatoire qui incrémente le compteur. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Nous l'avions déjà abordé dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs synchrones modulo=== Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Pour simplifier les explications, nous allons les classer suivant le type de registre à décalage utilisé. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | (registre simple) || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. ===Les compteurs asynchrones (SIPO ou PIPO)=== Les '''compteurs asynchrones''' sont des compteurs fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ===Les compteurs en anneau et de Johnson (SISO)=== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ====Les compteurs en anneau : les compteurs ''one-hot''==== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ====Les compteurs de Johnson : les compteurs unaires==== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction=== Les '''compteurs à rétroaction''' sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur à rétroaction=== Un compteur à rétroaction est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> 9npq0l0vgexoozhwlvgu5aybvoxlco8 768040 768039 2026-06-18T15:33:54Z Mewtow 31375 /* Les compteurs basés sur des registres à décalage */ 768040 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. Il existe des compteurs qui conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Un exemple d'utilisation est celui de l'Intel 8008, le tout premier microprocesseur 8 bits commercialisé, où ce genre de compteurs étaient utilisés pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. ===Les compteurs synchrones à base d'incrémenteurs=== Il est intéressant d'étudier le circuit combinatoire qui incrémente le compteur. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Nous l'avions déjà abordé dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs synchrones modulo=== Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Pour simplifier les explications, nous allons les classer suivant le type de registre à décalage utilisé. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | PIPO || SIPO |- ! Sortie série | PISO || SISO |} ===Les compteurs asynchrones (SIPO ou PIPO)=== Les '''compteurs asynchrones''' sont des compteurs fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ===Les compteurs en anneau et de Johnson (SISO)=== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ====Les compteurs en anneau : les compteurs ''one-hot''==== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ====Les compteurs de Johnson : les compteurs unaires==== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction=== Les '''compteurs à rétroaction''' sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur à rétroaction=== Un compteur à rétroaction est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> dm4c402n03fxu8yni9c18avvk9oki0t 768041 768040 2026-06-18T15:36:43Z Mewtow 31375 768041 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. ===Les compteurs synchrones à base d'incrémenteurs=== Il est intéressant d'étudier le circuit combinatoire qui incrémente le compteur. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Nous l'avions déjà abordé dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs synchrones modulo=== Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Pour simplifier les explications, nous allons les classer suivant le type de registre à décalage utilisé. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | PIPO || SIPO |- ! Sortie série | PISO || SISO |} ===Les compteurs asynchrones (SIPO ou PIPO)=== Les '''compteurs asynchrones''' sont des compteurs fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ===Les compteurs en anneau et de Johnson (SISO)=== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ====Les compteurs en anneau : les compteurs ''one-hot''==== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ====Les compteurs de Johnson : les compteurs unaires==== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction=== Les '''compteurs à rétroaction''' sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur à rétroaction=== Un compteur à rétroaction est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> 4evvkl5hfzc074jvc5vrry8bfcsmmjh 768042 768041 2026-06-18T15:38:50Z Mewtow 31375 /* Les compteurs basés sur des registres à décalage */ 768042 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. ===Les compteurs synchrones à base d'incrémenteurs=== Il est intéressant d'étudier le circuit combinatoire qui incrémente le compteur. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Nous l'avions déjà abordé dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs synchrones modulo=== Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Pour simplifier les explications, nous allons les classer suivant le type de registre à décalage utilisé. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | PIPO || SIPO |- ! Sortie série | PISO || SISO |} Les compteurs à registres à décalage peuvent se classer en deux sous-types. Les premiers sont des compteurs classiques, qui comptent de 0 à <math>2^n-1</math>, éventuellement des compteurs modulo. Leur pas est de 1, leur contenu est incrémenté à chaque cycle d'horloge. Ils portent le nom de '''compteurs asynchrones'''. Le second type n'a pas de pas proprement dit. A la place, ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle. Un exemple d'utilisation est celui de l'Intel 8008, le tout premier microprocesseur 8 bits commercialisé, où ce genre de compteurs étaient utilisés pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs asynchrones (SIPO ou PIPO)=== Les '''compteurs asynchrones''' sont des compteurs fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ===Les compteurs en anneau et de Johnson (SISO)=== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ====Les compteurs en anneau : les compteurs ''one-hot''==== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ====Les compteurs de Johnson : les compteurs unaires==== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction=== Les '''compteurs à rétroaction''' sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur à rétroaction=== Un compteur à rétroaction est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> scsav5g9s9juojhqtqqdjdw9sf5jjcd 768043 768042 2026-06-18T15:39:31Z Mewtow 31375 /* Les compteurs basés sur des registres à décalage */ 768043 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. ===Les compteurs synchrones à base d'incrémenteurs=== Il est intéressant d'étudier le circuit combinatoire qui incrémente le compteur. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Nous l'avions déjà abordé dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs synchrones modulo=== Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Pour simplifier les explications, nous allons les classer suivant le type de registre à décalage utilisé. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | PIPO || SIPO |- ! Sortie série | PISO || SISO |} Les compteurs à registres à décalage peuvent se classer en deux sous-types. Les premiers sont des compteurs classiques, qui comptent de 0 à <math>2^n-1</math>, éventuellement des compteurs modulo. Leur pas est de 1, leur contenu est incrémenté à chaque cycle d'horloge. Ils portent le nom de '''compteurs asynchrones'''. Le second type n'a pas de pas proprement dit. A la place, ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle. Pour l'anecdote, le processeur Intel 8008, le tout premier microprocesseur 8 bits commercialisé, a utilisé ce genre de compteurs pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs asynchrones (SIPO ou PIPO)=== Les '''compteurs asynchrones''' sont des compteurs fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ===Les compteurs en anneau et de Johnson (SISO)=== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ====Les compteurs en anneau : les compteurs ''one-hot''==== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ====Les compteurs de Johnson : les compteurs unaires==== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction=== Les '''compteurs à rétroaction''' sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur à rétroaction=== Un compteur à rétroaction est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> cvw524uxhdyi833rc9zsqx27eepm2ec 768044 768043 2026-06-18T15:43:00Z Mewtow 31375 /* Les compteurs en anneau et de Johnson (SISO) */ 768044 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. ===Les compteurs synchrones à base d'incrémenteurs=== Il est intéressant d'étudier le circuit combinatoire qui incrémente le compteur. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Nous l'avions déjà abordé dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs synchrones modulo=== Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Pour simplifier les explications, nous allons les classer suivant le type de registre à décalage utilisé. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | PIPO || SIPO |- ! Sortie série | PISO || SISO |} Les compteurs à registres à décalage peuvent se classer en deux sous-types. Les premiers sont des compteurs classiques, qui comptent de 0 à <math>2^n-1</math>, éventuellement des compteurs modulo. Leur pas est de 1, leur contenu est incrémenté à chaque cycle d'horloge. Ils portent le nom de '''compteurs asynchrones'''. Le second type n'a pas de pas proprement dit. A la place, ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle. Pour l'anecdote, le processeur Intel 8008, le tout premier microprocesseur 8 bits commercialisé, a utilisé ce genre de compteurs pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs asynchrones (SIPO ou PIPO)=== Les '''compteurs asynchrones''' sont des compteurs fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ===Les compteurs en anneau : les compteurs ''one-hot''=== Les '''compteurs en anneau''' sont appelés ainsi car le bit qui entre dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. Voyons d'abord les compteurs ''one-hot''. Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ===Les compteurs de Johnson : les compteurs unaires=== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction=== Les '''compteurs à rétroaction''' sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur à rétroaction=== Un compteur à rétroaction est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> 7am0u2fyo89mq99aypxabxat8kdiu1v 768045 768044 2026-06-18T15:43:15Z Mewtow 31375 /* Les compteurs basés sur des registres à décalage */ 768045 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. ===Les compteurs synchrones à base d'incrémenteurs=== Il est intéressant d'étudier le circuit combinatoire qui incrémente le compteur. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Nous l'avions déjà abordé dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs synchrones modulo=== Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Les compteurs à registres à décalage peuvent se classer en deux sous-types. Les premiers sont des compteurs classiques, qui comptent de 0 à <math>2^n-1</math>, éventuellement des compteurs modulo. Leur pas est de 1, leur contenu est incrémenté à chaque cycle d'horloge. Ils portent le nom de '''compteurs asynchrones'''. Le second type n'a pas de pas proprement dit. A la place, ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle. Pour l'anecdote, le processeur Intel 8008, le tout premier microprocesseur 8 bits commercialisé, a utilisé ce genre de compteurs pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs asynchrones (SIPO ou PIPO)=== Les '''compteurs asynchrones''' sont des compteurs fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ===Les compteurs en anneau : les compteurs ''one-hot''=== Les '''compteurs en anneau''' sont appelés ainsi car le bit qui entre dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. Voyons d'abord les compteurs ''one-hot''. Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ===Les compteurs de Johnson : les compteurs unaires=== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction=== Les '''compteurs à rétroaction''' sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur à rétroaction=== Un compteur à rétroaction est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> 0bb825utb7ttt9lyxrnjvb64o1hhe71 768046 768045 2026-06-18T15:43:32Z Mewtow 31375 /* Les registres à décalage à rétroaction */ 768046 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. ===Les compteurs synchrones à base d'incrémenteurs=== Il est intéressant d'étudier le circuit combinatoire qui incrémente le compteur. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Nous l'avions déjà abordé dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs synchrones modulo=== Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Les compteurs à registres à décalage peuvent se classer en deux sous-types. Les premiers sont des compteurs classiques, qui comptent de 0 à <math>2^n-1</math>, éventuellement des compteurs modulo. Leur pas est de 1, leur contenu est incrémenté à chaque cycle d'horloge. Ils portent le nom de '''compteurs asynchrones'''. Le second type n'a pas de pas proprement dit. A la place, ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle. Pour l'anecdote, le processeur Intel 8008, le tout premier microprocesseur 8 bits commercialisé, a utilisé ce genre de compteurs pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs asynchrones (SIPO ou PIPO)=== Les '''compteurs asynchrones''' sont des compteurs fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ===Les compteurs en anneau : les compteurs ''one-hot''=== Les '''compteurs en anneau''' sont appelés ainsi car le bit qui entre dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. Voyons d'abord les compteurs ''one-hot''. Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ===Les compteurs de Johnson : les compteurs unaires=== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction=== Pour simplifier les explications qui vont suivre, nous allons les classer suivant le type de registre à décalage utilisé. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | PIPO || SIPO |- ! Sortie série | PISO || SISO |} Les '''compteurs à rétroaction''' sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur à rétroaction=== Un compteur à rétroaction est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> ab70rrmot2kyh2iyyyci2atprpocrcn 768047 768046 2026-06-18T15:43:52Z Mewtow 31375 /* Les registres à décalage à rétroaction */ 768047 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. ===Les compteurs synchrones à base d'incrémenteurs=== Il est intéressant d'étudier le circuit combinatoire qui incrémente le compteur. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Nous l'avions déjà abordé dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs synchrones modulo=== Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Les compteurs à registres à décalage peuvent se classer en deux sous-types. Les premiers sont des compteurs classiques, qui comptent de 0 à <math>2^n-1</math>, éventuellement des compteurs modulo. Leur pas est de 1, leur contenu est incrémenté à chaque cycle d'horloge. Ils portent le nom de '''compteurs asynchrones'''. Le second type n'a pas de pas proprement dit. A la place, ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle. Pour l'anecdote, le processeur Intel 8008, le tout premier microprocesseur 8 bits commercialisé, a utilisé ce genre de compteurs pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs asynchrones (SIPO ou PIPO)=== Les '''compteurs asynchrones''' sont des compteurs fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ===Les compteurs en anneau : les compteurs ''one-hot''=== Les '''compteurs en anneau''' sont appelés ainsi car le bit qui entre dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. Voyons d'abord les compteurs ''one-hot''. Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ===Les compteurs de Johnson : les compteurs unaires=== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction=== Pour simplifier les explications qui vont suivre, nous allons faire un rappel sur les types de registre à décalage. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | PIPO || SIPO |- ! Sortie série | PISO || SISO |} Les '''compteurs à rétroaction''' sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur à rétroaction=== Un compteur à rétroaction est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> 7xn43hwc9gj0xu88fvwpq0ngnfj5fui 768048 768047 2026-06-18T15:44:28Z Mewtow 31375 /* La période d'un compteur à rétroaction */ 768048 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. ===Les compteurs synchrones à base d'incrémenteurs=== Il est intéressant d'étudier le circuit combinatoire qui incrémente le compteur. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Nous l'avions déjà abordé dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs synchrones modulo=== Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Les compteurs à registres à décalage peuvent se classer en deux sous-types. Les premiers sont des compteurs classiques, qui comptent de 0 à <math>2^n-1</math>, éventuellement des compteurs modulo. Leur pas est de 1, leur contenu est incrémenté à chaque cycle d'horloge. Ils portent le nom de '''compteurs asynchrones'''. Le second type n'a pas de pas proprement dit. A la place, ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle. Pour l'anecdote, le processeur Intel 8008, le tout premier microprocesseur 8 bits commercialisé, a utilisé ce genre de compteurs pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs asynchrones (SIPO ou PIPO)=== Les '''compteurs asynchrones''' sont des compteurs fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ===Les compteurs en anneau : les compteurs ''one-hot''=== Les '''compteurs en anneau''' sont appelés ainsi car le bit qui entre dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. Voyons d'abord les compteurs ''one-hot''. Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ===Les compteurs de Johnson : les compteurs unaires=== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction=== Pour simplifier les explications qui vont suivre, nous allons faire un rappel sur les types de registre à décalage. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | PIPO || SIPO |- ! Sortie série | PISO || SISO |} Les '''compteurs à rétroaction''' sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur=== Un compteur est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> 0n6q69m6zz761jtdjmafg3ohc6rh6a1 768049 768048 2026-06-18T15:45:37Z Mewtow 31375 /* Les compteurs basés sur des registres à décalage */ 768049 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. ===Les compteurs synchrones à base d'incrémenteurs=== Il est intéressant d'étudier le circuit combinatoire qui incrémente le compteur. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Nous l'avions déjà abordé dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs synchrones modulo=== Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Les compteurs à registres à décalage peuvent se classer en deux sous-types. Les premiers sont des compteurs classiques, qui comptent de 0 à <math>2^n-1</math>, éventuellement des compteurs modulo. Leur pas est de 1, leur contenu est incrémenté à chaque cycle d'horloge. Ils portent le nom de '''compteurs asynchrones'''. Le second type n'a pas de pas proprement dit. A la place, ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle. Pour l'anecdote, le processeur Intel 8008, le tout premier microprocesseur 8 bits commercialisé, a utilisé ce genre de compteurs pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. : Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs asynchrones (SIPO ou PIPO)=== Les '''compteurs asynchrones''' sont des compteurs fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ===Les compteurs en anneau : les compteurs ''one-hot''=== Les '''compteurs en anneau''' sont appelés ainsi car le bit qui entre dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un '''compteur ''one-hot'''''. La seconde possibilité, où le bit sortant est inversé, donne un '''compteur de Johnson'''. Les deux sont très différents, et ne fonctionnent pas du tout pareil. Voyons d'abord les compteurs ''one-hot''. Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage SISO dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ===Les compteurs de Johnson : les compteurs unaires=== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction=== Pour simplifier les explications qui vont suivre, nous allons faire un rappel sur les types de registre à décalage. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | PIPO || SIPO |- ! Sortie série | PISO || SISO |} Les '''compteurs à rétroaction''' sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur=== Un compteur est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> qzcvm7va60i1c1cid4wucm1avscmcsw 768050 768049 2026-06-18T15:46:33Z Mewtow 31375 /* Les compteurs en anneau : les compteurs one-hot */ 768050 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. ===Les compteurs synchrones à base d'incrémenteurs=== Il est intéressant d'étudier le circuit combinatoire qui incrémente le compteur. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Nous l'avions déjà abordé dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs synchrones modulo=== Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Les compteurs à registres à décalage peuvent se classer en deux sous-types. Les premiers sont des compteurs classiques, qui comptent de 0 à <math>2^n-1</math>, éventuellement des compteurs modulo. Leur pas est de 1, leur contenu est incrémenté à chaque cycle d'horloge. Ils portent le nom de '''compteurs asynchrones'''. Le second type n'a pas de pas proprement dit. A la place, ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle. Pour l'anecdote, le processeur Intel 8008, le tout premier microprocesseur 8 bits commercialisé, a utilisé ce genre de compteurs pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. : Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs asynchrones (SIPO ou PIPO)=== Les '''compteurs asynchrones''' sont des compteurs fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ===Les compteurs en anneau : les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ===Les compteurs de Johnson : les compteurs unaires=== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. ===Les registres à décalage à rétroaction=== Pour simplifier les explications qui vont suivre, nous allons faire un rappel sur les types de registre à décalage. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | PIPO || SIPO |- ! Sortie série | PISO || SISO |} Les '''compteurs à rétroaction''' sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur=== Un compteur est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> hbvi4a7rf1pk3stgn863piswg566xg7 768051 768050 2026-06-18T15:47:53Z Mewtow 31375 /* Les compteurs de Johnson : les compteurs unaires */ 768051 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. ===Les compteurs synchrones à base d'incrémenteurs=== Il est intéressant d'étudier le circuit combinatoire qui incrémente le compteur. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Nous l'avions déjà abordé dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs synchrones modulo=== Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Les compteurs à registres à décalage peuvent se classer en deux sous-types. Les premiers sont des compteurs classiques, qui comptent de 0 à <math>2^n-1</math>, éventuellement des compteurs modulo. Leur pas est de 1, leur contenu est incrémenté à chaque cycle d'horloge. Ils portent le nom de '''compteurs asynchrones'''. Le second type n'a pas de pas proprement dit. A la place, ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle. Pour l'anecdote, le processeur Intel 8008, le tout premier microprocesseur 8 bits commercialisé, a utilisé ce genre de compteurs pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. : Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs asynchrones (SIPO ou PIPO)=== Les '''compteurs asynchrones''' sont des compteurs fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ===Les compteurs en anneau : les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ===Les compteurs de Johnson : les compteurs unaires=== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. [[File:A simple sinusoid generator.jpg|centre|vignette|upright=2|Générateur de sinusoïde avec un compteur de Johnson.]] ===Les registres à décalage à rétroaction=== Pour simplifier les explications qui vont suivre, nous allons faire un rappel sur les types de registre à décalage. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | PIPO || SIPO |- ! Sortie série | PISO || SISO |} Les '''compteurs à rétroaction''' sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur=== Un compteur est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> 3vuf2p916yggs39wwdazca2tq06ys6l 768052 768051 2026-06-18T15:48:09Z Mewtow 31375 /* Les compteurs de Johnson : les compteurs unaires */ 768052 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise donc un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. Le cas le plus fréquent est un pas fixe de 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels compteurs à pas variables ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. ===Les compteurs synchrones à base d'incrémenteurs=== Il est intéressant d'étudier le circuit combinatoire qui incrémente le compteur. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Nous l'avions déjà abordé dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs synchrones modulo=== Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Les compteurs à registres à décalage peuvent se classer en deux sous-types. Les premiers sont des compteurs classiques, qui comptent de 0 à <math>2^n-1</math>, éventuellement des compteurs modulo. Leur pas est de 1, leur contenu est incrémenté à chaque cycle d'horloge. Ils portent le nom de '''compteurs asynchrones'''. Le second type n'a pas de pas proprement dit. A la place, ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle. Pour l'anecdote, le processeur Intel 8008, le tout premier microprocesseur 8 bits commercialisé, a utilisé ce genre de compteurs pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. : Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs asynchrones (SIPO ou PIPO)=== Les '''compteurs asynchrones''' sont des compteurs fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ===Les compteurs en anneau : les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ===Les compteurs de Johnson : les compteurs unaires=== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. [[File:A simple sinusoid generator.jpg|centre|vignette|upright=2.5|Générateur de sinusoïde avec un compteur de Johnson.]] ===Les registres à décalage à rétroaction=== Pour simplifier les explications qui vont suivre, nous allons faire un rappel sur les types de registre à décalage. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | PIPO || SIPO |- ! Sortie série | PISO || SISO |} Les '''compteurs à rétroaction''' sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur=== Un compteur est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> dc4wsqxo386sq40rwpxxav5k9063p0e 768054 768052 2026-06-18T16:29:57Z Mewtow 31375 768054 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. ==Les compteurs/décompteurs : généralités== Vu de loin, un compteur a l'air d'être assez simple. Il mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Intuitivement, vous vous dites qu'un compteur compte de 1 en 1. Par exemple, si j'initialise un compteur à 0 et que je l'incrémente à chaque cycle d'horloge, il va me sortir la suite de nombre 0, 1, 2, 3, 4, etc. Les compteurs qui font cela sont appelés des '''compteurs à incrément''' (respectivement décrément pour les décompteurs). Et si je leur donne un tel nom, c'est car tous les compteurs ne fonctionnent pas comme ça. Il existe des compteurs qui comptent de deux en deux, de trois en trois, etc. Sur ces compteurs, le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. De tels compteurs sont appelés des compteurs à pas fixe. Notez qu'un compteur à incrément est un compteur à pas fixe où le pas est égal à 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels '''compteurs à pas variables''' ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. Enfin, il existe un dernier type de compteur, qui ne compte pas au sens commun du terme. A la place, ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle. Pour l'anecdote, le processeur Intel 8008, le tout premier microprocesseur 8 bits commercialisé, a utilisé ce genre de compteurs pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. : Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Le décompte, la taille et le pas d'un compteur=== Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] ===L'interface d'un compteur/décompteur=== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. ===Les compteurs synchrones à base d'incrémenteurs=== Il est intéressant d'étudier le circuit combinatoire qui incrémente le compteur. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Nous l'avions déjà abordé dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs synchrones modulo=== Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Les compteurs à registres à décalage peuvent se classer en deux sous-types. Les premiers sont des compteurs classiques, qui comptent de 0 à <math>2^n-1</math>, éventuellement des compteurs modulo. Leur pas est de 1, leur contenu est incrémenté à chaque cycle d'horloge. Ils portent le nom de '''compteurs asynchrones'''. ===Les compteurs asynchrones (SIPO ou PIPO)=== Les '''compteurs asynchrones''' sont des compteurs fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ===Les compteurs en anneau : les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ===Les compteurs de Johnson : les compteurs unaires=== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. [[File:A simple sinusoid generator.jpg|centre|vignette|upright=2.5|Générateur de sinusoïde avec un compteur de Johnson.]] ===Les registres à décalage à rétroaction=== Pour simplifier les explications qui vont suivre, nous allons faire un rappel sur les types de registre à décalage. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | PIPO || SIPO |- ! Sortie série | PISO || SISO |} Les '''compteurs à rétroaction''' sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur=== Un compteur est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> b5wwni2v3c0jpcgi6az76nhh1ytj1rp 768055 768054 2026-06-18T16:32:06Z Mewtow 31375 /* Le décompte, la taille et le pas d'un compteur */ 768055 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. ==Les compteurs/décompteurs : généralités== Vu de loin, un compteur a l'air d'être assez simple. Il mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Intuitivement, vous vous dites qu'un compteur compte de 1 en 1. Par exemple, si j'initialise un compteur à 0 et que je l'incrémente à chaque cycle d'horloge, il va me sortir la suite de nombre 0, 1, 2, 3, 4, etc. Les compteurs qui font cela sont appelés des '''compteurs à incrément''' (respectivement décrément pour les décompteurs). Et si je leur donne un tel nom, c'est car tous les compteurs ne fonctionnent pas comme ça. Il existe des compteurs qui comptent de deux en deux, de trois en trois, etc. Sur ces compteurs, le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. De tels compteurs sont appelés des compteurs à pas fixe. Notez qu'un compteur à incrément est un compteur à pas fixe où le pas est égal à 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels '''compteurs à pas variables''' ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. Enfin, il existe un dernier type de compteur, qui ne compte pas au sens commun du terme. A la place, ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle. Pour l'anecdote, le processeur Intel 8008, le tout premier microprocesseur 8 bits commercialisé, a utilisé ce genre de compteurs pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. : Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs à incréments et modulo=== Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs à incrément comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] ===L'interface d'un compteur/décompteur=== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. ===Les compteurs synchrones à base d'incrémenteurs=== Il est intéressant d'étudier le circuit combinatoire qui incrémente le compteur. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Nous l'avions déjà abordé dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs synchrones modulo=== Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Les compteurs à registres à décalage peuvent se classer en deux sous-types. Les premiers sont des compteurs classiques, qui comptent de 0 à <math>2^n-1</math>, éventuellement des compteurs modulo. Leur pas est de 1, leur contenu est incrémenté à chaque cycle d'horloge. Ils portent le nom de '''compteurs asynchrones'''. ===Les compteurs asynchrones (SIPO ou PIPO)=== Les '''compteurs asynchrones''' sont des compteurs fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ===Les compteurs en anneau : les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ===Les compteurs de Johnson : les compteurs unaires=== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. [[File:A simple sinusoid generator.jpg|centre|vignette|upright=2.5|Générateur de sinusoïde avec un compteur de Johnson.]] ===Les registres à décalage à rétroaction=== Pour simplifier les explications qui vont suivre, nous allons faire un rappel sur les types de registre à décalage. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | PIPO || SIPO |- ! Sortie série | PISO || SISO |} Les '''compteurs à rétroaction''' sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur=== Un compteur est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> h8bacgwzas3ape353k4nb7rr6ltvzgr 768056 768055 2026-06-18T16:32:25Z Mewtow 31375 /* Les compteurs/décompteurs : généralités */ 768056 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. ==Les compteurs/décompteurs : généralités== Vu de loin, un compteur a l'air d'être assez simple. Il mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. ===Les types de compteurs : à incrément, à pas fixe/variable=== Intuitivement, vous vous dites qu'un compteur compte de 1 en 1. Par exemple, si j'initialise un compteur à 0 et que je l'incrémente à chaque cycle d'horloge, il va me sortir la suite de nombre 0, 1, 2, 3, 4, etc. Les compteurs qui font cela sont appelés des '''compteurs à incrément''' (respectivement décrément pour les décompteurs). Et si je leur donne un tel nom, c'est car tous les compteurs ne fonctionnent pas comme ça. Il existe des compteurs qui comptent de deux en deux, de trois en trois, etc. Sur ces compteurs, le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. De tels compteurs sont appelés des compteurs à pas fixe. Notez qu'un compteur à incrément est un compteur à pas fixe où le pas est égal à 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels '''compteurs à pas variables''' ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. Enfin, il existe un dernier type de compteur, qui ne compte pas au sens commun du terme. A la place, ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle. Pour l'anecdote, le processeur Intel 8008, le tout premier microprocesseur 8 bits commercialisé, a utilisé ce genre de compteurs pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. : Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs à incréments et modulo=== Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs à incrément comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] ===L'interface d'un compteur/décompteur=== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. ===Les compteurs synchrones à base d'incrémenteurs=== Il est intéressant d'étudier le circuit combinatoire qui incrémente le compteur. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Nous l'avions déjà abordé dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs synchrones modulo=== Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Les compteurs à registres à décalage peuvent se classer en deux sous-types. Les premiers sont des compteurs classiques, qui comptent de 0 à <math>2^n-1</math>, éventuellement des compteurs modulo. Leur pas est de 1, leur contenu est incrémenté à chaque cycle d'horloge. Ils portent le nom de '''compteurs asynchrones'''. ===Les compteurs asynchrones (SIPO ou PIPO)=== Les '''compteurs asynchrones''' sont des compteurs fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ===Les compteurs en anneau : les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ===Les compteurs de Johnson : les compteurs unaires=== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. [[File:A simple sinusoid generator.jpg|centre|vignette|upright=2.5|Générateur de sinusoïde avec un compteur de Johnson.]] ===Les registres à décalage à rétroaction=== Pour simplifier les explications qui vont suivre, nous allons faire un rappel sur les types de registre à décalage. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | PIPO || SIPO |- ! Sortie série | PISO || SISO |} Les '''compteurs à rétroaction''' sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur=== Un compteur est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> qymahu1rwu3w3a3grtzv5voxcpc8t3p 768057 768056 2026-06-18T16:32:39Z Mewtow 31375 /* Les compteurs à incréments et modulo */ 768057 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. ==Les compteurs/décompteurs : généralités== Vu de loin, un compteur a l'air d'être assez simple. Il mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. ===Les types de compteurs : à incrément, à pas fixe/variable=== Intuitivement, vous vous dites qu'un compteur compte de 1 en 1. Par exemple, si j'initialise un compteur à 0 et que je l'incrémente à chaque cycle d'horloge, il va me sortir la suite de nombre 0, 1, 2, 3, 4, etc. Les compteurs qui font cela sont appelés des '''compteurs à incrément''' (respectivement décrément pour les décompteurs). Et si je leur donne un tel nom, c'est car tous les compteurs ne fonctionnent pas comme ça. Il existe des compteurs qui comptent de deux en deux, de trois en trois, etc. Sur ces compteurs, le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. De tels compteurs sont appelés des compteurs à pas fixe. Notez qu'un compteur à incrément est un compteur à pas fixe où le pas est égal à 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels '''compteurs à pas variables''' ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. Enfin, il existe un dernier type de compteur, qui ne compte pas au sens commun du terme. A la place, ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle. Pour l'anecdote, le processeur Intel 8008, le tout premier microprocesseur 8 bits commercialisé, a utilisé ce genre de compteurs pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. : Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===Les compteurs à incréments et modulo=== Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs à incrément comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ===L'interface d'un compteur/décompteur=== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. ===Les compteurs synchrones à base d'incrémenteurs=== Il est intéressant d'étudier le circuit combinatoire qui incrémente le compteur. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Nous l'avions déjà abordé dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs synchrones modulo=== Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Les compteurs à registres à décalage peuvent se classer en deux sous-types. Les premiers sont des compteurs classiques, qui comptent de 0 à <math>2^n-1</math>, éventuellement des compteurs modulo. Leur pas est de 1, leur contenu est incrémenté à chaque cycle d'horloge. Ils portent le nom de '''compteurs asynchrones'''. ===Les compteurs asynchrones (SIPO ou PIPO)=== Les '''compteurs asynchrones''' sont des compteurs fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ===Les compteurs en anneau : les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ===Les compteurs de Johnson : les compteurs unaires=== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. [[File:A simple sinusoid generator.jpg|centre|vignette|upright=2.5|Générateur de sinusoïde avec un compteur de Johnson.]] ===Les registres à décalage à rétroaction=== Pour simplifier les explications qui vont suivre, nous allons faire un rappel sur les types de registre à décalage. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | PIPO || SIPO |- ! Sortie série | PISO || SISO |} Les '''compteurs à rétroaction''' sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur=== Un compteur est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> 4hy3d2iz5egcfjd1v1onyfs8jr6b0o4 768058 768057 2026-06-18T16:32:55Z Mewtow 31375 /* Les compteurs à incréments et modulo */ 768058 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. ==Les compteurs/décompteurs : généralités== Vu de loin, un compteur a l'air d'être assez simple. Il mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. ===Les types de compteurs : à incrément, à pas fixe/variable=== Intuitivement, vous vous dites qu'un compteur compte de 1 en 1. Par exemple, si j'initialise un compteur à 0 et que je l'incrémente à chaque cycle d'horloge, il va me sortir la suite de nombre 0, 1, 2, 3, 4, etc. Les compteurs qui font cela sont appelés des '''compteurs à incrément''' (respectivement décrément pour les décompteurs). Et si je leur donne un tel nom, c'est car tous les compteurs ne fonctionnent pas comme ça. Il existe des compteurs qui comptent de deux en deux, de trois en trois, etc. Sur ces compteurs, le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. De tels compteurs sont appelés des compteurs à pas fixe. Notez qu'un compteur à incrément est un compteur à pas fixe où le pas est égal à 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels '''compteurs à pas variables''' ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. Enfin, il existe un dernier type de compteur, qui ne compte pas au sens commun du terme. A la place, ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle. Pour l'anecdote, le processeur Intel 8008, le tout premier microprocesseur 8 bits commercialisé, a utilisé ce genre de compteurs pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. : Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===La taille d'un compteur=== Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La plupart des compteurs à incrément comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ===L'interface d'un compteur/décompteur=== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. ===Les compteurs synchrones à base d'incrémenteurs=== Il est intéressant d'étudier le circuit combinatoire qui incrémente le compteur. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Nous l'avions déjà abordé dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs synchrones modulo=== Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Les compteurs à registres à décalage peuvent se classer en deux sous-types. Les premiers sont des compteurs classiques, qui comptent de 0 à <math>2^n-1</math>, éventuellement des compteurs modulo. Leur pas est de 1, leur contenu est incrémenté à chaque cycle d'horloge. Ils portent le nom de '''compteurs asynchrones'''. ===Les compteurs asynchrones (SIPO ou PIPO)=== Les '''compteurs asynchrones''' sont des compteurs fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ===Les compteurs en anneau : les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ===Les compteurs de Johnson : les compteurs unaires=== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. [[File:A simple sinusoid generator.jpg|centre|vignette|upright=2.5|Générateur de sinusoïde avec un compteur de Johnson.]] ===Les registres à décalage à rétroaction=== Pour simplifier les explications qui vont suivre, nous allons faire un rappel sur les types de registre à décalage. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | PIPO || SIPO |- ! Sortie série | PISO || SISO |} Les '''compteurs à rétroaction''' sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur=== Un compteur est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> pkgiqzgtmvgisqei9cqt8lmf21lgsf8 768059 768058 2026-06-18T16:33:26Z Mewtow 31375 /* La taille d'un compteur */ 768059 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. ==Les compteurs/décompteurs : généralités== Vu de loin, un compteur a l'air d'être assez simple. Il mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. ===Les types de compteurs : à incrément, à pas fixe/variable=== Intuitivement, vous vous dites qu'un compteur compte de 1 en 1. Par exemple, si j'initialise un compteur à 0 et que je l'incrémente à chaque cycle d'horloge, il va me sortir la suite de nombre 0, 1, 2, 3, 4, etc. Les compteurs qui font cela sont appelés des '''compteurs à incrément''' (respectivement décrément pour les décompteurs). Et si je leur donne un tel nom, c'est car tous les compteurs ne fonctionnent pas comme ça. Il existe des compteurs qui comptent de deux en deux, de trois en trois, etc. Sur ces compteurs, le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. De tels compteurs sont appelés des compteurs à pas fixe. Notez qu'un compteur à incrément est un compteur à pas fixe où le pas est égal à 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels '''compteurs à pas variables''' ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. Enfin, il existe un dernier type de compteur, qui ne compte pas au sens commun du terme. A la place, ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle. Pour l'anecdote, le processeur Intel 8008, le tout premier microprocesseur 8 bits commercialisé, a utilisé ce genre de compteurs pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. : Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===La taille d'un compteur=== Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. LA taille d'un compteur est surtout pertinente sur les compteurs à incrément, elle a moins de pertinence sur les autres compteurs. La plupart des compteurs à incrément comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ===L'interface d'un compteur/décompteur=== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. ===Les compteurs synchrones à base d'incrémenteurs=== Il est intéressant d'étudier le circuit combinatoire qui incrémente le compteur. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Nous l'avions déjà abordé dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs synchrones modulo=== Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Les compteurs à registres à décalage peuvent se classer en deux sous-types. Les premiers sont des compteurs classiques, qui comptent de 0 à <math>2^n-1</math>, éventuellement des compteurs modulo. Leur pas est de 1, leur contenu est incrémenté à chaque cycle d'horloge. Ils portent le nom de '''compteurs asynchrones'''. ===Les compteurs asynchrones (SIPO ou PIPO)=== Les '''compteurs asynchrones''' sont des compteurs fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ===Les compteurs en anneau : les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ===Les compteurs de Johnson : les compteurs unaires=== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. [[File:A simple sinusoid generator.jpg|centre|vignette|upright=2.5|Générateur de sinusoïde avec un compteur de Johnson.]] ===Les registres à décalage à rétroaction=== Pour simplifier les explications qui vont suivre, nous allons faire un rappel sur les types de registre à décalage. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | PIPO || SIPO |- ! Sortie série | PISO || SISO |} Les '''compteurs à rétroaction''' sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur=== Un compteur est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> qonwtzj5pwab6u49furz08qsg2jajf1 768060 768059 2026-06-18T16:33:44Z Mewtow 31375 /* La taille d'un compteur */ 768060 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. ==Les compteurs/décompteurs : généralités== Vu de loin, un compteur a l'air d'être assez simple. Il mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. ===Les types de compteurs : à incrément, à pas fixe/variable=== Intuitivement, vous vous dites qu'un compteur compte de 1 en 1. Par exemple, si j'initialise un compteur à 0 et que je l'incrémente à chaque cycle d'horloge, il va me sortir la suite de nombre 0, 1, 2, 3, 4, etc. Les compteurs qui font cela sont appelés des '''compteurs à incrément''' (respectivement décrément pour les décompteurs). Et si je leur donne un tel nom, c'est car tous les compteurs ne fonctionnent pas comme ça. Il existe des compteurs qui comptent de deux en deux, de trois en trois, etc. Sur ces compteurs, le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. De tels compteurs sont appelés des compteurs à pas fixe. Notez qu'un compteur à incrément est un compteur à pas fixe où le pas est égal à 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels '''compteurs à pas variables''' ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. Enfin, il existe un dernier type de compteur, qui ne compte pas au sens commun du terme. A la place, ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle. Pour l'anecdote, le processeur Intel 8008, le tout premier microprocesseur 8 bits commercialisé, a utilisé ce genre de compteurs pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. : Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===La taille d'un compteur=== Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La taille d'un compteur est surtout pertinente sur les compteurs à incrément, elle a moins de pertinence sur les autres compteurs. La plupart des compteurs à incrément comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ===L'interface d'un compteur/décompteur=== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. ===Les compteurs synchrones à base d'incrémenteurs=== Il est intéressant d'étudier le circuit combinatoire qui incrémente le compteur. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Nous l'avions déjà abordé dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs synchrones modulo=== Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Les compteurs à registres à décalage peuvent se classer en deux sous-types. Les premiers sont des compteurs classiques, qui comptent de 0 à <math>2^n-1</math>, éventuellement des compteurs modulo. Leur pas est de 1, leur contenu est incrémenté à chaque cycle d'horloge. Ils portent le nom de '''compteurs asynchrones'''. ===Les compteurs asynchrones (SIPO ou PIPO)=== Les '''compteurs asynchrones''' sont des compteurs fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ===Les compteurs en anneau : les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ===Les compteurs de Johnson : les compteurs unaires=== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. [[File:A simple sinusoid generator.jpg|centre|vignette|upright=2.5|Générateur de sinusoïde avec un compteur de Johnson.]] ===Les registres à décalage à rétroaction=== Pour simplifier les explications qui vont suivre, nous allons faire un rappel sur les types de registre à décalage. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | PIPO || SIPO |- ! Sortie série | PISO || SISO |} Les '''compteurs à rétroaction''' sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur=== Un compteur est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> tmy2zwk2wbkx6mhvjm0o7osegdwiag0 768061 768060 2026-06-18T16:34:40Z Mewtow 31375 /* Les types de compteurs : à incrément, à pas fixe/variable */ 768061 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. ==Les compteurs/décompteurs : généralités== Vu de loin, un compteur a l'air d'être assez simple. Il mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. ===Les types de compteurs : à incrément, à pas fixe/variable=== Intuitivement, vous vous dites qu'un compteur compte de 1 en 1. Par exemple, si j'initialise un compteur à 0 et que je l'incrémente à chaque cycle d'horloge, il va me sortir la suite de nombre 0, 1, 2, 3, 4, etc. Les compteurs qui font cela sont appelés des '''compteurs à incrément''' (respectivement décrément pour les décompteurs). Et si je leur donne un tel nom, c'est car tous les compteurs ne fonctionnent pas comme ça. Il existe des compteurs qui comptent de deux en deux, de trois en trois, etc. Sur ces compteurs, le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. De tels compteurs sont appelés des compteurs à pas fixe. Notez qu'un compteur à incrément est un compteur à pas fixe où le pas est égal à 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels '''compteurs à pas variables''' ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. Nous ne parlerons cependant pas de tels compteurs à pas variables dans ce qui suit. Enfin, il existe un dernier type de compteur, qui ne compte pas au sens commun du terme. A la place, ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle. Pour l'anecdote, le processeur Intel 8008, le tout premier microprocesseur 8 bits commercialisé, a utilisé ce genre de compteurs pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. : Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===La taille d'un compteur=== Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La taille d'un compteur est surtout pertinente sur les compteurs à incrément, elle a moins de pertinence sur les autres compteurs. La plupart des compteurs à incrément comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ===L'interface d'un compteur/décompteur=== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==Les compteurs synchrones== Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les compteurs asynchrones qui se passent du circuit combinatoire pour incrémenter/décrémenter le compteur, et nous les aborderons dans ce qui suit. Ce qui suit immédiatement vaut aussi bien pour les compteurs synchrones qu'asynchrones. ===Les compteurs synchrones à base d'incrémenteurs=== Il est intéressant d'étudier le circuit combinatoire qui incrémente le compteur. En général, il s'agit d'un circuit qui effectue des additions et/ou soustractions. Mais dans le cas où le pas du compteur est de 1, il s'agit d'un circuit simplifié, appelé un '''incrémenteur'''. Il incrémente le décompte de 1 à chaque demande d'incrémentation, le décrémente pour un décrémenteur. Nous l'avions déjà abordé dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs synchrones modulo=== Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Les compteurs à registres à décalage peuvent se classer en deux sous-types. Les premiers sont des compteurs classiques, qui comptent de 0 à <math>2^n-1</math>, éventuellement des compteurs modulo. Leur pas est de 1, leur contenu est incrémenté à chaque cycle d'horloge. Ils portent le nom de '''compteurs asynchrones'''. ===Les compteurs asynchrones (SIPO ou PIPO)=== Les '''compteurs asynchrones''' sont des compteurs fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ===Les compteurs en anneau : les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ===Les compteurs de Johnson : les compteurs unaires=== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. [[File:A simple sinusoid generator.jpg|centre|vignette|upright=2.5|Générateur de sinusoïde avec un compteur de Johnson.]] ===Les registres à décalage à rétroaction=== Pour simplifier les explications qui vont suivre, nous allons faire un rappel sur les types de registre à décalage. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | PIPO || SIPO |- ! Sortie série | PISO || SISO |} Les '''compteurs à rétroaction''' sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur=== Un compteur est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> lwzo8p4evjsjw76p0nxcln2kknata2z 768062 768061 2026-06-18T16:40:48Z Mewtow 31375 /* Les compteurs synchrones */ 768062 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. ==Les compteurs/décompteurs : généralités== Vu de loin, un compteur a l'air d'être assez simple. Il mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. ===Les types de compteurs : à incrément, à pas fixe/variable=== Intuitivement, vous vous dites qu'un compteur compte de 1 en 1. Par exemple, si j'initialise un compteur à 0 et que je l'incrémente à chaque cycle d'horloge, il va me sortir la suite de nombre 0, 1, 2, 3, 4, etc. Les compteurs qui font cela sont appelés des '''compteurs à incrément''' (respectivement décrément pour les décompteurs). Et si je leur donne un tel nom, c'est car tous les compteurs ne fonctionnent pas comme ça. Il existe des compteurs qui comptent de deux en deux, de trois en trois, etc. Sur ces compteurs, le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. De tels compteurs sont appelés des compteurs à pas fixe. Notez qu'un compteur à incrément est un compteur à pas fixe où le pas est égal à 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels '''compteurs à pas variables''' ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. Nous ne parlerons cependant pas de tels compteurs à pas variables dans ce qui suit. Enfin, il existe un dernier type de compteur, qui ne compte pas au sens commun du terme. A la place, ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle. Pour l'anecdote, le processeur Intel 8008, le tout premier microprocesseur 8 bits commercialisé, a utilisé ce genre de compteurs pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. : Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. ===La taille d'un compteur=== Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La taille d'un compteur est surtout pertinente sur les compteurs à incrément, elle a moins de pertinence sur les autres compteurs. La plupart des compteurs à incrément comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ===L'interface d'un compteur/décompteur=== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ===L'intérieur d'un compteur=== Il existe deux manières pour concevoir un compteur/décompteur avec des portes logique, ces deux manières donnant respectivement les compteurs synchrones et asynchrones. Les termes synchrones et asynchrones sont cependant trompeurs. N'allez pas croire que les compteurs synchrones sont reliés à un signal d'horloge et pas les asynchrones. En réalité, les deux sont reliés à un signal d'horloge, ne serait-ce que parce qu'ils ont un registre à l'intérieur. En réalité, la distinction tient dans la manière dont ils sont conçus. Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les '''compteurs asynchrones''' sont eux fabriqués en remplaçant le registre par un registre à décalage. Ils sont nettement moins versatiles que les compteurs synchrones. En effet, un compteur asynchrone peut servir à créer soit des compteurs à incrément, soit des compteurs au sens général, mais pas de compteurs à pas fixe/variable. C'est une limitation assez sérieuse : suivant le type de compteur asynchrone utilisé, on aura soit un compteur à incrément, soit un compteur qui déroule des suites de chiffres bien précises très limitées. A l'opposé, un compteur synchrone peut implémenter tout type de compteur, il suffit de prévoir le circuit combinatoire qui va bien pour. ==Les compteurs à incrément synchrones== Voyons maintenant le cas des compteurs à incrément, de type synchrone. Ils sont composés d'un registre, couplé à un circuit '''incrémenteur'''. Nous avions déjà abordé l'incrémenteur dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs synchrones modulo=== Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ==Les compteurs basés sur des registres à décalage== Il existe des compteurs basés sur un registre à décalage. Les compteurs à registres à décalage peuvent se classer en deux sous-types. Les premiers sont des compteurs classiques, qui comptent de 0 à <math>2^n-1</math>, éventuellement des compteurs modulo. Leur pas est de 1, leur contenu est incrémenté à chaque cycle d'horloge. Ils portent le nom de '''compteurs asynchrones'''. ===Les compteurs asynchrones (SIPO ou PIPO)=== Les '''compteurs asynchrones''' sont des compteurs fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ===Les compteurs en anneau : les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ===Les compteurs de Johnson : les compteurs unaires=== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. [[File:A simple sinusoid generator.jpg|centre|vignette|upright=2.5|Générateur de sinusoïde avec un compteur de Johnson.]] ===Les registres à décalage à rétroaction=== Pour simplifier les explications qui vont suivre, nous allons faire un rappel sur les types de registre à décalage. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | PIPO || SIPO |- ! Sortie série | PISO || SISO |} Les '''compteurs à rétroaction''' sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur=== Un compteur est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> cyy2nxw6fwq7yq7dtv3wka6b7bwaczl 768063 768062 2026-06-18T16:51:15Z Mewtow 31375 768063 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. ==Les compteurs/décompteurs : généralités== Vu de loin, un compteur a l'air d'être assez simple. Il mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. ===Les types de compteurs : à incrément, à pas fixe/variable=== Intuitivement, vous vous dites qu'un compteur compte de 1 en 1. Par exemple, si j'initialise un compteur à 0 et que je l'incrémente à chaque cycle d'horloge, il va me sortir la suite de nombre 0, 1, 2, 3, 4, etc. Les compteurs qui font cela sont appelés des '''compteurs à incrément''' (respectivement décrément pour les décompteurs). Et si je leur donne un tel nom, c'est car tous les compteurs ne fonctionnent pas comme ça. Il existe des compteurs qui comptent de deux en deux, de trois en trois, etc. Sur ces compteurs, le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. De tels compteurs sont appelés des compteurs à pas fixe. Notez qu'un compteur à incrément est un compteur à pas fixe où le pas est égal à 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels '''compteurs à pas variables''' ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. Nous ne parlerons cependant pas de tels compteurs à pas variables dans ce qui suit. ===La taille d'un compteur=== Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La taille d'un compteur est surtout pertinente sur les compteurs à incrément, elle a moins de pertinence sur les autres compteurs. La plupart des compteurs à incrément comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ===L'interface d'un compteur/décompteur=== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ===L'intérieur d'un compteur=== Il existe deux manières pour concevoir un compteur/décompteur avec des portes logique, ces deux manières donnant respectivement les compteurs synchrones et asynchrones. Les termes synchrones et asynchrones sont cependant trompeurs. N'allez pas croire que les compteurs synchrones sont reliés à un signal d'horloge et pas les asynchrones. En réalité, les deux sont reliés à un signal d'horloge, ne serait-ce que parce qu'ils ont un registre à l'intérieur. En réalité, la distinction tient dans la manière dont ils sont conçus. Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les '''compteurs asynchrones''' sont eux fabriqués en remplaçant le registre par un registre à décalage. Ils sont nettement moins versatiles que les compteurs synchrones. En effet, un compteur asynchrone peut servir à créer soit des compteurs à incrément, soit des compteurs au sens général, mais pas de compteurs à pas fixe/variable. C'est une limitation assez sérieuse : suivant le type de compteur asynchrone utilisé, on aura soit un compteur à incrément, soit un compteur qui déroule des suites de chiffres bien précises très limitées. A l'opposé, un compteur synchrone peut implémenter tout type de compteur, il suffit de prévoir le circuit combinatoire qui va bien pour. ==Les compteurs à incrément synchrones== Voyons maintenant le cas des compteurs à incrément, de type synchrone. Ils sont composés d'un registre, couplé à un circuit '''incrémenteur'''. Nous avions déjà abordé l'incrémenteur dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs synchrones modulo=== Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les compteurs asynchrones (SIPO ou PIPO)=== Les '''compteurs asynchrones''' sont des compteurs fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! ==Un premier usage des compteurs : les diviseurs de fréquence== Les compteurs servent à créer divers circuits fortement liés la gestion de la fréquence, ainsi qu'à la mesure du temps. Les circuits en question comptent les cycles d'horloge, ce qui demande juste des compteurs automatiquement incrémentés à chaque cycle d'horloge. Compter les cycles d'horloge permet de mesurer des durées, ou de diviser une fréquence. Dans ce qui va suivre, nous allons voire deux types de circuits : les diviseurs de fréquence, et les ''timers''. Les '''diviseurs de fréquence''' sont des circuits qui prennent en entrée un signal d'horloge et fournissent en sortie un autre signal d'horloge de fréquence N fois plus faible. Plus précisément, la fréquence de sortie est 2, 3, 4, ou 18 fois plus faible que la fréquence d'entrée. Il existe des diviseurs de fréquence qui divisent la fréquence par 2, d'autres par 4, d'autres par 13, etc. ===Les diviseurs de fréquence basés sur des compteurs=== Leur implémentation est simple : il suffit d'un compteur auquel on rajoute une sortie. Pour un diviseur de fréquence par N, il faut plus précisément un compteur modulo par N. Tous les N cycles, le compteur déborde, à savoir qu'il dépasse sa valeur maximale et est remis à zéro. Une sortie du compteur indique si le compteur déborde : elle est mise à 1 lors d'un débordement et reste à 0 sinon. L'idée est de compter le nombre de cycles d'horloges, et de mettre à 1 la sortie quand le compteur déborde. Par exemple, pour diviser une fréquence par 8, on prend un compteur 3 bits. A chaque fois que le compteur déborde et est réinitialisé, on envoie un 1 en sortie. Le résultat est un signal qui est à 1 tous les 8 cycles d'horloge, à savoir un signal de fréquence 8 fois inférieure. La même idée marche avec un diviseur de fréquence par 6, sauf que l'on doit alors utiliser un compteur modulo par 6, ce qui veut dire qu'il compte de 0 à 5 comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le compteur déborde tous les 6 cycles d’horloge, ce qui fait que sa sortie de débordement est à 1 tous les 6 cycles, ce qui est demandé. Si n'importe quel compteur fait l'affaire, il est cependant utile d'utiliser les compteurs les plus adaptés à la tâche. Il est rare que l'on doive diviser une fréquence par 50 ou par 100, par exemple. Un diviseur de fréquence divise une fréquence par N, avec N très petit : 4, 6, 8, 10, 12, etc. Or, les compteurs en anneau, sont particulièrement adaptés pour compter jusqu'à des valeurs assez faibles. Il est donc naturel d'utiliser un compteur en anneau dans un diviseur de fréquence. Le circuit obtenu est beaucoup plus simple qu’avec un compteur normal. Et c'est la raison pour laquelle les diviseurs de fréquence sont souvent conçus en utilisant des compteurs ''one-hot''. Plus on divise une fréquence par un N très petit, plus les compteurs auront d'avantages : très simples, demandent peu de portes logiques, sont très rapides, prennent peu de place, permettent de se passer de circuit comparateur. ===Les diviseurs de fréquence basés sur des compteurs à bascule T=== Il est aussi possible de concevoir des diviseurs de fréquence avec des bascules T. La seule contrainte est qu'il faut diviser la fréquence d'entrée par une puissance de deux. Le cas le plus simple divise par 2 la fréquence d'entrée et ne demande qu'une simple bascule T. En effet, regardons ce qui se passe quand on envoie un signal constamment à 1 sur son entrée T. Dans ce cas, la bascule s'inversera une fois par chaque cycle d'horloge. Un cycle d'horloge sur la sortie correspond au temps passé entre deux inversions. [[File:Frequency divider by 2.svg|centre|vignette|upright=2|Diviseur de fréquence par 2.]] Pour créer un diviseur de fréquence par 4, il suffit d'enchainer deux fois le circuit précédent. Et pour créer un diviseur de fréquence par 8, il suffit d'enchainer trois fois le circuit précédent. Et ainsi de suite. Au final, un diviseur de fréquence qui divise la fréquence d'entrée par 2^N est un enchainement de N bascules T. [[File:Freq Divider mod 8.svg|centre|vignette|upright=2|Diviseur de fréquence par 8.]] On peut en profiter pour créer un circuit à plusieurs sorties, en mettant une sortie par bascule. Le circuit, illustré ci-dessous, fournit donc plusieurs fréquences de sortie : une à la moitié de la fréquence initiale, une autre au quart de la fréquence d'entrée, une autre au huitième, etc. [[File:Frequency divider animation.gif|centre|vignette|upright=2|Diviseur de fréquence multiple.]] ==Un autre usage des compteurs : les ''timers''== Les '''''timers''''', aussi appelés ''Programmable interval timer'', sont des circuits capables de compter des durées, exprimées en cycles d'horloge. Leur fonctionnement est assez simple : ils émettent un signal quand un certain nombre de cycles est écoulé, ce nombre de cycles étant configurable. On peut ainsi générer un signal qui surviendra après 50 cycles d'horloge, ou après 100 cycles d'horloge, etc. Le signal en question est disponible sur une sortie de 1 bit, et correspond tout simplement au fait que cette sortie est mise à 1, pendant un cycle d'horloge. Les ''timers'' sont composés d'un compteur/décompteur cadencé par un signal d'horloge. Le compteur initialisé à 0, puis est incrémenté à chaque signal d'horloge, jusqu’à atteinte d'une valeur limite où il génère un signal. Pour un décompteur, c'est la même chose, sauf que le décompteur est initialisé à sa valeur limite et est décrémenté à chaque cycle, et envoie un signal quand il atteint 0. Les ''timers'' basés sur des décompteurs sont nettement plus simples que les autres, ce qui fait qu'ils sont plus utilisés Pour que les ''timers'' soient configurables, on doit pouvoir préciser combien de cycles il faut (dé-)compter avant d'émettre un signal. On peut ainsi préciser s'il faut émettre le signal après 32 cycles d'horloge, après les 50 cycles, tous les 129 cycles, etc. Le nombre de cycles en question est envoyé sur une entrée d’initialisation du compteur. Les ''timers'' matériels peuvent compter de deux manières différentes, appelées '''mode une fois''' et '''mode périodique'''. * En mode une fois, le ''timer'' s'arrête une fois qu'il a atteint la limite configurée. On doit le réinitialiser manuellement, par l'intermédiaire du logiciel, pour l'utiliser une nouvelle fois. Cela permet de compter une certaine durée, exprimée en nombre de cycles d'horloge. * En mode périodique, le ''timer'' se réinitialise automatiquement avec la valeur de départ, ce qui fait qu'il reboucle à l'infini. En clair, le ''timer'' se comporte comme un diviseur de fréquence. Si le compteur est réglé de manière à émettre un signal tous les 9 cycles d'horloge, la fréquence de sortie sera de 9 fois moins celle de la fréquence d'entrée du compteur. Un ordinateur est rempli de ''timers'' divers. Dans ce qui va suivre, nous allons voir les principaux ''timers'', qui sont actuellement intégrés dans les PC modernes. Ils se trouvent sur la carte mère ou dans le processeur, tout dépend du ''timer''. ===Le ''watchdog timer''=== Le '''''watchdog timer''''' est un ''timer'' spécifique dont le but est de redémarrer automatiquement l'ordinateur si jamais celui-ci ne répond plus ou plante. Beaucoup de PC s'en passent, mais ce ''timer'' est très fréquent dans les architectures embarquées. Le ''watchdog timer'' est un compteur/décompteur qui doit être réinitialisé régulièrement. S'il n'est pas réinitialisé, le ''watchdog timer'' déborde (revient à 0 ou atteint 0) et envoie un signal qui redémarre le système. Le système est conçu pour réinitialiser le ''watchdog timer'' régulièrement, ce qui signifie que le système n'est pas censé redémarrer. Si jamais le système dysfonctionne gravement, le système ne pourra pas réinitialiser le ''watchdog timer'' et le système est redémarré automatiquement ou mis en arrêt. [[File:SimpleWatchdogTimer.gif|centre|vignette|upright=2|Le ''Watchdog Timer'' et l'ordinateur.]] ===Le ''Time Stamp Counter'' des processeurs x86=== Tous les processeurs des PC actuels sont des processeurs dits x86. Nous ne pouvons pas expliquer ce que cela signifie pour le moment, retenez juste ce terme. Sachez que tous les processeurs x86 contiennent un compteur de 64 bits, appelé le '''''Time Stamp Counter''''', qui mémorise le nombre de cycles d'horloge qu'a effectué le processeur depuis son démarrage. Les programmes peuvent accéder à ce registre assez facilement, ce qui est utile pour faire des mesures ou comparer les performances de deux applications. Il permet de compter combien de cycles d'horloge met un morceau de code à s’exécuter, combien de cycles prend une instruction à s’exécuter, etc. Les processeurs non-x86 ont un registre équivalent, que ce soit les processeurs ARM ou d'autres. Malheureusement, ce compteur est tombé en désuétude pour tout un tas de raisons. La principale est que les processeurs actuels font varier leur fréquence suivant les besoins. Ils augmentent leur fréquence quand on leur demande de faire beaucoup de calculs, et se mettent en mode basse(fréquence pour économiser de l'énergie si on ne leur demande pas grand chose. Avec une fréquence variable, le ''Time Stamp Counter'' perd complétement en fiabilité. Intel a tenté de corriger ce défaut en incrémentant ce registre à une fréquence constante, différente de celle du processeur, ce qui est encore le cas sur les processeurs Intel actuels. Le comportement est un peu différent sur les processeurs AMD, qui cadencent ce ''timer'' à la fréquence du processeur mais utilisent des mécanismes de synchronisation assez complexes pour corriger l'effet de la fréquence variable. ===L'horloge temps réel=== L''''horloge temps réel''' est un ''timer'' qui génère une fréquence de 1024 Hz, soit près d'un Kilohertz. Dans ce qui suit, nous la noterons RTC, ce qui est l'acronyme du terme anglais ''Real Time Clock''. La RTC prend en entrée un signal d'horloge de 32KHz, généré par un oscillateur à Quartz, et fournit en sortie un signal de fréquence 32 fois plus faible, c'est à dire de 1 KHz. Pour cela, elle est réglée en mode répétitif et son décompteur interne est initialisé à 32. La RTC génère donc un signal toutes les millisecondes, qui est envoyé au processeur. On peut, en théorie, changer la fréquence de la RTC, mais c'est rarement une bonne idée. En théorie, la RTC permet de compter des durées assez courtes, comme le ''ping'' (le temps de latence d'un réseau, pour simplifier), le temps de rafraichissement de l'écran, ou bien d'autres choses. Mais dans les faits, l'horloge temps réel sa fréquence n'aide pas : 1024 Hz est proche de 1000, mais pas assez pour faire des mesures à la milliseconde près, chose qui est nécessaire pour mesurer le ''ping'' ou d'autres choses utiles. A la place, l'ordinateur l'utilise pour que l'ordinateur soit toujours à l'heure. L'ordinateur sait quelle heure il est avec une précision de l'ordre de la seconde (vous pouvez regarder le bureau de Windows dans le coin inférieur droite de votre écran pour vous en convaincre). ===Le ''Programmable Interval Timer'' : l'Intel 8253=== L'Intel 8253 était un ''timer'' programmable autrefois soudé sur les cartes mères des premiers PC. Il fût suivi par l'Intel 8254, qui en était une légère amélioration. Il était cadencé par une horloge maitre, générée par un oscillateur à Quartz, dont la fréquence est de 32 768 Hertz, soit 2^15 cycles d'horloge par seconde. S'il n'est plus présent dans un boitier sur la carte mère, on trouve toujours un circuit semblable au 8253 à l'intérieur du ''chipset'' de la carte mère, voire à l'intérieur du processeur, pour des raisons de compatibilité. L'intérieur de l'Intel 8253 est illustré ci-dessous. Nous allons expliquer l'ensemble de ce schéma, rassurez-vous, mais les explications seront plus simples à comprendre si vous survolez ce schéma en premier lieu. [[File:Intel 8253 block diagram.svg|centre|vignette|upright=2|Intel 8253, intérieur.]] L'Intel 8253 contient trois compteurs de 16 bits, numérotés 0, 1 et 2. Pour chaque compteur, l'entrée CLOCK est celle de l'horloge de 32 MHz, l'entrée GATE active ou désactive le compteur, la sortie fournit le signal voulu et/ou la fréquence de sortie. Les trois compteurs étaient utilisés pour dériver plusieurs fréquences allant de 18,2 Hz à environ 500 KHz. Par exemple, il était utilisé par défaut pour le rafraichissement de la mémoire (D)RAM, mais il était souvent reprogrammé pour servir à générer des fréquences spécifiques par le BIOS ou la carte graphique. [[File:Intel 8253 and 8254.svg|vignette|Intel 8253 and 8254]] L'Intel 8253 lui-même possède plusieurs entrées et sorties. En premier lieu, on voit un port de 8 bits connecté aux trois compteurs, qui permet à l'Intel 8253 de communiquer avec le reste de l'ordinateur. La communication se fait dans les deux sens : soit de l'ordinateur vers les compteurs, soit des compteurs vers l'ordinateur. Dans le sens ordinateur -> compteurs, cela permet à l'ordinateur de programmer les compteurs, de les initialiser. Dans l'autre sens, cela permet de récupérer le contenu des compteurs, même si ce n'est pas très utilisé. Il y a aussi 5 entrées de configuration : * Deux bits A0 et A1 pour sélectionner le compteur voulu avec son numéro. * Un bit RD à mettre à 0 pour que l'ordinateur récupère le compteur sélectionné sur le port de 8 bits. * Un bit WR à mettre à 0 pour que l'ordinateur modifie le compteur sélectionné, en envoyant le nombre pour l'initialisation sur le port de 8 bits. * Un bit CS qui active ou désactive l'Intel 8253 et permet de l'allumer ou de l’éteindre. L'Intel 8253 intégre un registre de 8 bits, le ''Control Word register'' qui mémorise la configuration de l'Intel 8253. Pour programmer les trois compteurs, il faut écrire un mot de 8 bits dans ce ''Control Word register''. Pour écrire dans le ''Control Word register'', il faut mettre le bit CS à 0 (on active l'Intel 8253), mettre le bit RDà 1 , le bit WR à 0 le bit WR (on indique qu'on fait une écriture), sélectionner le ''Control Word register'' en mettant les deux bits A0 et A1 à 1, puis envoyer la configuration du ''Control Word register'' sur le port de 8 bits. ===Le ''High Precision Event Timer'' (HPET)=== De nos jours, l'horloge temps réel et l'Intel 8253/8254 tendent à être remplacé par un autre ''timer'', le ''High Precision Event Timer'' (HPET). Il s'agit d'un compteur de 64 bits, dont la fréquence est d'au moins 10 MHz. Il s'agit bien d'un compteur et non d'un décompteur. Il gère nativement plusieurs valeurs limites à laquelle générer un signal, qui sont configurables. Pour cela, il est couplé à plusieurs comparateurs, chacun associé à un registre pour mémoriser la valeur limite. Il doit y avoir au moins trois comparateurs/registres, mais le nombre peut monter jusqu’à 256. [[File:High Precision Event Timer.png|centre|vignette|upright=2|High Precision Event Timer]] Il faut noter que les systèmes d'exploitation conçus avant le HPET ne peuvent pas l'utiliser, pour des raisons de compatibilité matérielle. C'est le cas de Windows XP avant le Service Pack 3. C'est la raison pour laquelle les cartes mères émulent RTC et PIT dans leurs circuits. D'ailleurs, pour économiser des circuits, les cartes mères modernes émulent le PIT et la RTC avec le HPET : le premier comparateur fournisse la fréquence de 1024 Hz de la RTC, 3 autres comparateurs remplacent l'Intel 8253. Le HPET gère de nombreux modes de fonctionnement : ses comparateurs peuvent être configuré en mode une fois ou périodique, on peut lui demander d'émuler la RTC et le PIT, etc. Chaque comparateur doit pouvoir fonctionner en mode une fois, et au moins un comparateur doit pouvoir fonctionner en mode périodique. Aussi, il contient aussi 3 registres de configuration. Notons qu'il est aussi possible de lire ou écrire dans le compteur de 64 bits, mais ce n'est pas recommandé. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les timers et diviseurs de fréquence | nextText=Les timers et diviseurs de fréquence }} </noinclude> 54pr1bvi26fn5165mgdebcz32huwz76 768070 768063 2026-06-18T16:55:19Z Mewtow 31375 /* Le High Precision Event Timer (HPET) */ 768070 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. ==Les compteurs/décompteurs : généralités== Vu de loin, un compteur a l'air d'être assez simple. Il mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. ===Les types de compteurs : à incrément, à pas fixe/variable=== Intuitivement, vous vous dites qu'un compteur compte de 1 en 1. Par exemple, si j'initialise un compteur à 0 et que je l'incrémente à chaque cycle d'horloge, il va me sortir la suite de nombre 0, 1, 2, 3, 4, etc. Les compteurs qui font cela sont appelés des '''compteurs à incrément''' (respectivement décrément pour les décompteurs). Et si je leur donne un tel nom, c'est car tous les compteurs ne fonctionnent pas comme ça. Il existe des compteurs qui comptent de deux en deux, de trois en trois, etc. Sur ces compteurs, le décompte est incrémenté/décrémenté d'une quantité appelée le '''pas du compteur'''. La plupart des compteurs utilisent un pas constant, qui est fixé à la création du compteur, ce qui simplifie la conception du circuit. De tels compteurs sont appelés des compteurs à pas fixe. Notez qu'un compteur à incrément est un compteur à pas fixe où le pas est égal à 1, à savoir que le contenu de leur registre est incrémenté/décrémenté de 1 à la demande. Quelques compteurs ont un pas variable, ce qui sert à compter quelque chose qui varie de manière non-régulière. Par exemple, imaginez un circuit qui compte combien de voitures sont rentrées sur une autoroute par un péage bien précis. Plusieurs voitures peuvent rentrer sur le péage durant la même minute, presque en même temps. Pour cela, il suffit de prendre un compteur à pas variable, qui est incrémenté du nombre de voiture rentrées sur l'autoroute lors de la dernière période de temps. Évidemment, de tels '''compteurs à pas variables''' ont une entrée supplémentaire sur laquelle on peut envoyer le pas du compteur. Nous ne parlerons cependant pas de tels compteurs à pas variables dans ce qui suit. ===La taille d'un compteur=== Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La taille d'un compteur est surtout pertinente sur les compteurs à incrément, elle a moins de pertinence sur les autres compteurs. La plupart des compteurs à incrément comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ===L'interface d'un compteur/décompteur=== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ===L'intérieur d'un compteur=== Il existe deux manières pour concevoir un compteur/décompteur avec des portes logique, ces deux manières donnant respectivement les compteurs synchrones et asynchrones. Les termes synchrones et asynchrones sont cependant trompeurs. N'allez pas croire que les compteurs synchrones sont reliés à un signal d'horloge et pas les asynchrones. En réalité, les deux sont reliés à un signal d'horloge, ne serait-ce que parce qu'ils ont un registre à l'intérieur. En réalité, la distinction tient dans la manière dont ils sont conçus. Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les '''compteurs asynchrones''' sont eux fabriqués en remplaçant le registre par un registre à décalage. Ils sont nettement moins versatiles que les compteurs synchrones. En effet, un compteur asynchrone peut servir à créer soit des compteurs à incrément, soit des compteurs au sens général, mais pas de compteurs à pas fixe/variable. C'est une limitation assez sérieuse : suivant le type de compteur asynchrone utilisé, on aura soit un compteur à incrément, soit un compteur qui déroule des suites de chiffres bien précises très limitées. A l'opposé, un compteur synchrone peut implémenter tout type de compteur, il suffit de prévoir le circuit combinatoire qui va bien pour. ==Les compteurs à incrément synchrones== Voyons maintenant le cas des compteurs à incrément, de type synchrone. Ils sont composés d'un registre, couplé à un circuit '''incrémenteur'''. Nous avions déjà abordé l'incrémenteur dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs synchrones modulo=== Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les compteurs asynchrones (SIPO ou PIPO)=== Les '''compteurs asynchrones''' sont des compteurs fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! ==Un premier usage des compteurs : les diviseurs de fréquence== Les compteurs servent à créer divers circuits fortement liés la gestion de la fréquence, ainsi qu'à la mesure du temps. Les circuits en question comptent les cycles d'horloge, ce qui demande juste des compteurs automatiquement incrémentés à chaque cycle d'horloge. Compter les cycles d'horloge permet de mesurer des durées, ou de diviser une fréquence. Dans ce qui va suivre, nous allons voire deux types de circuits : les diviseurs de fréquence, et les ''timers''. Les '''diviseurs de fréquence''' sont des circuits qui prennent en entrée un signal d'horloge et fournissent en sortie un autre signal d'horloge de fréquence N fois plus faible. Plus précisément, la fréquence de sortie est 2, 3, 4, ou 18 fois plus faible que la fréquence d'entrée. Il existe des diviseurs de fréquence qui divisent la fréquence par 2, d'autres par 4, d'autres par 13, etc. ===Les diviseurs de fréquence basés sur des compteurs=== Leur implémentation est simple : il suffit d'un compteur auquel on rajoute une sortie. Pour un diviseur de fréquence par N, il faut plus précisément un compteur modulo par N. Tous les N cycles, le compteur déborde, à savoir qu'il dépasse sa valeur maximale et est remis à zéro. Une sortie du compteur indique si le compteur déborde : elle est mise à 1 lors d'un débordement et reste à 0 sinon. L'idée est de compter le nombre de cycles d'horloges, et de mettre à 1 la sortie quand le compteur déborde. Par exemple, pour diviser une fréquence par 8, on prend un compteur 3 bits. A chaque fois que le compteur déborde et est réinitialisé, on envoie un 1 en sortie. Le résultat est un signal qui est à 1 tous les 8 cycles d'horloge, à savoir un signal de fréquence 8 fois inférieure. La même idée marche avec un diviseur de fréquence par 6, sauf que l'on doit alors utiliser un compteur modulo par 6, ce qui veut dire qu'il compte de 0 à 5 comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le compteur déborde tous les 6 cycles d’horloge, ce qui fait que sa sortie de débordement est à 1 tous les 6 cycles, ce qui est demandé. Si n'importe quel compteur fait l'affaire, il est cependant utile d'utiliser les compteurs les plus adaptés à la tâche. Il est rare que l'on doive diviser une fréquence par 50 ou par 100, par exemple. Un diviseur de fréquence divise une fréquence par N, avec N très petit : 4, 6, 8, 10, 12, etc. Or, les compteurs en anneau, sont particulièrement adaptés pour compter jusqu'à des valeurs assez faibles. Il est donc naturel d'utiliser un compteur en anneau dans un diviseur de fréquence. Le circuit obtenu est beaucoup plus simple qu’avec un compteur normal. Et c'est la raison pour laquelle les diviseurs de fréquence sont souvent conçus en utilisant des compteurs ''one-hot''. Plus on divise une fréquence par un N très petit, plus les compteurs auront d'avantages : très simples, demandent peu de portes logiques, sont très rapides, prennent peu de place, permettent de se passer de circuit comparateur. ===Les diviseurs de fréquence basés sur des compteurs à bascule T=== Il est aussi possible de concevoir des diviseurs de fréquence avec des bascules T. La seule contrainte est qu'il faut diviser la fréquence d'entrée par une puissance de deux. Le cas le plus simple divise par 2 la fréquence d'entrée et ne demande qu'une simple bascule T. En effet, regardons ce qui se passe quand on envoie un signal constamment à 1 sur son entrée T. Dans ce cas, la bascule s'inversera une fois par chaque cycle d'horloge. Un cycle d'horloge sur la sortie correspond au temps passé entre deux inversions. [[File:Frequency divider by 2.svg|centre|vignette|upright=2|Diviseur de fréquence par 2.]] Pour créer un diviseur de fréquence par 4, il suffit d'enchainer deux fois le circuit précédent. Et pour créer un diviseur de fréquence par 8, il suffit d'enchainer trois fois le circuit précédent. Et ainsi de suite. Au final, un diviseur de fréquence qui divise la fréquence d'entrée par 2^N est un enchainement de N bascules T. [[File:Freq Divider mod 8.svg|centre|vignette|upright=2|Diviseur de fréquence par 8.]] On peut en profiter pour créer un circuit à plusieurs sorties, en mettant une sortie par bascule. Le circuit, illustré ci-dessous, fournit donc plusieurs fréquences de sortie : une à la moitié de la fréquence initiale, une autre au quart de la fréquence d'entrée, une autre au huitième, etc. [[File:Frequency divider animation.gif|centre|vignette|upright=2|Diviseur de fréquence multiple.]] ==Un autre usage des compteurs : les ''timers''== Les '''''timers''''', aussi appelés ''Programmable interval timer'', sont des circuits capables de compter des durées, exprimées en cycles d'horloge. Leur fonctionnement est assez simple : ils émettent un signal quand un certain nombre de cycles est écoulé, ce nombre de cycles étant configurable. On peut ainsi générer un signal qui surviendra après 50 cycles d'horloge, ou après 100 cycles d'horloge, etc. Le signal en question est disponible sur une sortie de 1 bit, et correspond tout simplement au fait que cette sortie est mise à 1, pendant un cycle d'horloge. Les ''timers'' sont composés d'un compteur/décompteur cadencé par un signal d'horloge. Le compteur initialisé à 0, puis est incrémenté à chaque signal d'horloge, jusqu’à atteinte d'une valeur limite où il génère un signal. Pour un décompteur, c'est la même chose, sauf que le décompteur est initialisé à sa valeur limite et est décrémenté à chaque cycle, et envoie un signal quand il atteint 0. Les ''timers'' basés sur des décompteurs sont nettement plus simples que les autres, ce qui fait qu'ils sont plus utilisés Pour que les ''timers'' soient configurables, on doit pouvoir préciser combien de cycles il faut (dé-)compter avant d'émettre un signal. On peut ainsi préciser s'il faut émettre le signal après 32 cycles d'horloge, après les 50 cycles, tous les 129 cycles, etc. Le nombre de cycles en question est envoyé sur une entrée d’initialisation du compteur. Les ''timers'' matériels peuvent compter de deux manières différentes, appelées '''mode une fois''' et '''mode périodique'''. * En mode une fois, le ''timer'' s'arrête une fois qu'il a atteint la limite configurée. On doit le réinitialiser manuellement, par l'intermédiaire du logiciel, pour l'utiliser une nouvelle fois. Cela permet de compter une certaine durée, exprimée en nombre de cycles d'horloge. * En mode périodique, le ''timer'' se réinitialise automatiquement avec la valeur de départ, ce qui fait qu'il reboucle à l'infini. En clair, le ''timer'' se comporte comme un diviseur de fréquence. Si le compteur est réglé de manière à émettre un signal tous les 9 cycles d'horloge, la fréquence de sortie sera de 9 fois moins celle de la fréquence d'entrée du compteur. Un ordinateur est rempli de ''timers'' divers. Dans ce qui va suivre, nous allons voir les principaux ''timers'', qui sont actuellement intégrés dans les PC modernes. Ils se trouvent sur la carte mère ou dans le processeur, tout dépend du ''timer''. ===Le ''watchdog timer''=== Le '''''watchdog timer''''' est un ''timer'' spécifique dont le but est de redémarrer automatiquement l'ordinateur si jamais celui-ci ne répond plus ou plante. Beaucoup de PC s'en passent, mais ce ''timer'' est très fréquent dans les architectures embarquées. Le ''watchdog timer'' est un compteur/décompteur qui doit être réinitialisé régulièrement. S'il n'est pas réinitialisé, le ''watchdog timer'' déborde (revient à 0 ou atteint 0) et envoie un signal qui redémarre le système. Le système est conçu pour réinitialiser le ''watchdog timer'' régulièrement, ce qui signifie que le système n'est pas censé redémarrer. Si jamais le système dysfonctionne gravement, le système ne pourra pas réinitialiser le ''watchdog timer'' et le système est redémarré automatiquement ou mis en arrêt. [[File:SimpleWatchdogTimer.gif|centre|vignette|upright=2|Le ''Watchdog Timer'' et l'ordinateur.]] ===Le ''Time Stamp Counter'' des processeurs x86=== Tous les processeurs des PC actuels sont des processeurs dits x86. Nous ne pouvons pas expliquer ce que cela signifie pour le moment, retenez juste ce terme. Sachez que tous les processeurs x86 contiennent un compteur de 64 bits, appelé le '''''Time Stamp Counter''''', qui mémorise le nombre de cycles d'horloge qu'a effectué le processeur depuis son démarrage. Les programmes peuvent accéder à ce registre assez facilement, ce qui est utile pour faire des mesures ou comparer les performances de deux applications. Il permet de compter combien de cycles d'horloge met un morceau de code à s’exécuter, combien de cycles prend une instruction à s’exécuter, etc. Les processeurs non-x86 ont un registre équivalent, que ce soit les processeurs ARM ou d'autres. Malheureusement, ce compteur est tombé en désuétude pour tout un tas de raisons. La principale est que les processeurs actuels font varier leur fréquence suivant les besoins. Ils augmentent leur fréquence quand on leur demande de faire beaucoup de calculs, et se mettent en mode basse(fréquence pour économiser de l'énergie si on ne leur demande pas grand chose. Avec une fréquence variable, le ''Time Stamp Counter'' perd complétement en fiabilité. Intel a tenté de corriger ce défaut en incrémentant ce registre à une fréquence constante, différente de celle du processeur, ce qui est encore le cas sur les processeurs Intel actuels. Le comportement est un peu différent sur les processeurs AMD, qui cadencent ce ''timer'' à la fréquence du processeur mais utilisent des mécanismes de synchronisation assez complexes pour corriger l'effet de la fréquence variable. ===L'horloge temps réel=== L''''horloge temps réel''' est un ''timer'' qui génère une fréquence de 1024 Hz, soit près d'un Kilohertz. Dans ce qui suit, nous la noterons RTC, ce qui est l'acronyme du terme anglais ''Real Time Clock''. La RTC prend en entrée un signal d'horloge de 32KHz, généré par un oscillateur à Quartz, et fournit en sortie un signal de fréquence 32 fois plus faible, c'est à dire de 1 KHz. Pour cela, elle est réglée en mode répétitif et son décompteur interne est initialisé à 32. La RTC génère donc un signal toutes les millisecondes, qui est envoyé au processeur. On peut, en théorie, changer la fréquence de la RTC, mais c'est rarement une bonne idée. En théorie, la RTC permet de compter des durées assez courtes, comme le ''ping'' (le temps de latence d'un réseau, pour simplifier), le temps de rafraichissement de l'écran, ou bien d'autres choses. Mais dans les faits, l'horloge temps réel sa fréquence n'aide pas : 1024 Hz est proche de 1000, mais pas assez pour faire des mesures à la milliseconde près, chose qui est nécessaire pour mesurer le ''ping'' ou d'autres choses utiles. A la place, l'ordinateur l'utilise pour que l'ordinateur soit toujours à l'heure. L'ordinateur sait quelle heure il est avec une précision de l'ordre de la seconde (vous pouvez regarder le bureau de Windows dans le coin inférieur droite de votre écran pour vous en convaincre). ===Le ''Programmable Interval Timer'' : l'Intel 8253=== L'Intel 8253 était un ''timer'' programmable autrefois soudé sur les cartes mères des premiers PC. Il fût suivi par l'Intel 8254, qui en était une légère amélioration. Il était cadencé par une horloge maitre, générée par un oscillateur à Quartz, dont la fréquence est de 32 768 Hertz, soit 2^15 cycles d'horloge par seconde. S'il n'est plus présent dans un boitier sur la carte mère, on trouve toujours un circuit semblable au 8253 à l'intérieur du ''chipset'' de la carte mère, voire à l'intérieur du processeur, pour des raisons de compatibilité. L'intérieur de l'Intel 8253 est illustré ci-dessous. Nous allons expliquer l'ensemble de ce schéma, rassurez-vous, mais les explications seront plus simples à comprendre si vous survolez ce schéma en premier lieu. [[File:Intel 8253 block diagram.svg|centre|vignette|upright=2|Intel 8253, intérieur.]] L'Intel 8253 contient trois compteurs de 16 bits, numérotés 0, 1 et 2. Pour chaque compteur, l'entrée CLOCK est celle de l'horloge de 32 MHz, l'entrée GATE active ou désactive le compteur, la sortie fournit le signal voulu et/ou la fréquence de sortie. Les trois compteurs étaient utilisés pour dériver plusieurs fréquences allant de 18,2 Hz à environ 500 KHz. Par exemple, il était utilisé par défaut pour le rafraichissement de la mémoire (D)RAM, mais il était souvent reprogrammé pour servir à générer des fréquences spécifiques par le BIOS ou la carte graphique. [[File:Intel 8253 and 8254.svg|vignette|Intel 8253 and 8254]] L'Intel 8253 lui-même possède plusieurs entrées et sorties. En premier lieu, on voit un port de 8 bits connecté aux trois compteurs, qui permet à l'Intel 8253 de communiquer avec le reste de l'ordinateur. La communication se fait dans les deux sens : soit de l'ordinateur vers les compteurs, soit des compteurs vers l'ordinateur. Dans le sens ordinateur -> compteurs, cela permet à l'ordinateur de programmer les compteurs, de les initialiser. Dans l'autre sens, cela permet de récupérer le contenu des compteurs, même si ce n'est pas très utilisé. Il y a aussi 5 entrées de configuration : * Deux bits A0 et A1 pour sélectionner le compteur voulu avec son numéro. * Un bit RD à mettre à 0 pour que l'ordinateur récupère le compteur sélectionné sur le port de 8 bits. * Un bit WR à mettre à 0 pour que l'ordinateur modifie le compteur sélectionné, en envoyant le nombre pour l'initialisation sur le port de 8 bits. * Un bit CS qui active ou désactive l'Intel 8253 et permet de l'allumer ou de l’éteindre. L'Intel 8253 intégre un registre de 8 bits, le ''Control Word register'' qui mémorise la configuration de l'Intel 8253. Pour programmer les trois compteurs, il faut écrire un mot de 8 bits dans ce ''Control Word register''. Pour écrire dans le ''Control Word register'', il faut mettre le bit CS à 0 (on active l'Intel 8253), mettre le bit RDà 1 , le bit WR à 0 le bit WR (on indique qu'on fait une écriture), sélectionner le ''Control Word register'' en mettant les deux bits A0 et A1 à 1, puis envoyer la configuration du ''Control Word register'' sur le port de 8 bits. ===Le ''High Precision Event Timer'' (HPET)=== De nos jours, l'horloge temps réel et l'Intel 8253/8254 tendent à être remplacé par un autre ''timer'', le ''High Precision Event Timer'' (HPET). Il s'agit d'un compteur de 64 bits, dont la fréquence est d'au moins 10 MHz. Il s'agit bien d'un compteur et non d'un décompteur. Il gère nativement plusieurs valeurs limites à laquelle générer un signal, qui sont configurables. Pour cela, il est couplé à plusieurs comparateurs, chacun associé à un registre pour mémoriser la valeur limite. Il doit y avoir au moins trois comparateurs/registres, mais le nombre peut monter jusqu’à 256. [[File:High Precision Event Timer.png|centre|vignette|upright=2|High Precision Event Timer]] Il faut noter que les systèmes d'exploitation conçus avant le HPET ne peuvent pas l'utiliser, pour des raisons de compatibilité matérielle. C'est le cas de Windows XP avant le Service Pack 3. C'est la raison pour laquelle les cartes mères émulent RTC et PIT dans leurs circuits. D'ailleurs, pour économiser des circuits, les cartes mères modernes émulent le PIT et la RTC avec le HPET : le premier comparateur fournisse la fréquence de 1024 Hz de la RTC, 3 autres comparateurs remplacent l'Intel 8253. Le HPET gère de nombreux modes de fonctionnement : ses comparateurs peuvent être configuré en mode une fois ou périodique, on peut lui demander d'émuler la RTC et le PIT, etc. Chaque comparateur doit pouvoir fonctionner en mode une fois, et au moins un comparateur doit pouvoir fonctionner en mode périodique. Aussi, il contient aussi 3 registres de configuration. Notons qu'il est aussi possible de lire ou écrire dans le compteur de 64 bits, mais ce n'est pas recommandé. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les compteurs à rétroaction | nextText=Les compteurs à rétroaction }} </noinclude> 6m21qfw7jogel66mle23yps3zzyfry6 768077 768070 2026-06-18T16:58:37Z Mewtow 31375 768077 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La taille d'un compteur est surtout pertinente sur les compteurs à incrément, elle a moins de pertinence sur les autres compteurs. La plupart des compteurs à incrément comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ===L'intérieur d'un compteur=== Il existe deux manières pour concevoir un compteur/décompteur avec des portes logique, ces deux manières donnant respectivement les compteurs synchrones et asynchrones. Les termes synchrones et asynchrones sont cependant trompeurs. N'allez pas croire que les compteurs synchrones sont reliés à un signal d'horloge et pas les asynchrones. En réalité, les deux sont reliés à un signal d'horloge, ne serait-ce que parce qu'ils ont un registre à l'intérieur. En réalité, la distinction tient dans la manière dont ils sont conçus. Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les '''compteurs asynchrones''' sont eux fabriqués en remplaçant le registre par un registre à décalage. Ils sont nettement moins versatiles que les compteurs synchrones. En effet, un compteur asynchrone peut servir à créer soit des compteurs à incrément, soit des compteurs au sens général, mais pas de compteurs à pas fixe/variable. C'est une limitation assez sérieuse : suivant le type de compteur asynchrone utilisé, on aura soit un compteur à incrément, soit un compteur qui déroule des suites de chiffres bien précises très limitées. A l'opposé, un compteur synchrone peut implémenter tout type de compteur, il suffit de prévoir le circuit combinatoire qui va bien pour. ==Les compteurs à incrément synchrones== Voyons maintenant le cas des compteurs à incrément, de type synchrone. Ils sont composés d'un registre, couplé à un circuit '''incrémenteur'''. Nous avions déjà abordé l'incrémenteur dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs synchrones modulo=== Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les compteurs asynchrones (SIPO ou PIPO)=== Les '''compteurs asynchrones''' sont des compteurs fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! ==Un premier usage des compteurs : les diviseurs de fréquence== Les compteurs servent à créer divers circuits fortement liés la gestion de la fréquence, ainsi qu'à la mesure du temps. Les circuits en question comptent les cycles d'horloge, ce qui demande juste des compteurs automatiquement incrémentés à chaque cycle d'horloge. Compter les cycles d'horloge permet de mesurer des durées, ou de diviser une fréquence. Dans ce qui va suivre, nous allons voire deux types de circuits : les diviseurs de fréquence, et les ''timers''. Les '''diviseurs de fréquence''' sont des circuits qui prennent en entrée un signal d'horloge et fournissent en sortie un autre signal d'horloge de fréquence N fois plus faible. Plus précisément, la fréquence de sortie est 2, 3, 4, ou 18 fois plus faible que la fréquence d'entrée. Il existe des diviseurs de fréquence qui divisent la fréquence par 2, d'autres par 4, d'autres par 13, etc. ===Les diviseurs de fréquence basés sur des compteurs=== Leur implémentation est simple : il suffit d'un compteur auquel on rajoute une sortie. Pour un diviseur de fréquence par N, il faut plus précisément un compteur modulo par N. Tous les N cycles, le compteur déborde, à savoir qu'il dépasse sa valeur maximale et est remis à zéro. Une sortie du compteur indique si le compteur déborde : elle est mise à 1 lors d'un débordement et reste à 0 sinon. L'idée est de compter le nombre de cycles d'horloges, et de mettre à 1 la sortie quand le compteur déborde. Par exemple, pour diviser une fréquence par 8, on prend un compteur 3 bits. A chaque fois que le compteur déborde et est réinitialisé, on envoie un 1 en sortie. Le résultat est un signal qui est à 1 tous les 8 cycles d'horloge, à savoir un signal de fréquence 8 fois inférieure. La même idée marche avec un diviseur de fréquence par 6, sauf que l'on doit alors utiliser un compteur modulo par 6, ce qui veut dire qu'il compte de 0 à 5 comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le compteur déborde tous les 6 cycles d’horloge, ce qui fait que sa sortie de débordement est à 1 tous les 6 cycles, ce qui est demandé. Si n'importe quel compteur fait l'affaire, il est cependant utile d'utiliser les compteurs les plus adaptés à la tâche. Il est rare que l'on doive diviser une fréquence par 50 ou par 100, par exemple. Un diviseur de fréquence divise une fréquence par N, avec N très petit : 4, 6, 8, 10, 12, etc. Or, les compteurs en anneau, sont particulièrement adaptés pour compter jusqu'à des valeurs assez faibles. Il est donc naturel d'utiliser un compteur en anneau dans un diviseur de fréquence. Le circuit obtenu est beaucoup plus simple qu’avec un compteur normal. Et c'est la raison pour laquelle les diviseurs de fréquence sont souvent conçus en utilisant des compteurs ''one-hot''. Plus on divise une fréquence par un N très petit, plus les compteurs auront d'avantages : très simples, demandent peu de portes logiques, sont très rapides, prennent peu de place, permettent de se passer de circuit comparateur. ===Les diviseurs de fréquence basés sur des compteurs à bascule T=== Il est aussi possible de concevoir des diviseurs de fréquence avec des bascules T. La seule contrainte est qu'il faut diviser la fréquence d'entrée par une puissance de deux. Le cas le plus simple divise par 2 la fréquence d'entrée et ne demande qu'une simple bascule T. En effet, regardons ce qui se passe quand on envoie un signal constamment à 1 sur son entrée T. Dans ce cas, la bascule s'inversera une fois par chaque cycle d'horloge. Un cycle d'horloge sur la sortie correspond au temps passé entre deux inversions. [[File:Frequency divider by 2.svg|centre|vignette|upright=2|Diviseur de fréquence par 2.]] Pour créer un diviseur de fréquence par 4, il suffit d'enchainer deux fois le circuit précédent. Et pour créer un diviseur de fréquence par 8, il suffit d'enchainer trois fois le circuit précédent. Et ainsi de suite. Au final, un diviseur de fréquence qui divise la fréquence d'entrée par 2^N est un enchainement de N bascules T. [[File:Freq Divider mod 8.svg|centre|vignette|upright=2|Diviseur de fréquence par 8.]] On peut en profiter pour créer un circuit à plusieurs sorties, en mettant une sortie par bascule. Le circuit, illustré ci-dessous, fournit donc plusieurs fréquences de sortie : une à la moitié de la fréquence initiale, une autre au quart de la fréquence d'entrée, une autre au huitième, etc. [[File:Frequency divider animation.gif|centre|vignette|upright=2|Diviseur de fréquence multiple.]] ==Un autre usage des compteurs : les ''timers''== Les '''''timers''''', aussi appelés ''Programmable interval timer'', sont des circuits capables de compter des durées, exprimées en cycles d'horloge. Leur fonctionnement est assez simple : ils émettent un signal quand un certain nombre de cycles est écoulé, ce nombre de cycles étant configurable. On peut ainsi générer un signal qui surviendra après 50 cycles d'horloge, ou après 100 cycles d'horloge, etc. Le signal en question est disponible sur une sortie de 1 bit, et correspond tout simplement au fait que cette sortie est mise à 1, pendant un cycle d'horloge. Les ''timers'' sont composés d'un compteur/décompteur cadencé par un signal d'horloge. Le compteur initialisé à 0, puis est incrémenté à chaque signal d'horloge, jusqu’à atteinte d'une valeur limite où il génère un signal. Pour un décompteur, c'est la même chose, sauf que le décompteur est initialisé à sa valeur limite et est décrémenté à chaque cycle, et envoie un signal quand il atteint 0. Les ''timers'' basés sur des décompteurs sont nettement plus simples que les autres, ce qui fait qu'ils sont plus utilisés Pour que les ''timers'' soient configurables, on doit pouvoir préciser combien de cycles il faut (dé-)compter avant d'émettre un signal. On peut ainsi préciser s'il faut émettre le signal après 32 cycles d'horloge, après les 50 cycles, tous les 129 cycles, etc. Le nombre de cycles en question est envoyé sur une entrée d’initialisation du compteur. Les ''timers'' matériels peuvent compter de deux manières différentes, appelées '''mode une fois''' et '''mode périodique'''. * En mode une fois, le ''timer'' s'arrête une fois qu'il a atteint la limite configurée. On doit le réinitialiser manuellement, par l'intermédiaire du logiciel, pour l'utiliser une nouvelle fois. Cela permet de compter une certaine durée, exprimée en nombre de cycles d'horloge. * En mode périodique, le ''timer'' se réinitialise automatiquement avec la valeur de départ, ce qui fait qu'il reboucle à l'infini. En clair, le ''timer'' se comporte comme un diviseur de fréquence. Si le compteur est réglé de manière à émettre un signal tous les 9 cycles d'horloge, la fréquence de sortie sera de 9 fois moins celle de la fréquence d'entrée du compteur. Un ordinateur est rempli de ''timers'' divers. Dans ce qui va suivre, nous allons voir les principaux ''timers'', qui sont actuellement intégrés dans les PC modernes. Ils se trouvent sur la carte mère ou dans le processeur, tout dépend du ''timer''. ===Le ''watchdog timer''=== Le '''''watchdog timer''''' est un ''timer'' spécifique dont le but est de redémarrer automatiquement l'ordinateur si jamais celui-ci ne répond plus ou plante. Beaucoup de PC s'en passent, mais ce ''timer'' est très fréquent dans les architectures embarquées. Le ''watchdog timer'' est un compteur/décompteur qui doit être réinitialisé régulièrement. S'il n'est pas réinitialisé, le ''watchdog timer'' déborde (revient à 0 ou atteint 0) et envoie un signal qui redémarre le système. Le système est conçu pour réinitialiser le ''watchdog timer'' régulièrement, ce qui signifie que le système n'est pas censé redémarrer. Si jamais le système dysfonctionne gravement, le système ne pourra pas réinitialiser le ''watchdog timer'' et le système est redémarré automatiquement ou mis en arrêt. [[File:SimpleWatchdogTimer.gif|centre|vignette|upright=2|Le ''Watchdog Timer'' et l'ordinateur.]] ===Le ''Time Stamp Counter'' des processeurs x86=== Tous les processeurs des PC actuels sont des processeurs dits x86. Nous ne pouvons pas expliquer ce que cela signifie pour le moment, retenez juste ce terme. Sachez que tous les processeurs x86 contiennent un compteur de 64 bits, appelé le '''''Time Stamp Counter''''', qui mémorise le nombre de cycles d'horloge qu'a effectué le processeur depuis son démarrage. Les programmes peuvent accéder à ce registre assez facilement, ce qui est utile pour faire des mesures ou comparer les performances de deux applications. Il permet de compter combien de cycles d'horloge met un morceau de code à s’exécuter, combien de cycles prend une instruction à s’exécuter, etc. Les processeurs non-x86 ont un registre équivalent, que ce soit les processeurs ARM ou d'autres. Malheureusement, ce compteur est tombé en désuétude pour tout un tas de raisons. La principale est que les processeurs actuels font varier leur fréquence suivant les besoins. Ils augmentent leur fréquence quand on leur demande de faire beaucoup de calculs, et se mettent en mode basse(fréquence pour économiser de l'énergie si on ne leur demande pas grand chose. Avec une fréquence variable, le ''Time Stamp Counter'' perd complétement en fiabilité. Intel a tenté de corriger ce défaut en incrémentant ce registre à une fréquence constante, différente de celle du processeur, ce qui est encore le cas sur les processeurs Intel actuels. Le comportement est un peu différent sur les processeurs AMD, qui cadencent ce ''timer'' à la fréquence du processeur mais utilisent des mécanismes de synchronisation assez complexes pour corriger l'effet de la fréquence variable. ===L'horloge temps réel=== L''''horloge temps réel''' est un ''timer'' qui génère une fréquence de 1024 Hz, soit près d'un Kilohertz. Dans ce qui suit, nous la noterons RTC, ce qui est l'acronyme du terme anglais ''Real Time Clock''. La RTC prend en entrée un signal d'horloge de 32KHz, généré par un oscillateur à Quartz, et fournit en sortie un signal de fréquence 32 fois plus faible, c'est à dire de 1 KHz. Pour cela, elle est réglée en mode répétitif et son décompteur interne est initialisé à 32. La RTC génère donc un signal toutes les millisecondes, qui est envoyé au processeur. On peut, en théorie, changer la fréquence de la RTC, mais c'est rarement une bonne idée. En théorie, la RTC permet de compter des durées assez courtes, comme le ''ping'' (le temps de latence d'un réseau, pour simplifier), le temps de rafraichissement de l'écran, ou bien d'autres choses. Mais dans les faits, l'horloge temps réel sa fréquence n'aide pas : 1024 Hz est proche de 1000, mais pas assez pour faire des mesures à la milliseconde près, chose qui est nécessaire pour mesurer le ''ping'' ou d'autres choses utiles. A la place, l'ordinateur l'utilise pour que l'ordinateur soit toujours à l'heure. L'ordinateur sait quelle heure il est avec une précision de l'ordre de la seconde (vous pouvez regarder le bureau de Windows dans le coin inférieur droite de votre écran pour vous en convaincre). ===Le ''Programmable Interval Timer'' : l'Intel 8253=== L'Intel 8253 était un ''timer'' programmable autrefois soudé sur les cartes mères des premiers PC. Il fût suivi par l'Intel 8254, qui en était une légère amélioration. Il était cadencé par une horloge maitre, générée par un oscillateur à Quartz, dont la fréquence est de 32 768 Hertz, soit 2^15 cycles d'horloge par seconde. S'il n'est plus présent dans un boitier sur la carte mère, on trouve toujours un circuit semblable au 8253 à l'intérieur du ''chipset'' de la carte mère, voire à l'intérieur du processeur, pour des raisons de compatibilité. L'intérieur de l'Intel 8253 est illustré ci-dessous. Nous allons expliquer l'ensemble de ce schéma, rassurez-vous, mais les explications seront plus simples à comprendre si vous survolez ce schéma en premier lieu. [[File:Intel 8253 block diagram.svg|centre|vignette|upright=2|Intel 8253, intérieur.]] L'Intel 8253 contient trois compteurs de 16 bits, numérotés 0, 1 et 2. Pour chaque compteur, l'entrée CLOCK est celle de l'horloge de 32 MHz, l'entrée GATE active ou désactive le compteur, la sortie fournit le signal voulu et/ou la fréquence de sortie. Les trois compteurs étaient utilisés pour dériver plusieurs fréquences allant de 18,2 Hz à environ 500 KHz. Par exemple, il était utilisé par défaut pour le rafraichissement de la mémoire (D)RAM, mais il était souvent reprogrammé pour servir à générer des fréquences spécifiques par le BIOS ou la carte graphique. [[File:Intel 8253 and 8254.svg|vignette|Intel 8253 and 8254]] L'Intel 8253 lui-même possède plusieurs entrées et sorties. En premier lieu, on voit un port de 8 bits connecté aux trois compteurs, qui permet à l'Intel 8253 de communiquer avec le reste de l'ordinateur. La communication se fait dans les deux sens : soit de l'ordinateur vers les compteurs, soit des compteurs vers l'ordinateur. Dans le sens ordinateur -> compteurs, cela permet à l'ordinateur de programmer les compteurs, de les initialiser. Dans l'autre sens, cela permet de récupérer le contenu des compteurs, même si ce n'est pas très utilisé. Il y a aussi 5 entrées de configuration : * Deux bits A0 et A1 pour sélectionner le compteur voulu avec son numéro. * Un bit RD à mettre à 0 pour que l'ordinateur récupère le compteur sélectionné sur le port de 8 bits. * Un bit WR à mettre à 0 pour que l'ordinateur modifie le compteur sélectionné, en envoyant le nombre pour l'initialisation sur le port de 8 bits. * Un bit CS qui active ou désactive l'Intel 8253 et permet de l'allumer ou de l’éteindre. L'Intel 8253 intégre un registre de 8 bits, le ''Control Word register'' qui mémorise la configuration de l'Intel 8253. Pour programmer les trois compteurs, il faut écrire un mot de 8 bits dans ce ''Control Word register''. Pour écrire dans le ''Control Word register'', il faut mettre le bit CS à 0 (on active l'Intel 8253), mettre le bit RDà 1 , le bit WR à 0 le bit WR (on indique qu'on fait une écriture), sélectionner le ''Control Word register'' en mettant les deux bits A0 et A1 à 1, puis envoyer la configuration du ''Control Word register'' sur le port de 8 bits. ===Le ''High Precision Event Timer'' (HPET)=== De nos jours, l'horloge temps réel et l'Intel 8253/8254 tendent à être remplacé par un autre ''timer'', le ''High Precision Event Timer'' (HPET). Il s'agit d'un compteur de 64 bits, dont la fréquence est d'au moins 10 MHz. Il s'agit bien d'un compteur et non d'un décompteur. Il gère nativement plusieurs valeurs limites à laquelle générer un signal, qui sont configurables. Pour cela, il est couplé à plusieurs comparateurs, chacun associé à un registre pour mémoriser la valeur limite. Il doit y avoir au moins trois comparateurs/registres, mais le nombre peut monter jusqu’à 256. [[File:High Precision Event Timer.png|centre|vignette|upright=2|High Precision Event Timer]] Il faut noter que les systèmes d'exploitation conçus avant le HPET ne peuvent pas l'utiliser, pour des raisons de compatibilité matérielle. C'est le cas de Windows XP avant le Service Pack 3. C'est la raison pour laquelle les cartes mères émulent RTC et PIT dans leurs circuits. D'ailleurs, pour économiser des circuits, les cartes mères modernes émulent le PIT et la RTC avec le HPET : le premier comparateur fournisse la fréquence de 1024 Hz de la RTC, 3 autres comparateurs remplacent l'Intel 8253. Le HPET gère de nombreux modes de fonctionnement : ses comparateurs peuvent être configuré en mode une fois ou périodique, on peut lui demander d'émuler la RTC et le PIT, etc. Chaque comparateur doit pouvoir fonctionner en mode une fois, et au moins un comparateur doit pouvoir fonctionner en mode périodique. Aussi, il contient aussi 3 registres de configuration. Notons qu'il est aussi possible de lire ou écrire dans le compteur de 64 bits, mais ce n'est pas recommandé. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les compteurs à rétroaction | nextText=Les compteurs à rétroaction }} </noinclude> 3hl7348r35cr0cdtwadx4hi2sh91uoz 768078 768077 2026-06-18T16:59:30Z Mewtow 31375 768078 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La taille d'un compteur est surtout pertinente sur les compteurs à incrément, elle a moins de pertinence sur les autres compteurs. La plupart des compteurs à incrément comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==L'intérieur d'un compteur== Il existe deux manières pour concevoir un compteur/décompteur avec des portes logique, ces deux manières donnant respectivement les compteurs synchrones et asynchrones. Les termes synchrones et asynchrones sont cependant trompeurs. N'allez pas croire que les compteurs synchrones sont reliés à un signal d'horloge et pas les asynchrones. En réalité, les deux sont reliés à un signal d'horloge, ne serait-ce que parce qu'ils ont un registre à l'intérieur. En réalité, la distinction tient dans la manière dont ils sont conçus. Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. Le circuit combinatoire est capable de réaliser des additions (compteur), des soustractions (décompteurs), voire les deux (compteur-décompteur). Plus rarement, il s'agit de circuits conçus sur mesure, dans le cas où le pas du compteur est fixé une bonne fois pour toutes. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les '''compteurs asynchrones''' sont eux fabriqués en remplaçant le registre par un registre à décalage. Ils sont nettement moins versatiles que les compteurs synchrones. En effet, un compteur asynchrone peut servir à créer soit des compteurs à incrément, soit des compteurs au sens général, mais pas de compteurs à pas fixe/variable. C'est une limitation assez sérieuse : suivant le type de compteur asynchrone utilisé, on aura soit un compteur à incrément, soit un compteur qui déroule des suites de chiffres bien précises très limitées. A l'opposé, un compteur synchrone peut implémenter tout type de compteur, il suffit de prévoir le circuit combinatoire qui va bien pour. ===Les compteurs à incrément synchrones=== Voyons maintenant le cas des compteurs à incrément, de type synchrone. Ils sont composés d'un registre, couplé à un circuit '''incrémenteur'''. Nous avions déjà abordé l'incrémenteur dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs synchrones en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs synchrones modulo=== Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les compteurs asynchrones (SIPO ou PIPO)=== Les '''compteurs asynchrones''' sont des compteurs fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Un premier usage des compteurs : les diviseurs de fréquence== Les compteurs servent à créer divers circuits fortement liés la gestion de la fréquence, ainsi qu'à la mesure du temps. Les circuits en question comptent les cycles d'horloge, ce qui demande juste des compteurs automatiquement incrémentés à chaque cycle d'horloge. Compter les cycles d'horloge permet de mesurer des durées, ou de diviser une fréquence. Dans ce qui va suivre, nous allons voire deux types de circuits : les diviseurs de fréquence, et les ''timers''. Les '''diviseurs de fréquence''' sont des circuits qui prennent en entrée un signal d'horloge et fournissent en sortie un autre signal d'horloge de fréquence N fois plus faible. Plus précisément, la fréquence de sortie est 2, 3, 4, ou 18 fois plus faible que la fréquence d'entrée. Il existe des diviseurs de fréquence qui divisent la fréquence par 2, d'autres par 4, d'autres par 13, etc. ===Les diviseurs de fréquence basés sur des compteurs=== Leur implémentation est simple : il suffit d'un compteur auquel on rajoute une sortie. Pour un diviseur de fréquence par N, il faut plus précisément un compteur modulo par N. Tous les N cycles, le compteur déborde, à savoir qu'il dépasse sa valeur maximale et est remis à zéro. Une sortie du compteur indique si le compteur déborde : elle est mise à 1 lors d'un débordement et reste à 0 sinon. L'idée est de compter le nombre de cycles d'horloges, et de mettre à 1 la sortie quand le compteur déborde. Par exemple, pour diviser une fréquence par 8, on prend un compteur 3 bits. A chaque fois que le compteur déborde et est réinitialisé, on envoie un 1 en sortie. Le résultat est un signal qui est à 1 tous les 8 cycles d'horloge, à savoir un signal de fréquence 8 fois inférieure. La même idée marche avec un diviseur de fréquence par 6, sauf que l'on doit alors utiliser un compteur modulo par 6, ce qui veut dire qu'il compte de 0 à 5 comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le compteur déborde tous les 6 cycles d’horloge, ce qui fait que sa sortie de débordement est à 1 tous les 6 cycles, ce qui est demandé. Si n'importe quel compteur fait l'affaire, il est cependant utile d'utiliser les compteurs les plus adaptés à la tâche. Il est rare que l'on doive diviser une fréquence par 50 ou par 100, par exemple. Un diviseur de fréquence divise une fréquence par N, avec N très petit : 4, 6, 8, 10, 12, etc. Or, les compteurs en anneau, sont particulièrement adaptés pour compter jusqu'à des valeurs assez faibles. Il est donc naturel d'utiliser un compteur en anneau dans un diviseur de fréquence. Le circuit obtenu est beaucoup plus simple qu’avec un compteur normal. Et c'est la raison pour laquelle les diviseurs de fréquence sont souvent conçus en utilisant des compteurs ''one-hot''. Plus on divise une fréquence par un N très petit, plus les compteurs auront d'avantages : très simples, demandent peu de portes logiques, sont très rapides, prennent peu de place, permettent de se passer de circuit comparateur. ===Les diviseurs de fréquence basés sur des compteurs à bascule T=== Il est aussi possible de concevoir des diviseurs de fréquence avec des bascules T. La seule contrainte est qu'il faut diviser la fréquence d'entrée par une puissance de deux. Le cas le plus simple divise par 2 la fréquence d'entrée et ne demande qu'une simple bascule T. En effet, regardons ce qui se passe quand on envoie un signal constamment à 1 sur son entrée T. Dans ce cas, la bascule s'inversera une fois par chaque cycle d'horloge. Un cycle d'horloge sur la sortie correspond au temps passé entre deux inversions. [[File:Frequency divider by 2.svg|centre|vignette|upright=2|Diviseur de fréquence par 2.]] Pour créer un diviseur de fréquence par 4, il suffit d'enchainer deux fois le circuit précédent. Et pour créer un diviseur de fréquence par 8, il suffit d'enchainer trois fois le circuit précédent. Et ainsi de suite. Au final, un diviseur de fréquence qui divise la fréquence d'entrée par 2^N est un enchainement de N bascules T. [[File:Freq Divider mod 8.svg|centre|vignette|upright=2|Diviseur de fréquence par 8.]] On peut en profiter pour créer un circuit à plusieurs sorties, en mettant une sortie par bascule. Le circuit, illustré ci-dessous, fournit donc plusieurs fréquences de sortie : une à la moitié de la fréquence initiale, une autre au quart de la fréquence d'entrée, une autre au huitième, etc. [[File:Frequency divider animation.gif|centre|vignette|upright=2|Diviseur de fréquence multiple.]] ==Un autre usage des compteurs : les ''timers''== Les '''''timers''''', aussi appelés ''Programmable interval timer'', sont des circuits capables de compter des durées, exprimées en cycles d'horloge. Leur fonctionnement est assez simple : ils émettent un signal quand un certain nombre de cycles est écoulé, ce nombre de cycles étant configurable. On peut ainsi générer un signal qui surviendra après 50 cycles d'horloge, ou après 100 cycles d'horloge, etc. Le signal en question est disponible sur une sortie de 1 bit, et correspond tout simplement au fait que cette sortie est mise à 1, pendant un cycle d'horloge. Les ''timers'' sont composés d'un compteur/décompteur cadencé par un signal d'horloge. Le compteur initialisé à 0, puis est incrémenté à chaque signal d'horloge, jusqu’à atteinte d'une valeur limite où il génère un signal. Pour un décompteur, c'est la même chose, sauf que le décompteur est initialisé à sa valeur limite et est décrémenté à chaque cycle, et envoie un signal quand il atteint 0. Les ''timers'' basés sur des décompteurs sont nettement plus simples que les autres, ce qui fait qu'ils sont plus utilisés Pour que les ''timers'' soient configurables, on doit pouvoir préciser combien de cycles il faut (dé-)compter avant d'émettre un signal. On peut ainsi préciser s'il faut émettre le signal après 32 cycles d'horloge, après les 50 cycles, tous les 129 cycles, etc. Le nombre de cycles en question est envoyé sur une entrée d’initialisation du compteur. Les ''timers'' matériels peuvent compter de deux manières différentes, appelées '''mode une fois''' et '''mode périodique'''. * En mode une fois, le ''timer'' s'arrête une fois qu'il a atteint la limite configurée. On doit le réinitialiser manuellement, par l'intermédiaire du logiciel, pour l'utiliser une nouvelle fois. Cela permet de compter une certaine durée, exprimée en nombre de cycles d'horloge. * En mode périodique, le ''timer'' se réinitialise automatiquement avec la valeur de départ, ce qui fait qu'il reboucle à l'infini. En clair, le ''timer'' se comporte comme un diviseur de fréquence. Si le compteur est réglé de manière à émettre un signal tous les 9 cycles d'horloge, la fréquence de sortie sera de 9 fois moins celle de la fréquence d'entrée du compteur. Un ordinateur est rempli de ''timers'' divers. Dans ce qui va suivre, nous allons voir les principaux ''timers'', qui sont actuellement intégrés dans les PC modernes. Ils se trouvent sur la carte mère ou dans le processeur, tout dépend du ''timer''. ===Le ''watchdog timer''=== Le '''''watchdog timer''''' est un ''timer'' spécifique dont le but est de redémarrer automatiquement l'ordinateur si jamais celui-ci ne répond plus ou plante. Beaucoup de PC s'en passent, mais ce ''timer'' est très fréquent dans les architectures embarquées. Le ''watchdog timer'' est un compteur/décompteur qui doit être réinitialisé régulièrement. S'il n'est pas réinitialisé, le ''watchdog timer'' déborde (revient à 0 ou atteint 0) et envoie un signal qui redémarre le système. Le système est conçu pour réinitialiser le ''watchdog timer'' régulièrement, ce qui signifie que le système n'est pas censé redémarrer. Si jamais le système dysfonctionne gravement, le système ne pourra pas réinitialiser le ''watchdog timer'' et le système est redémarré automatiquement ou mis en arrêt. [[File:SimpleWatchdogTimer.gif|centre|vignette|upright=2|Le ''Watchdog Timer'' et l'ordinateur.]] ===Le ''Time Stamp Counter'' des processeurs x86=== Tous les processeurs des PC actuels sont des processeurs dits x86. Nous ne pouvons pas expliquer ce que cela signifie pour le moment, retenez juste ce terme. Sachez que tous les processeurs x86 contiennent un compteur de 64 bits, appelé le '''''Time Stamp Counter''''', qui mémorise le nombre de cycles d'horloge qu'a effectué le processeur depuis son démarrage. Les programmes peuvent accéder à ce registre assez facilement, ce qui est utile pour faire des mesures ou comparer les performances de deux applications. Il permet de compter combien de cycles d'horloge met un morceau de code à s’exécuter, combien de cycles prend une instruction à s’exécuter, etc. Les processeurs non-x86 ont un registre équivalent, que ce soit les processeurs ARM ou d'autres. Malheureusement, ce compteur est tombé en désuétude pour tout un tas de raisons. La principale est que les processeurs actuels font varier leur fréquence suivant les besoins. Ils augmentent leur fréquence quand on leur demande de faire beaucoup de calculs, et se mettent en mode basse(fréquence pour économiser de l'énergie si on ne leur demande pas grand chose. Avec une fréquence variable, le ''Time Stamp Counter'' perd complétement en fiabilité. Intel a tenté de corriger ce défaut en incrémentant ce registre à une fréquence constante, différente de celle du processeur, ce qui est encore le cas sur les processeurs Intel actuels. Le comportement est un peu différent sur les processeurs AMD, qui cadencent ce ''timer'' à la fréquence du processeur mais utilisent des mécanismes de synchronisation assez complexes pour corriger l'effet de la fréquence variable. ===L'horloge temps réel=== L''''horloge temps réel''' est un ''timer'' qui génère une fréquence de 1024 Hz, soit près d'un Kilohertz. Dans ce qui suit, nous la noterons RTC, ce qui est l'acronyme du terme anglais ''Real Time Clock''. La RTC prend en entrée un signal d'horloge de 32KHz, généré par un oscillateur à Quartz, et fournit en sortie un signal de fréquence 32 fois plus faible, c'est à dire de 1 KHz. Pour cela, elle est réglée en mode répétitif et son décompteur interne est initialisé à 32. La RTC génère donc un signal toutes les millisecondes, qui est envoyé au processeur. On peut, en théorie, changer la fréquence de la RTC, mais c'est rarement une bonne idée. En théorie, la RTC permet de compter des durées assez courtes, comme le ''ping'' (le temps de latence d'un réseau, pour simplifier), le temps de rafraichissement de l'écran, ou bien d'autres choses. Mais dans les faits, l'horloge temps réel sa fréquence n'aide pas : 1024 Hz est proche de 1000, mais pas assez pour faire des mesures à la milliseconde près, chose qui est nécessaire pour mesurer le ''ping'' ou d'autres choses utiles. A la place, l'ordinateur l'utilise pour que l'ordinateur soit toujours à l'heure. L'ordinateur sait quelle heure il est avec une précision de l'ordre de la seconde (vous pouvez regarder le bureau de Windows dans le coin inférieur droite de votre écran pour vous en convaincre). ===Le ''Programmable Interval Timer'' : l'Intel 8253=== L'Intel 8253 était un ''timer'' programmable autrefois soudé sur les cartes mères des premiers PC. Il fût suivi par l'Intel 8254, qui en était une légère amélioration. Il était cadencé par une horloge maitre, générée par un oscillateur à Quartz, dont la fréquence est de 32 768 Hertz, soit 2^15 cycles d'horloge par seconde. S'il n'est plus présent dans un boitier sur la carte mère, on trouve toujours un circuit semblable au 8253 à l'intérieur du ''chipset'' de la carte mère, voire à l'intérieur du processeur, pour des raisons de compatibilité. L'intérieur de l'Intel 8253 est illustré ci-dessous. Nous allons expliquer l'ensemble de ce schéma, rassurez-vous, mais les explications seront plus simples à comprendre si vous survolez ce schéma en premier lieu. [[File:Intel 8253 block diagram.svg|centre|vignette|upright=2|Intel 8253, intérieur.]] L'Intel 8253 contient trois compteurs de 16 bits, numérotés 0, 1 et 2. Pour chaque compteur, l'entrée CLOCK est celle de l'horloge de 32 MHz, l'entrée GATE active ou désactive le compteur, la sortie fournit le signal voulu et/ou la fréquence de sortie. Les trois compteurs étaient utilisés pour dériver plusieurs fréquences allant de 18,2 Hz à environ 500 KHz. Par exemple, il était utilisé par défaut pour le rafraichissement de la mémoire (D)RAM, mais il était souvent reprogrammé pour servir à générer des fréquences spécifiques par le BIOS ou la carte graphique. [[File:Intel 8253 and 8254.svg|vignette|Intel 8253 and 8254]] L'Intel 8253 lui-même possède plusieurs entrées et sorties. En premier lieu, on voit un port de 8 bits connecté aux trois compteurs, qui permet à l'Intel 8253 de communiquer avec le reste de l'ordinateur. La communication se fait dans les deux sens : soit de l'ordinateur vers les compteurs, soit des compteurs vers l'ordinateur. Dans le sens ordinateur -> compteurs, cela permet à l'ordinateur de programmer les compteurs, de les initialiser. Dans l'autre sens, cela permet de récupérer le contenu des compteurs, même si ce n'est pas très utilisé. Il y a aussi 5 entrées de configuration : * Deux bits A0 et A1 pour sélectionner le compteur voulu avec son numéro. * Un bit RD à mettre à 0 pour que l'ordinateur récupère le compteur sélectionné sur le port de 8 bits. * Un bit WR à mettre à 0 pour que l'ordinateur modifie le compteur sélectionné, en envoyant le nombre pour l'initialisation sur le port de 8 bits. * Un bit CS qui active ou désactive l'Intel 8253 et permet de l'allumer ou de l’éteindre. L'Intel 8253 intégre un registre de 8 bits, le ''Control Word register'' qui mémorise la configuration de l'Intel 8253. Pour programmer les trois compteurs, il faut écrire un mot de 8 bits dans ce ''Control Word register''. Pour écrire dans le ''Control Word register'', il faut mettre le bit CS à 0 (on active l'Intel 8253), mettre le bit RDà 1 , le bit WR à 0 le bit WR (on indique qu'on fait une écriture), sélectionner le ''Control Word register'' en mettant les deux bits A0 et A1 à 1, puis envoyer la configuration du ''Control Word register'' sur le port de 8 bits. ===Le ''High Precision Event Timer'' (HPET)=== De nos jours, l'horloge temps réel et l'Intel 8253/8254 tendent à être remplacé par un autre ''timer'', le ''High Precision Event Timer'' (HPET). Il s'agit d'un compteur de 64 bits, dont la fréquence est d'au moins 10 MHz. Il s'agit bien d'un compteur et non d'un décompteur. Il gère nativement plusieurs valeurs limites à laquelle générer un signal, qui sont configurables. Pour cela, il est couplé à plusieurs comparateurs, chacun associé à un registre pour mémoriser la valeur limite. Il doit y avoir au moins trois comparateurs/registres, mais le nombre peut monter jusqu’à 256. [[File:High Precision Event Timer.png|centre|vignette|upright=2|High Precision Event Timer]] Il faut noter que les systèmes d'exploitation conçus avant le HPET ne peuvent pas l'utiliser, pour des raisons de compatibilité matérielle. C'est le cas de Windows XP avant le Service Pack 3. C'est la raison pour laquelle les cartes mères émulent RTC et PIT dans leurs circuits. D'ailleurs, pour économiser des circuits, les cartes mères modernes émulent le PIT et la RTC avec le HPET : le premier comparateur fournisse la fréquence de 1024 Hz de la RTC, 3 autres comparateurs remplacent l'Intel 8253. Le HPET gère de nombreux modes de fonctionnement : ses comparateurs peuvent être configuré en mode une fois ou périodique, on peut lui demander d'émuler la RTC et le PIT, etc. Chaque comparateur doit pouvoir fonctionner en mode une fois, et au moins un comparateur doit pouvoir fonctionner en mode périodique. Aussi, il contient aussi 3 registres de configuration. Notons qu'il est aussi possible de lire ou écrire dans le compteur de 64 bits, mais ce n'est pas recommandé. ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les compteurs à rétroaction | nextText=Les compteurs à rétroaction }} </noinclude> nwls8whs9ig8ujjjk2hr9s8n4drjnj2 768079 768078 2026-06-18T17:00:08Z Mewtow 31375 /* L'intérieur d'un compteur */ 768079 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La taille d'un compteur est surtout pertinente sur les compteurs à incrément, elle a moins de pertinence sur les autres compteurs. La plupart des compteurs à incrément comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==L'intérieur d'un compteur== Il existe deux manières pour concevoir un compteur/décompteur avec des portes logique, ces deux manières donnant respectivement les compteurs synchrones et asynchrones. Les termes synchrones et asynchrones sont cependant trompeurs. N'allez pas croire que les compteurs synchrones sont reliés à un signal d'horloge et pas les asynchrones. En réalité, les deux sont reliés à un signal d'horloge, ne serait-ce que parce qu'ils ont un registre à l'intérieur. En réalité, la distinction tient dans la manière dont ils sont conçus. Les '''compteurs synchrones''' sont composés en combinant un registre avec un circuit combinatoire. Le registre mémorise le décompte, le circuit combinatoire calcule la prochaine valeur du compteur. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] Les '''compteurs asynchrones''' sont eux fabriqués en remplaçant le registre par un registre à décalage. ===Les compteurs à incrément synchrones=== Voyons maintenant le cas des compteurs à incrément, de type synchrone. Ils sont composés d'un registre, couplé à un circuit '''incrémenteur'''. Nous avions déjà abordé l'incrémenteur dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs synchrones en cascade=== Il est possible de concevoir des compteurs synchrones à partir de compteurs synchrones plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs synchrones modulo=== Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs synchrones ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les compteurs asynchrones (SIPO ou PIPO)=== Les '''compteurs asynchrones''' sont des compteurs fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Un premier usage des compteurs : les diviseurs de fréquence== Les compteurs servent à créer divers circuits fortement liés la gestion de la fréquence, ainsi qu'à la mesure du temps. Les circuits en question comptent les cycles d'horloge, ce qui demande juste des compteurs automatiquement incrémentés à chaque cycle d'horloge. Compter les cycles d'horloge permet de mesurer des durées, ou de diviser une fréquence. Dans ce qui va suivre, nous allons voire deux types de circuits : les diviseurs de fréquence, et les ''timers''. Les '''diviseurs de fréquence''' sont des circuits qui prennent en entrée un signal d'horloge et fournissent en sortie un autre signal d'horloge de fréquence N fois plus faible. Plus précisément, la fréquence de sortie est 2, 3, 4, ou 18 fois plus faible que la fréquence d'entrée. Il existe des diviseurs de fréquence qui divisent la fréquence par 2, d'autres par 4, d'autres par 13, etc. ===Les diviseurs de fréquence basés sur des compteurs=== Leur implémentation est simple : il suffit d'un compteur auquel on rajoute une sortie. Pour un diviseur de fréquence par N, il faut plus précisément un compteur modulo par N. Tous les N cycles, le compteur déborde, à savoir qu'il dépasse sa valeur maximale et est remis à zéro. Une sortie du compteur indique si le compteur déborde : elle est mise à 1 lors d'un débordement et reste à 0 sinon. L'idée est de compter le nombre de cycles d'horloges, et de mettre à 1 la sortie quand le compteur déborde. Par exemple, pour diviser une fréquence par 8, on prend un compteur 3 bits. A chaque fois que le compteur déborde et est réinitialisé, on envoie un 1 en sortie. Le résultat est un signal qui est à 1 tous les 8 cycles d'horloge, à savoir un signal de fréquence 8 fois inférieure. La même idée marche avec un diviseur de fréquence par 6, sauf que l'on doit alors utiliser un compteur modulo par 6, ce qui veut dire qu'il compte de 0 à 5 comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le compteur déborde tous les 6 cycles d’horloge, ce qui fait que sa sortie de débordement est à 1 tous les 6 cycles, ce qui est demandé. Si n'importe quel compteur fait l'affaire, il est cependant utile d'utiliser les compteurs les plus adaptés à la tâche. Il est rare que l'on doive diviser une fréquence par 50 ou par 100, par exemple. Un diviseur de fréquence divise une fréquence par N, avec N très petit : 4, 6, 8, 10, 12, etc. Or, les compteurs en anneau, sont particulièrement adaptés pour compter jusqu'à des valeurs assez faibles. Il est donc naturel d'utiliser un compteur en anneau dans un diviseur de fréquence. Le circuit obtenu est beaucoup plus simple qu’avec un compteur normal. Et c'est la raison pour laquelle les diviseurs de fréquence sont souvent conçus en utilisant des compteurs ''one-hot''. Plus on divise une fréquence par un N très petit, plus les compteurs auront d'avantages : très simples, demandent peu de portes logiques, sont très rapides, prennent peu de place, permettent de se passer de circuit comparateur. ===Les diviseurs de fréquence basés sur des compteurs à bascule T=== Il est aussi possible de concevoir des diviseurs de fréquence avec des bascules T. La seule contrainte est qu'il faut diviser la fréquence d'entrée par une puissance de deux. Le cas le plus simple divise par 2 la fréquence d'entrée et ne demande qu'une simple bascule T. En effet, regardons ce qui se passe quand on envoie un signal constamment à 1 sur son entrée T. Dans ce cas, la bascule s'inversera une fois par chaque cycle d'horloge. Un cycle d'horloge sur la sortie correspond au temps passé entre deux inversions. [[File:Frequency divider by 2.svg|centre|vignette|upright=2|Diviseur de fréquence par 2.]] Pour créer un diviseur de fréquence par 4, il suffit d'enchainer deux fois le circuit précédent. Et pour créer un diviseur de fréquence par 8, il suffit d'enchainer trois fois le circuit précédent. Et ainsi de suite. Au final, un diviseur de fréquence qui divise la fréquence d'entrée par 2^N est un enchainement de N bascules T. [[File:Freq Divider mod 8.svg|centre|vignette|upright=2|Diviseur de fréquence par 8.]] On peut en profiter pour créer un circuit à plusieurs sorties, en mettant une sortie par bascule. Le circuit, illustré ci-dessous, fournit donc plusieurs fréquences de sortie : une à la moitié de la fréquence initiale, une autre au quart de la fréquence d'entrée, une autre au huitième, etc. [[File:Frequency divider animation.gif|centre|vignette|upright=2|Diviseur de fréquence multiple.]] ==Un autre usage des compteurs : les ''timers''== Les '''''timers''''', aussi appelés ''Programmable interval timer'', sont des circuits capables de compter des durées, exprimées en cycles d'horloge. Leur fonctionnement est assez simple : ils émettent un signal quand un certain nombre de cycles est écoulé, ce nombre de cycles étant configurable. On peut ainsi générer un signal qui surviendra après 50 cycles d'horloge, ou après 100 cycles d'horloge, etc. Le signal en question est disponible sur une sortie de 1 bit, et correspond tout simplement au fait que cette sortie est mise à 1, pendant un cycle d'horloge. Les ''timers'' sont composés d'un compteur/décompteur cadencé par un signal d'horloge. Le compteur initialisé à 0, puis est incrémenté à chaque signal d'horloge, jusqu’à atteinte d'une valeur limite où il génère un signal. Pour un décompteur, c'est la même chose, sauf que le décompteur est initialisé à sa valeur limite et est décrémenté à chaque cycle, et envoie un signal quand il atteint 0. Les ''timers'' basés sur des décompteurs sont nettement plus simples que les autres, ce qui fait qu'ils sont plus utilisés Pour que les ''timers'' soient configurables, on doit pouvoir préciser combien de cycles il faut (dé-)compter avant d'émettre un signal. On peut ainsi préciser s'il faut émettre le signal après 32 cycles d'horloge, après les 50 cycles, tous les 129 cycles, etc. Le nombre de cycles en question est envoyé sur une entrée d’initialisation du compteur. Les ''timers'' matériels peuvent compter de deux manières différentes, appelées '''mode une fois''' et '''mode périodique'''. * En mode une fois, le ''timer'' s'arrête une fois qu'il a atteint la limite configurée. On doit le réinitialiser manuellement, par l'intermédiaire du logiciel, pour l'utiliser une nouvelle fois. Cela permet de compter une certaine durée, exprimée en nombre de cycles d'horloge. * En mode périodique, le ''timer'' se réinitialise automatiquement avec la valeur de départ, ce qui fait qu'il reboucle à l'infini. En clair, le ''timer'' se comporte comme un diviseur de fréquence. Si le compteur est réglé de manière à émettre un signal tous les 9 cycles d'horloge, la fréquence de sortie sera de 9 fois moins celle de la fréquence d'entrée du compteur. Un ordinateur est rempli de ''timers'' divers. Dans ce qui va suivre, nous allons voir les principaux ''timers'', qui sont actuellement intégrés dans les PC modernes. Ils se trouvent sur la carte mère ou dans le processeur, tout dépend du ''timer''. ===Le ''watchdog timer''=== Le '''''watchdog timer''''' est un ''timer'' spécifique dont le but est de redémarrer automatiquement l'ordinateur si jamais celui-ci ne répond plus ou plante. Beaucoup de PC s'en passent, mais ce ''timer'' est très fréquent dans les architectures embarquées. Le ''watchdog timer'' est un compteur/décompteur qui doit être réinitialisé régulièrement. S'il n'est pas réinitialisé, le ''watchdog timer'' déborde (revient à 0 ou atteint 0) et envoie un signal qui redémarre le système. Le système est conçu pour réinitialiser le ''watchdog timer'' régulièrement, ce qui signifie que le système n'est pas censé redémarrer. Si jamais le système dysfonctionne gravement, le système ne pourra pas réinitialiser le ''watchdog timer'' et le système est redémarré automatiquement ou mis en arrêt. [[File:SimpleWatchdogTimer.gif|centre|vignette|upright=2|Le ''Watchdog Timer'' et l'ordinateur.]] ===Le ''Time Stamp Counter'' des processeurs x86=== Tous les processeurs des PC actuels sont des processeurs dits x86. Nous ne pouvons pas expliquer ce que cela signifie pour le moment, retenez juste ce terme. Sachez que tous les processeurs x86 contiennent un compteur de 64 bits, appelé le '''''Time Stamp Counter''''', qui mémorise le nombre de cycles d'horloge qu'a effectué le processeur depuis son démarrage. Les programmes peuvent accéder à ce registre assez facilement, ce qui est utile pour faire des mesures ou comparer les performances de deux applications. Il permet de compter combien de cycles d'horloge met un morceau de code à s’exécuter, combien de cycles prend une instruction à s’exécuter, etc. Les processeurs non-x86 ont un registre équivalent, que ce soit les processeurs ARM ou d'autres. Malheureusement, ce compteur est tombé en désuétude pour tout un tas de raisons. La principale est que les processeurs actuels font varier leur fréquence suivant les besoins. Ils augmentent leur fréquence quand on leur demande de faire beaucoup de calculs, et se mettent en mode basse(fréquence pour économiser de l'énergie si on ne leur demande pas grand chose. Avec une fréquence variable, le ''Time Stamp Counter'' perd complétement en fiabilité. Intel a tenté de corriger ce défaut en incrémentant ce registre à une fréquence constante, différente de celle du processeur, ce qui est encore le cas sur les processeurs Intel actuels. Le comportement est un peu différent sur les processeurs AMD, qui cadencent ce ''timer'' à la fréquence du processeur mais utilisent des mécanismes de synchronisation assez complexes pour corriger l'effet de la fréquence variable. ===L'horloge temps réel=== L''''horloge temps réel''' est un ''timer'' qui génère une fréquence de 1024 Hz, soit près d'un Kilohertz. Dans ce qui suit, nous la noterons RTC, ce qui est l'acronyme du terme anglais ''Real Time Clock''. La RTC prend en entrée un signal d'horloge de 32KHz, généré par un oscillateur à Quartz, et fournit en sortie un signal de fréquence 32 fois plus faible, c'est à dire de 1 KHz. Pour cela, elle est réglée en mode répétitif et son décompteur interne est initialisé à 32. La RTC génère donc un signal toutes les millisecondes, qui est envoyé au processeur. On peut, en théorie, changer la fréquence de la RTC, mais c'est rarement une bonne idée. En théorie, la RTC permet de compter des durées assez courtes, comme le ''ping'' (le temps de latence d'un réseau, pour simplifier), le temps de rafraichissement de l'écran, ou bien d'autres choses. Mais dans les faits, l'horloge temps réel sa fréquence n'aide pas : 1024 Hz est proche de 1000, mais pas assez pour faire des mesures à la milliseconde près, chose qui est nécessaire pour mesurer le ''ping'' ou d'autres choses utiles. A la place, l'ordinateur l'utilise pour que l'ordinateur soit toujours à l'heure. L'ordinateur sait quelle heure il est avec une précision de l'ordre de la seconde (vous pouvez regarder le bureau de Windows dans le coin inférieur droite de votre écran pour vous en convaincre). ===Le ''Programmable Interval Timer'' : l'Intel 8253=== L'Intel 8253 était un ''timer'' programmable autrefois soudé sur les cartes mères des premiers PC. Il fût suivi par l'Intel 8254, qui en était une légère amélioration. Il était cadencé par une horloge maitre, générée par un oscillateur à Quartz, dont la fréquence est de 32 768 Hertz, soit 2^15 cycles d'horloge par seconde. S'il n'est plus présent dans un boitier sur la carte mère, on trouve toujours un circuit semblable au 8253 à l'intérieur du ''chipset'' de la carte mère, voire à l'intérieur du processeur, pour des raisons de compatibilité. L'intérieur de l'Intel 8253 est illustré ci-dessous. Nous allons expliquer l'ensemble de ce schéma, rassurez-vous, mais les explications seront plus simples à comprendre si vous survolez ce schéma en premier lieu. [[File:Intel 8253 block diagram.svg|centre|vignette|upright=2|Intel 8253, intérieur.]] L'Intel 8253 contient trois compteurs de 16 bits, numérotés 0, 1 et 2. Pour chaque compteur, l'entrée CLOCK est celle de l'horloge de 32 MHz, l'entrée GATE active ou désactive le compteur, la sortie fournit le signal voulu et/ou la fréquence de sortie. Les trois compteurs étaient utilisés pour dériver plusieurs fréquences allant de 18,2 Hz à environ 500 KHz. Par exemple, il était utilisé par défaut pour le rafraichissement de la mémoire (D)RAM, mais il était souvent reprogrammé pour servir à générer des fréquences spécifiques par le BIOS ou la carte graphique. [[File:Intel 8253 and 8254.svg|vignette|Intel 8253 and 8254]] L'Intel 8253 lui-même possède plusieurs entrées et sorties. En premier lieu, on voit un port de 8 bits connecté aux trois compteurs, qui permet à l'Intel 8253 de communiquer avec le reste de l'ordinateur. La communication se fait dans les deux sens : soit de l'ordinateur vers les compteurs, soit des compteurs vers l'ordinateur. Dans le sens ordinateur -> compteurs, cela permet à l'ordinateur de programmer les compteurs, de les initialiser. Dans l'autre sens, cela permet de récupérer le contenu des compteurs, même si ce n'est pas très utilisé. Il y a aussi 5 entrées de configuration : * Deux bits A0 et A1 pour sélectionner le compteur voulu avec son numéro. * Un bit RD à mettre à 0 pour que l'ordinateur récupère le compteur sélectionné sur le port de 8 bits. * Un bit WR à mettre à 0 pour que l'ordinateur modifie le compteur sélectionné, en envoyant le nombre pour l'initialisation sur le port de 8 bits. * Un bit CS qui active ou désactive l'Intel 8253 et permet de l'allumer ou de l’éteindre. L'Intel 8253 intégre un registre de 8 bits, le ''Control Word register'' qui mémorise la configuration de l'Intel 8253. Pour programmer les trois compteurs, il faut écrire un mot de 8 bits dans ce ''Control Word register''. Pour écrire dans le ''Control Word register'', il faut mettre le bit CS à 0 (on active l'Intel 8253), mettre le bit RDà 1 , le bit WR à 0 le bit WR (on indique qu'on fait une écriture), sélectionner le ''Control Word register'' en mettant les deux bits A0 et A1 à 1, puis envoyer la configuration du ''Control Word register'' sur le port de 8 bits. ===Le ''High Precision Event Timer'' (HPET)=== De nos jours, l'horloge temps réel et l'Intel 8253/8254 tendent à être remplacé par un autre ''timer'', le ''High Precision Event Timer'' (HPET). Il s'agit d'un compteur de 64 bits, dont la fréquence est d'au moins 10 MHz. Il s'agit bien d'un compteur et non d'un décompteur. Il gère nativement plusieurs valeurs limites à laquelle générer un signal, qui sont configurables. Pour cela, il est couplé à plusieurs comparateurs, chacun associé à un registre pour mémoriser la valeur limite. Il doit y avoir au moins trois comparateurs/registres, mais le nombre peut monter jusqu’à 256. [[File:High Precision Event Timer.png|centre|vignette|upright=2|High Precision Event Timer]] Il faut noter que les systèmes d'exploitation conçus avant le HPET ne peuvent pas l'utiliser, pour des raisons de compatibilité matérielle. C'est le cas de Windows XP avant le Service Pack 3. C'est la raison pour laquelle les cartes mères émulent RTC et PIT dans leurs circuits. D'ailleurs, pour économiser des circuits, les cartes mères modernes émulent le PIT et la RTC avec le HPET : le premier comparateur fournisse la fréquence de 1024 Hz de la RTC, 3 autres comparateurs remplacent l'Intel 8253. Le HPET gère de nombreux modes de fonctionnement : ses comparateurs peuvent être configuré en mode une fois ou périodique, on peut lui demander d'émuler la RTC et le PIT, etc. Chaque comparateur doit pouvoir fonctionner en mode une fois, et au moins un comparateur doit pouvoir fonctionner en mode périodique. Aussi, il contient aussi 3 registres de configuration. Notons qu'il est aussi possible de lire ou écrire dans le compteur de 64 bits, mais ce n'est pas recommandé. ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les compteurs à rétroaction | nextText=Les compteurs à rétroaction }} </noinclude> p12fcjie5o0aly9u29y26ah4fjy2jbq 768080 768079 2026-06-18T17:03:44Z Mewtow 31375 /* L'intérieur d'un compteur */ 768080 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La taille d'un compteur est surtout pertinente sur les compteurs à incrément, elle a moins de pertinence sur les autres compteurs. La plupart des compteurs à incrément comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==L'intérieur d'un compteur== A une exception bien précise qu'on abordera plus bas, les compteurs sont composés d'un registre, qui mémorise le décompte, couplé à un circuit '''incrémenteur'''. Nous avions déjà abordé l'incrémenteur dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] ===Les compteurs à propagation de retenue=== L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs à partir de compteurs plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs modulo=== Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les mal-nommés ''compteurs asynchrones''=== Les '''compteurs asynchrones''' n'utilisent pas de circuit incrémenteur. A la place, ils sont fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Précisons cependant qu'ils sont très mal nommés, à savoir que ce sont bien des circuits synchrones. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Un premier usage des compteurs : les diviseurs de fréquence== Les compteurs servent à créer divers circuits fortement liés la gestion de la fréquence, ainsi qu'à la mesure du temps. Les circuits en question comptent les cycles d'horloge, ce qui demande juste des compteurs automatiquement incrémentés à chaque cycle d'horloge. Compter les cycles d'horloge permet de mesurer des durées, ou de diviser une fréquence. Dans ce qui va suivre, nous allons voire deux types de circuits : les diviseurs de fréquence, et les ''timers''. Les '''diviseurs de fréquence''' sont des circuits qui prennent en entrée un signal d'horloge et fournissent en sortie un autre signal d'horloge de fréquence N fois plus faible. Plus précisément, la fréquence de sortie est 2, 3, 4, ou 18 fois plus faible que la fréquence d'entrée. Il existe des diviseurs de fréquence qui divisent la fréquence par 2, d'autres par 4, d'autres par 13, etc. ===Les diviseurs de fréquence basés sur des compteurs=== Leur implémentation est simple : il suffit d'un compteur auquel on rajoute une sortie. Pour un diviseur de fréquence par N, il faut plus précisément un compteur modulo par N. Tous les N cycles, le compteur déborde, à savoir qu'il dépasse sa valeur maximale et est remis à zéro. Une sortie du compteur indique si le compteur déborde : elle est mise à 1 lors d'un débordement et reste à 0 sinon. L'idée est de compter le nombre de cycles d'horloges, et de mettre à 1 la sortie quand le compteur déborde. Par exemple, pour diviser une fréquence par 8, on prend un compteur 3 bits. A chaque fois que le compteur déborde et est réinitialisé, on envoie un 1 en sortie. Le résultat est un signal qui est à 1 tous les 8 cycles d'horloge, à savoir un signal de fréquence 8 fois inférieure. La même idée marche avec un diviseur de fréquence par 6, sauf que l'on doit alors utiliser un compteur modulo par 6, ce qui veut dire qu'il compte de 0 à 5 comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le compteur déborde tous les 6 cycles d’horloge, ce qui fait que sa sortie de débordement est à 1 tous les 6 cycles, ce qui est demandé. Si n'importe quel compteur fait l'affaire, il est cependant utile d'utiliser les compteurs les plus adaptés à la tâche. Il est rare que l'on doive diviser une fréquence par 50 ou par 100, par exemple. Un diviseur de fréquence divise une fréquence par N, avec N très petit : 4, 6, 8, 10, 12, etc. Or, les compteurs en anneau, sont particulièrement adaptés pour compter jusqu'à des valeurs assez faibles. Il est donc naturel d'utiliser un compteur en anneau dans un diviseur de fréquence. Le circuit obtenu est beaucoup plus simple qu’avec un compteur normal. Et c'est la raison pour laquelle les diviseurs de fréquence sont souvent conçus en utilisant des compteurs ''one-hot''. Plus on divise une fréquence par un N très petit, plus les compteurs auront d'avantages : très simples, demandent peu de portes logiques, sont très rapides, prennent peu de place, permettent de se passer de circuit comparateur. ===Les diviseurs de fréquence basés sur des compteurs à bascule T=== Il est aussi possible de concevoir des diviseurs de fréquence avec des bascules T. La seule contrainte est qu'il faut diviser la fréquence d'entrée par une puissance de deux. Le cas le plus simple divise par 2 la fréquence d'entrée et ne demande qu'une simple bascule T. En effet, regardons ce qui se passe quand on envoie un signal constamment à 1 sur son entrée T. Dans ce cas, la bascule s'inversera une fois par chaque cycle d'horloge. Un cycle d'horloge sur la sortie correspond au temps passé entre deux inversions. [[File:Frequency divider by 2.svg|centre|vignette|upright=2|Diviseur de fréquence par 2.]] Pour créer un diviseur de fréquence par 4, il suffit d'enchainer deux fois le circuit précédent. Et pour créer un diviseur de fréquence par 8, il suffit d'enchainer trois fois le circuit précédent. Et ainsi de suite. Au final, un diviseur de fréquence qui divise la fréquence d'entrée par 2^N est un enchainement de N bascules T. [[File:Freq Divider mod 8.svg|centre|vignette|upright=2|Diviseur de fréquence par 8.]] On peut en profiter pour créer un circuit à plusieurs sorties, en mettant une sortie par bascule. Le circuit, illustré ci-dessous, fournit donc plusieurs fréquences de sortie : une à la moitié de la fréquence initiale, une autre au quart de la fréquence d'entrée, une autre au huitième, etc. [[File:Frequency divider animation.gif|centre|vignette|upright=2|Diviseur de fréquence multiple.]] ==Un autre usage des compteurs : les ''timers''== Les '''''timers''''', aussi appelés ''Programmable interval timer'', sont des circuits capables de compter des durées, exprimées en cycles d'horloge. Leur fonctionnement est assez simple : ils émettent un signal quand un certain nombre de cycles est écoulé, ce nombre de cycles étant configurable. On peut ainsi générer un signal qui surviendra après 50 cycles d'horloge, ou après 100 cycles d'horloge, etc. Le signal en question est disponible sur une sortie de 1 bit, et correspond tout simplement au fait que cette sortie est mise à 1, pendant un cycle d'horloge. Les ''timers'' sont composés d'un compteur/décompteur cadencé par un signal d'horloge. Le compteur initialisé à 0, puis est incrémenté à chaque signal d'horloge, jusqu’à atteinte d'une valeur limite où il génère un signal. Pour un décompteur, c'est la même chose, sauf que le décompteur est initialisé à sa valeur limite et est décrémenté à chaque cycle, et envoie un signal quand il atteint 0. Les ''timers'' basés sur des décompteurs sont nettement plus simples que les autres, ce qui fait qu'ils sont plus utilisés Pour que les ''timers'' soient configurables, on doit pouvoir préciser combien de cycles il faut (dé-)compter avant d'émettre un signal. On peut ainsi préciser s'il faut émettre le signal après 32 cycles d'horloge, après les 50 cycles, tous les 129 cycles, etc. Le nombre de cycles en question est envoyé sur une entrée d’initialisation du compteur. Les ''timers'' matériels peuvent compter de deux manières différentes, appelées '''mode une fois''' et '''mode périodique'''. * En mode une fois, le ''timer'' s'arrête une fois qu'il a atteint la limite configurée. On doit le réinitialiser manuellement, par l'intermédiaire du logiciel, pour l'utiliser une nouvelle fois. Cela permet de compter une certaine durée, exprimée en nombre de cycles d'horloge. * En mode périodique, le ''timer'' se réinitialise automatiquement avec la valeur de départ, ce qui fait qu'il reboucle à l'infini. En clair, le ''timer'' se comporte comme un diviseur de fréquence. Si le compteur est réglé de manière à émettre un signal tous les 9 cycles d'horloge, la fréquence de sortie sera de 9 fois moins celle de la fréquence d'entrée du compteur. Un ordinateur est rempli de ''timers'' divers. Dans ce qui va suivre, nous allons voir les principaux ''timers'', qui sont actuellement intégrés dans les PC modernes. Ils se trouvent sur la carte mère ou dans le processeur, tout dépend du ''timer''. ===Le ''watchdog timer''=== Le '''''watchdog timer''''' est un ''timer'' spécifique dont le but est de redémarrer automatiquement l'ordinateur si jamais celui-ci ne répond plus ou plante. Beaucoup de PC s'en passent, mais ce ''timer'' est très fréquent dans les architectures embarquées. Le ''watchdog timer'' est un compteur/décompteur qui doit être réinitialisé régulièrement. S'il n'est pas réinitialisé, le ''watchdog timer'' déborde (revient à 0 ou atteint 0) et envoie un signal qui redémarre le système. Le système est conçu pour réinitialiser le ''watchdog timer'' régulièrement, ce qui signifie que le système n'est pas censé redémarrer. Si jamais le système dysfonctionne gravement, le système ne pourra pas réinitialiser le ''watchdog timer'' et le système est redémarré automatiquement ou mis en arrêt. [[File:SimpleWatchdogTimer.gif|centre|vignette|upright=2|Le ''Watchdog Timer'' et l'ordinateur.]] ===Le ''Time Stamp Counter'' des processeurs x86=== Tous les processeurs des PC actuels sont des processeurs dits x86. Nous ne pouvons pas expliquer ce que cela signifie pour le moment, retenez juste ce terme. Sachez que tous les processeurs x86 contiennent un compteur de 64 bits, appelé le '''''Time Stamp Counter''''', qui mémorise le nombre de cycles d'horloge qu'a effectué le processeur depuis son démarrage. Les programmes peuvent accéder à ce registre assez facilement, ce qui est utile pour faire des mesures ou comparer les performances de deux applications. Il permet de compter combien de cycles d'horloge met un morceau de code à s’exécuter, combien de cycles prend une instruction à s’exécuter, etc. Les processeurs non-x86 ont un registre équivalent, que ce soit les processeurs ARM ou d'autres. Malheureusement, ce compteur est tombé en désuétude pour tout un tas de raisons. La principale est que les processeurs actuels font varier leur fréquence suivant les besoins. Ils augmentent leur fréquence quand on leur demande de faire beaucoup de calculs, et se mettent en mode basse(fréquence pour économiser de l'énergie si on ne leur demande pas grand chose. Avec une fréquence variable, le ''Time Stamp Counter'' perd complétement en fiabilité. Intel a tenté de corriger ce défaut en incrémentant ce registre à une fréquence constante, différente de celle du processeur, ce qui est encore le cas sur les processeurs Intel actuels. Le comportement est un peu différent sur les processeurs AMD, qui cadencent ce ''timer'' à la fréquence du processeur mais utilisent des mécanismes de synchronisation assez complexes pour corriger l'effet de la fréquence variable. ===L'horloge temps réel=== L''''horloge temps réel''' est un ''timer'' qui génère une fréquence de 1024 Hz, soit près d'un Kilohertz. Dans ce qui suit, nous la noterons RTC, ce qui est l'acronyme du terme anglais ''Real Time Clock''. La RTC prend en entrée un signal d'horloge de 32KHz, généré par un oscillateur à Quartz, et fournit en sortie un signal de fréquence 32 fois plus faible, c'est à dire de 1 KHz. Pour cela, elle est réglée en mode répétitif et son décompteur interne est initialisé à 32. La RTC génère donc un signal toutes les millisecondes, qui est envoyé au processeur. On peut, en théorie, changer la fréquence de la RTC, mais c'est rarement une bonne idée. En théorie, la RTC permet de compter des durées assez courtes, comme le ''ping'' (le temps de latence d'un réseau, pour simplifier), le temps de rafraichissement de l'écran, ou bien d'autres choses. Mais dans les faits, l'horloge temps réel sa fréquence n'aide pas : 1024 Hz est proche de 1000, mais pas assez pour faire des mesures à la milliseconde près, chose qui est nécessaire pour mesurer le ''ping'' ou d'autres choses utiles. A la place, l'ordinateur l'utilise pour que l'ordinateur soit toujours à l'heure. L'ordinateur sait quelle heure il est avec une précision de l'ordre de la seconde (vous pouvez regarder le bureau de Windows dans le coin inférieur droite de votre écran pour vous en convaincre). ===Le ''Programmable Interval Timer'' : l'Intel 8253=== L'Intel 8253 était un ''timer'' programmable autrefois soudé sur les cartes mères des premiers PC. Il fût suivi par l'Intel 8254, qui en était une légère amélioration. Il était cadencé par une horloge maitre, générée par un oscillateur à Quartz, dont la fréquence est de 32 768 Hertz, soit 2^15 cycles d'horloge par seconde. S'il n'est plus présent dans un boitier sur la carte mère, on trouve toujours un circuit semblable au 8253 à l'intérieur du ''chipset'' de la carte mère, voire à l'intérieur du processeur, pour des raisons de compatibilité. L'intérieur de l'Intel 8253 est illustré ci-dessous. Nous allons expliquer l'ensemble de ce schéma, rassurez-vous, mais les explications seront plus simples à comprendre si vous survolez ce schéma en premier lieu. [[File:Intel 8253 block diagram.svg|centre|vignette|upright=2|Intel 8253, intérieur.]] L'Intel 8253 contient trois compteurs de 16 bits, numérotés 0, 1 et 2. Pour chaque compteur, l'entrée CLOCK est celle de l'horloge de 32 MHz, l'entrée GATE active ou désactive le compteur, la sortie fournit le signal voulu et/ou la fréquence de sortie. Les trois compteurs étaient utilisés pour dériver plusieurs fréquences allant de 18,2 Hz à environ 500 KHz. Par exemple, il était utilisé par défaut pour le rafraichissement de la mémoire (D)RAM, mais il était souvent reprogrammé pour servir à générer des fréquences spécifiques par le BIOS ou la carte graphique. [[File:Intel 8253 and 8254.svg|vignette|Intel 8253 and 8254]] L'Intel 8253 lui-même possède plusieurs entrées et sorties. En premier lieu, on voit un port de 8 bits connecté aux trois compteurs, qui permet à l'Intel 8253 de communiquer avec le reste de l'ordinateur. La communication se fait dans les deux sens : soit de l'ordinateur vers les compteurs, soit des compteurs vers l'ordinateur. Dans le sens ordinateur -> compteurs, cela permet à l'ordinateur de programmer les compteurs, de les initialiser. Dans l'autre sens, cela permet de récupérer le contenu des compteurs, même si ce n'est pas très utilisé. Il y a aussi 5 entrées de configuration : * Deux bits A0 et A1 pour sélectionner le compteur voulu avec son numéro. * Un bit RD à mettre à 0 pour que l'ordinateur récupère le compteur sélectionné sur le port de 8 bits. * Un bit WR à mettre à 0 pour que l'ordinateur modifie le compteur sélectionné, en envoyant le nombre pour l'initialisation sur le port de 8 bits. * Un bit CS qui active ou désactive l'Intel 8253 et permet de l'allumer ou de l’éteindre. L'Intel 8253 intégre un registre de 8 bits, le ''Control Word register'' qui mémorise la configuration de l'Intel 8253. Pour programmer les trois compteurs, il faut écrire un mot de 8 bits dans ce ''Control Word register''. Pour écrire dans le ''Control Word register'', il faut mettre le bit CS à 0 (on active l'Intel 8253), mettre le bit RDà 1 , le bit WR à 0 le bit WR (on indique qu'on fait une écriture), sélectionner le ''Control Word register'' en mettant les deux bits A0 et A1 à 1, puis envoyer la configuration du ''Control Word register'' sur le port de 8 bits. ===Le ''High Precision Event Timer'' (HPET)=== De nos jours, l'horloge temps réel et l'Intel 8253/8254 tendent à être remplacé par un autre ''timer'', le ''High Precision Event Timer'' (HPET). Il s'agit d'un compteur de 64 bits, dont la fréquence est d'au moins 10 MHz. Il s'agit bien d'un compteur et non d'un décompteur. Il gère nativement plusieurs valeurs limites à laquelle générer un signal, qui sont configurables. Pour cela, il est couplé à plusieurs comparateurs, chacun associé à un registre pour mémoriser la valeur limite. Il doit y avoir au moins trois comparateurs/registres, mais le nombre peut monter jusqu’à 256. [[File:High Precision Event Timer.png|centre|vignette|upright=2|High Precision Event Timer]] Il faut noter que les systèmes d'exploitation conçus avant le HPET ne peuvent pas l'utiliser, pour des raisons de compatibilité matérielle. C'est le cas de Windows XP avant le Service Pack 3. C'est la raison pour laquelle les cartes mères émulent RTC et PIT dans leurs circuits. D'ailleurs, pour économiser des circuits, les cartes mères modernes émulent le PIT et la RTC avec le HPET : le premier comparateur fournisse la fréquence de 1024 Hz de la RTC, 3 autres comparateurs remplacent l'Intel 8253. Le HPET gère de nombreux modes de fonctionnement : ses comparateurs peuvent être configuré en mode une fois ou périodique, on peut lui demander d'émuler la RTC et le PIT, etc. Chaque comparateur doit pouvoir fonctionner en mode une fois, et au moins un comparateur doit pouvoir fonctionner en mode périodique. Aussi, il contient aussi 3 registres de configuration. Notons qu'il est aussi possible de lire ou écrire dans le compteur de 64 bits, mais ce n'est pas recommandé. ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les compteurs à rétroaction | nextText=Les compteurs à rétroaction }} </noinclude> 4b46w8svnrolcgvgj9pdt569qqpfmrt 768081 768080 2026-06-18T17:04:11Z Mewtow 31375 /* Les compteurs à propagation de retenue */ 768081 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La taille d'un compteur est surtout pertinente sur les compteurs à incrément, elle a moins de pertinence sur les autres compteurs. La plupart des compteurs à incrément comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==L'intérieur d'un compteur== A une exception bien précise qu'on abordera plus bas, les compteurs sont composés d'un registre, qui mémorise le décompte, couplé à un circuit '''incrémenteur'''. Nous avions déjà abordé l'incrémenteur dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs à partir de compteurs plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs modulo=== Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les mal-nommés ''compteurs asynchrones''=== Les '''compteurs asynchrones''' n'utilisent pas de circuit incrémenteur. A la place, ils sont fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Précisons cependant qu'ils sont très mal nommés, à savoir que ce sont bien des circuits synchrones. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Un premier usage des compteurs : les diviseurs de fréquence== Les compteurs servent à créer divers circuits fortement liés la gestion de la fréquence, ainsi qu'à la mesure du temps. Les circuits en question comptent les cycles d'horloge, ce qui demande juste des compteurs automatiquement incrémentés à chaque cycle d'horloge. Compter les cycles d'horloge permet de mesurer des durées, ou de diviser une fréquence. Dans ce qui va suivre, nous allons voire deux types de circuits : les diviseurs de fréquence, et les ''timers''. Les '''diviseurs de fréquence''' sont des circuits qui prennent en entrée un signal d'horloge et fournissent en sortie un autre signal d'horloge de fréquence N fois plus faible. Plus précisément, la fréquence de sortie est 2, 3, 4, ou 18 fois plus faible que la fréquence d'entrée. Il existe des diviseurs de fréquence qui divisent la fréquence par 2, d'autres par 4, d'autres par 13, etc. ===Les diviseurs de fréquence basés sur des compteurs=== Leur implémentation est simple : il suffit d'un compteur auquel on rajoute une sortie. Pour un diviseur de fréquence par N, il faut plus précisément un compteur modulo par N. Tous les N cycles, le compteur déborde, à savoir qu'il dépasse sa valeur maximale et est remis à zéro. Une sortie du compteur indique si le compteur déborde : elle est mise à 1 lors d'un débordement et reste à 0 sinon. L'idée est de compter le nombre de cycles d'horloges, et de mettre à 1 la sortie quand le compteur déborde. Par exemple, pour diviser une fréquence par 8, on prend un compteur 3 bits. A chaque fois que le compteur déborde et est réinitialisé, on envoie un 1 en sortie. Le résultat est un signal qui est à 1 tous les 8 cycles d'horloge, à savoir un signal de fréquence 8 fois inférieure. La même idée marche avec un diviseur de fréquence par 6, sauf que l'on doit alors utiliser un compteur modulo par 6, ce qui veut dire qu'il compte de 0 à 5 comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le compteur déborde tous les 6 cycles d’horloge, ce qui fait que sa sortie de débordement est à 1 tous les 6 cycles, ce qui est demandé. Si n'importe quel compteur fait l'affaire, il est cependant utile d'utiliser les compteurs les plus adaptés à la tâche. Il est rare que l'on doive diviser une fréquence par 50 ou par 100, par exemple. Un diviseur de fréquence divise une fréquence par N, avec N très petit : 4, 6, 8, 10, 12, etc. Or, les compteurs en anneau, sont particulièrement adaptés pour compter jusqu'à des valeurs assez faibles. Il est donc naturel d'utiliser un compteur en anneau dans un diviseur de fréquence. Le circuit obtenu est beaucoup plus simple qu’avec un compteur normal. Et c'est la raison pour laquelle les diviseurs de fréquence sont souvent conçus en utilisant des compteurs ''one-hot''. Plus on divise une fréquence par un N très petit, plus les compteurs auront d'avantages : très simples, demandent peu de portes logiques, sont très rapides, prennent peu de place, permettent de se passer de circuit comparateur. ===Les diviseurs de fréquence basés sur des compteurs à bascule T=== Il est aussi possible de concevoir des diviseurs de fréquence avec des bascules T. La seule contrainte est qu'il faut diviser la fréquence d'entrée par une puissance de deux. Le cas le plus simple divise par 2 la fréquence d'entrée et ne demande qu'une simple bascule T. En effet, regardons ce qui se passe quand on envoie un signal constamment à 1 sur son entrée T. Dans ce cas, la bascule s'inversera une fois par chaque cycle d'horloge. Un cycle d'horloge sur la sortie correspond au temps passé entre deux inversions. [[File:Frequency divider by 2.svg|centre|vignette|upright=2|Diviseur de fréquence par 2.]] Pour créer un diviseur de fréquence par 4, il suffit d'enchainer deux fois le circuit précédent. Et pour créer un diviseur de fréquence par 8, il suffit d'enchainer trois fois le circuit précédent. Et ainsi de suite. Au final, un diviseur de fréquence qui divise la fréquence d'entrée par 2^N est un enchainement de N bascules T. [[File:Freq Divider mod 8.svg|centre|vignette|upright=2|Diviseur de fréquence par 8.]] On peut en profiter pour créer un circuit à plusieurs sorties, en mettant une sortie par bascule. Le circuit, illustré ci-dessous, fournit donc plusieurs fréquences de sortie : une à la moitié de la fréquence initiale, une autre au quart de la fréquence d'entrée, une autre au huitième, etc. [[File:Frequency divider animation.gif|centre|vignette|upright=2|Diviseur de fréquence multiple.]] ==Un autre usage des compteurs : les ''timers''== Les '''''timers''''', aussi appelés ''Programmable interval timer'', sont des circuits capables de compter des durées, exprimées en cycles d'horloge. Leur fonctionnement est assez simple : ils émettent un signal quand un certain nombre de cycles est écoulé, ce nombre de cycles étant configurable. On peut ainsi générer un signal qui surviendra après 50 cycles d'horloge, ou après 100 cycles d'horloge, etc. Le signal en question est disponible sur une sortie de 1 bit, et correspond tout simplement au fait que cette sortie est mise à 1, pendant un cycle d'horloge. Les ''timers'' sont composés d'un compteur/décompteur cadencé par un signal d'horloge. Le compteur initialisé à 0, puis est incrémenté à chaque signal d'horloge, jusqu’à atteinte d'une valeur limite où il génère un signal. Pour un décompteur, c'est la même chose, sauf que le décompteur est initialisé à sa valeur limite et est décrémenté à chaque cycle, et envoie un signal quand il atteint 0. Les ''timers'' basés sur des décompteurs sont nettement plus simples que les autres, ce qui fait qu'ils sont plus utilisés Pour que les ''timers'' soient configurables, on doit pouvoir préciser combien de cycles il faut (dé-)compter avant d'émettre un signal. On peut ainsi préciser s'il faut émettre le signal après 32 cycles d'horloge, après les 50 cycles, tous les 129 cycles, etc. Le nombre de cycles en question est envoyé sur une entrée d’initialisation du compteur. Les ''timers'' matériels peuvent compter de deux manières différentes, appelées '''mode une fois''' et '''mode périodique'''. * En mode une fois, le ''timer'' s'arrête une fois qu'il a atteint la limite configurée. On doit le réinitialiser manuellement, par l'intermédiaire du logiciel, pour l'utiliser une nouvelle fois. Cela permet de compter une certaine durée, exprimée en nombre de cycles d'horloge. * En mode périodique, le ''timer'' se réinitialise automatiquement avec la valeur de départ, ce qui fait qu'il reboucle à l'infini. En clair, le ''timer'' se comporte comme un diviseur de fréquence. Si le compteur est réglé de manière à émettre un signal tous les 9 cycles d'horloge, la fréquence de sortie sera de 9 fois moins celle de la fréquence d'entrée du compteur. Un ordinateur est rempli de ''timers'' divers. Dans ce qui va suivre, nous allons voir les principaux ''timers'', qui sont actuellement intégrés dans les PC modernes. Ils se trouvent sur la carte mère ou dans le processeur, tout dépend du ''timer''. ===Le ''watchdog timer''=== Le '''''watchdog timer''''' est un ''timer'' spécifique dont le but est de redémarrer automatiquement l'ordinateur si jamais celui-ci ne répond plus ou plante. Beaucoup de PC s'en passent, mais ce ''timer'' est très fréquent dans les architectures embarquées. Le ''watchdog timer'' est un compteur/décompteur qui doit être réinitialisé régulièrement. S'il n'est pas réinitialisé, le ''watchdog timer'' déborde (revient à 0 ou atteint 0) et envoie un signal qui redémarre le système. Le système est conçu pour réinitialiser le ''watchdog timer'' régulièrement, ce qui signifie que le système n'est pas censé redémarrer. Si jamais le système dysfonctionne gravement, le système ne pourra pas réinitialiser le ''watchdog timer'' et le système est redémarré automatiquement ou mis en arrêt. [[File:SimpleWatchdogTimer.gif|centre|vignette|upright=2|Le ''Watchdog Timer'' et l'ordinateur.]] ===Le ''Time Stamp Counter'' des processeurs x86=== Tous les processeurs des PC actuels sont des processeurs dits x86. Nous ne pouvons pas expliquer ce que cela signifie pour le moment, retenez juste ce terme. Sachez que tous les processeurs x86 contiennent un compteur de 64 bits, appelé le '''''Time Stamp Counter''''', qui mémorise le nombre de cycles d'horloge qu'a effectué le processeur depuis son démarrage. Les programmes peuvent accéder à ce registre assez facilement, ce qui est utile pour faire des mesures ou comparer les performances de deux applications. Il permet de compter combien de cycles d'horloge met un morceau de code à s’exécuter, combien de cycles prend une instruction à s’exécuter, etc. Les processeurs non-x86 ont un registre équivalent, que ce soit les processeurs ARM ou d'autres. Malheureusement, ce compteur est tombé en désuétude pour tout un tas de raisons. La principale est que les processeurs actuels font varier leur fréquence suivant les besoins. Ils augmentent leur fréquence quand on leur demande de faire beaucoup de calculs, et se mettent en mode basse(fréquence pour économiser de l'énergie si on ne leur demande pas grand chose. Avec une fréquence variable, le ''Time Stamp Counter'' perd complétement en fiabilité. Intel a tenté de corriger ce défaut en incrémentant ce registre à une fréquence constante, différente de celle du processeur, ce qui est encore le cas sur les processeurs Intel actuels. Le comportement est un peu différent sur les processeurs AMD, qui cadencent ce ''timer'' à la fréquence du processeur mais utilisent des mécanismes de synchronisation assez complexes pour corriger l'effet de la fréquence variable. ===L'horloge temps réel=== L''''horloge temps réel''' est un ''timer'' qui génère une fréquence de 1024 Hz, soit près d'un Kilohertz. Dans ce qui suit, nous la noterons RTC, ce qui est l'acronyme du terme anglais ''Real Time Clock''. La RTC prend en entrée un signal d'horloge de 32KHz, généré par un oscillateur à Quartz, et fournit en sortie un signal de fréquence 32 fois plus faible, c'est à dire de 1 KHz. Pour cela, elle est réglée en mode répétitif et son décompteur interne est initialisé à 32. La RTC génère donc un signal toutes les millisecondes, qui est envoyé au processeur. On peut, en théorie, changer la fréquence de la RTC, mais c'est rarement une bonne idée. En théorie, la RTC permet de compter des durées assez courtes, comme le ''ping'' (le temps de latence d'un réseau, pour simplifier), le temps de rafraichissement de l'écran, ou bien d'autres choses. Mais dans les faits, l'horloge temps réel sa fréquence n'aide pas : 1024 Hz est proche de 1000, mais pas assez pour faire des mesures à la milliseconde près, chose qui est nécessaire pour mesurer le ''ping'' ou d'autres choses utiles. A la place, l'ordinateur l'utilise pour que l'ordinateur soit toujours à l'heure. L'ordinateur sait quelle heure il est avec une précision de l'ordre de la seconde (vous pouvez regarder le bureau de Windows dans le coin inférieur droite de votre écran pour vous en convaincre). ===Le ''Programmable Interval Timer'' : l'Intel 8253=== L'Intel 8253 était un ''timer'' programmable autrefois soudé sur les cartes mères des premiers PC. Il fût suivi par l'Intel 8254, qui en était une légère amélioration. Il était cadencé par une horloge maitre, générée par un oscillateur à Quartz, dont la fréquence est de 32 768 Hertz, soit 2^15 cycles d'horloge par seconde. S'il n'est plus présent dans un boitier sur la carte mère, on trouve toujours un circuit semblable au 8253 à l'intérieur du ''chipset'' de la carte mère, voire à l'intérieur du processeur, pour des raisons de compatibilité. L'intérieur de l'Intel 8253 est illustré ci-dessous. Nous allons expliquer l'ensemble de ce schéma, rassurez-vous, mais les explications seront plus simples à comprendre si vous survolez ce schéma en premier lieu. [[File:Intel 8253 block diagram.svg|centre|vignette|upright=2|Intel 8253, intérieur.]] L'Intel 8253 contient trois compteurs de 16 bits, numérotés 0, 1 et 2. Pour chaque compteur, l'entrée CLOCK est celle de l'horloge de 32 MHz, l'entrée GATE active ou désactive le compteur, la sortie fournit le signal voulu et/ou la fréquence de sortie. Les trois compteurs étaient utilisés pour dériver plusieurs fréquences allant de 18,2 Hz à environ 500 KHz. Par exemple, il était utilisé par défaut pour le rafraichissement de la mémoire (D)RAM, mais il était souvent reprogrammé pour servir à générer des fréquences spécifiques par le BIOS ou la carte graphique. [[File:Intel 8253 and 8254.svg|vignette|Intel 8253 and 8254]] L'Intel 8253 lui-même possède plusieurs entrées et sorties. En premier lieu, on voit un port de 8 bits connecté aux trois compteurs, qui permet à l'Intel 8253 de communiquer avec le reste de l'ordinateur. La communication se fait dans les deux sens : soit de l'ordinateur vers les compteurs, soit des compteurs vers l'ordinateur. Dans le sens ordinateur -> compteurs, cela permet à l'ordinateur de programmer les compteurs, de les initialiser. Dans l'autre sens, cela permet de récupérer le contenu des compteurs, même si ce n'est pas très utilisé. Il y a aussi 5 entrées de configuration : * Deux bits A0 et A1 pour sélectionner le compteur voulu avec son numéro. * Un bit RD à mettre à 0 pour que l'ordinateur récupère le compteur sélectionné sur le port de 8 bits. * Un bit WR à mettre à 0 pour que l'ordinateur modifie le compteur sélectionné, en envoyant le nombre pour l'initialisation sur le port de 8 bits. * Un bit CS qui active ou désactive l'Intel 8253 et permet de l'allumer ou de l’éteindre. L'Intel 8253 intégre un registre de 8 bits, le ''Control Word register'' qui mémorise la configuration de l'Intel 8253. Pour programmer les trois compteurs, il faut écrire un mot de 8 bits dans ce ''Control Word register''. Pour écrire dans le ''Control Word register'', il faut mettre le bit CS à 0 (on active l'Intel 8253), mettre le bit RDà 1 , le bit WR à 0 le bit WR (on indique qu'on fait une écriture), sélectionner le ''Control Word register'' en mettant les deux bits A0 et A1 à 1, puis envoyer la configuration du ''Control Word register'' sur le port de 8 bits. ===Le ''High Precision Event Timer'' (HPET)=== De nos jours, l'horloge temps réel et l'Intel 8253/8254 tendent à être remplacé par un autre ''timer'', le ''High Precision Event Timer'' (HPET). Il s'agit d'un compteur de 64 bits, dont la fréquence est d'au moins 10 MHz. Il s'agit bien d'un compteur et non d'un décompteur. Il gère nativement plusieurs valeurs limites à laquelle générer un signal, qui sont configurables. Pour cela, il est couplé à plusieurs comparateurs, chacun associé à un registre pour mémoriser la valeur limite. Il doit y avoir au moins trois comparateurs/registres, mais le nombre peut monter jusqu’à 256. [[File:High Precision Event Timer.png|centre|vignette|upright=2|High Precision Event Timer]] Il faut noter que les systèmes d'exploitation conçus avant le HPET ne peuvent pas l'utiliser, pour des raisons de compatibilité matérielle. C'est le cas de Windows XP avant le Service Pack 3. C'est la raison pour laquelle les cartes mères émulent RTC et PIT dans leurs circuits. D'ailleurs, pour économiser des circuits, les cartes mères modernes émulent le PIT et la RTC avec le HPET : le premier comparateur fournisse la fréquence de 1024 Hz de la RTC, 3 autres comparateurs remplacent l'Intel 8253. Le HPET gère de nombreux modes de fonctionnement : ses comparateurs peuvent être configuré en mode une fois ou périodique, on peut lui demander d'émuler la RTC et le PIT, etc. Chaque comparateur doit pouvoir fonctionner en mode une fois, et au moins un comparateur doit pouvoir fonctionner en mode périodique. Aussi, il contient aussi 3 registres de configuration. Notons qu'il est aussi possible de lire ou écrire dans le compteur de 64 bits, mais ce n'est pas recommandé. ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les compteurs à rétroaction | nextText=Les compteurs à rétroaction }} </noinclude> arufuuqpmniqk8uawbpt1rlglfwtxl9 768082 768081 2026-06-18T17:04:57Z Mewtow 31375 768082 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La taille d'un compteur est surtout pertinente sur les compteurs à incrément, elle a moins de pertinence sur les autres compteurs. La plupart des compteurs à incrément comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==L'intérieur d'un compteur== A une exception bien précise qu'on abordera plus bas, les compteurs sont composés d'un registre, qui mémorise le décompte, couplé à un circuit '''incrémenteur'''. Nous avions déjà abordé l'incrémenteur dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique]] L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs à partir de compteurs plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs modulo=== Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les mal-nommés ''compteurs asynchrones''=== Les '''compteurs asynchrones''' n'utilisent pas de circuit incrémenteur. A la place, ils sont fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Précisons cependant qu'ils sont très mal nommés, à savoir que ce sont bien des circuits synchrones. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les diviseurs de fréquence : compter des cycles d'horloge== Les compteurs servent à créer divers circuits fortement liés la gestion de la fréquence, ainsi qu'à la mesure du temps. Les circuits en question comptent les cycles d'horloge, ce qui demande juste des compteurs automatiquement incrémentés à chaque cycle d'horloge. Compter les cycles d'horloge permet de mesurer des durées, ou de diviser une fréquence. Dans ce qui va suivre, nous allons voire deux types de circuits : les diviseurs de fréquence, et les ''timers''. Les '''diviseurs de fréquence''' sont des circuits qui prennent en entrée un signal d'horloge et fournissent en sortie un autre signal d'horloge de fréquence N fois plus faible. Plus précisément, la fréquence de sortie est 2, 3, 4, ou 18 fois plus faible que la fréquence d'entrée. Il existe des diviseurs de fréquence qui divisent la fréquence par 2, d'autres par 4, d'autres par 13, etc. ===Les diviseurs de fréquence basés sur des compteurs=== Leur implémentation est simple : il suffit d'un compteur auquel on rajoute une sortie. Pour un diviseur de fréquence par N, il faut plus précisément un compteur modulo par N. Tous les N cycles, le compteur déborde, à savoir qu'il dépasse sa valeur maximale et est remis à zéro. Une sortie du compteur indique si le compteur déborde : elle est mise à 1 lors d'un débordement et reste à 0 sinon. L'idée est de compter le nombre de cycles d'horloges, et de mettre à 1 la sortie quand le compteur déborde. Par exemple, pour diviser une fréquence par 8, on prend un compteur 3 bits. A chaque fois que le compteur déborde et est réinitialisé, on envoie un 1 en sortie. Le résultat est un signal qui est à 1 tous les 8 cycles d'horloge, à savoir un signal de fréquence 8 fois inférieure. La même idée marche avec un diviseur de fréquence par 6, sauf que l'on doit alors utiliser un compteur modulo par 6, ce qui veut dire qu'il compte de 0 à 5 comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le compteur déborde tous les 6 cycles d’horloge, ce qui fait que sa sortie de débordement est à 1 tous les 6 cycles, ce qui est demandé. Si n'importe quel compteur fait l'affaire, il est cependant utile d'utiliser les compteurs les plus adaptés à la tâche. Il est rare que l'on doive diviser une fréquence par 50 ou par 100, par exemple. Un diviseur de fréquence divise une fréquence par N, avec N très petit : 4, 6, 8, 10, 12, etc. Or, les compteurs en anneau, sont particulièrement adaptés pour compter jusqu'à des valeurs assez faibles. Il est donc naturel d'utiliser un compteur en anneau dans un diviseur de fréquence. Le circuit obtenu est beaucoup plus simple qu’avec un compteur normal. Et c'est la raison pour laquelle les diviseurs de fréquence sont souvent conçus en utilisant des compteurs ''one-hot''. Plus on divise une fréquence par un N très petit, plus les compteurs auront d'avantages : très simples, demandent peu de portes logiques, sont très rapides, prennent peu de place, permettent de se passer de circuit comparateur. ===Les diviseurs de fréquence basés sur des compteurs à bascule T=== Il est aussi possible de concevoir des diviseurs de fréquence avec des bascules T. La seule contrainte est qu'il faut diviser la fréquence d'entrée par une puissance de deux. Le cas le plus simple divise par 2 la fréquence d'entrée et ne demande qu'une simple bascule T. En effet, regardons ce qui se passe quand on envoie un signal constamment à 1 sur son entrée T. Dans ce cas, la bascule s'inversera une fois par chaque cycle d'horloge. Un cycle d'horloge sur la sortie correspond au temps passé entre deux inversions. [[File:Frequency divider by 2.svg|centre|vignette|upright=2|Diviseur de fréquence par 2.]] Pour créer un diviseur de fréquence par 4, il suffit d'enchainer deux fois le circuit précédent. Et pour créer un diviseur de fréquence par 8, il suffit d'enchainer trois fois le circuit précédent. Et ainsi de suite. Au final, un diviseur de fréquence qui divise la fréquence d'entrée par 2^N est un enchainement de N bascules T. [[File:Freq Divider mod 8.svg|centre|vignette|upright=2|Diviseur de fréquence par 8.]] On peut en profiter pour créer un circuit à plusieurs sorties, en mettant une sortie par bascule. Le circuit, illustré ci-dessous, fournit donc plusieurs fréquences de sortie : une à la moitié de la fréquence initiale, une autre au quart de la fréquence d'entrée, une autre au huitième, etc. [[File:Frequency divider animation.gif|centre|vignette|upright=2|Diviseur de fréquence multiple.]] ==Les ''timers'' : compter des durées== Les '''''timers''''', aussi appelés ''Programmable interval timer'', sont des circuits capables de compter des durées, exprimées en cycles d'horloge. Leur fonctionnement est assez simple : ils émettent un signal quand un certain nombre de cycles est écoulé, ce nombre de cycles étant configurable. On peut ainsi générer un signal qui surviendra après 50 cycles d'horloge, ou après 100 cycles d'horloge, etc. Le signal en question est disponible sur une sortie de 1 bit, et correspond tout simplement au fait que cette sortie est mise à 1, pendant un cycle d'horloge. Les ''timers'' sont composés d'un compteur/décompteur cadencé par un signal d'horloge. Le compteur initialisé à 0, puis est incrémenté à chaque signal d'horloge, jusqu’à atteinte d'une valeur limite où il génère un signal. Pour un décompteur, c'est la même chose, sauf que le décompteur est initialisé à sa valeur limite et est décrémenté à chaque cycle, et envoie un signal quand il atteint 0. Les ''timers'' basés sur des décompteurs sont nettement plus simples que les autres, ce qui fait qu'ils sont plus utilisés Pour que les ''timers'' soient configurables, on doit pouvoir préciser combien de cycles il faut (dé-)compter avant d'émettre un signal. On peut ainsi préciser s'il faut émettre le signal après 32 cycles d'horloge, après les 50 cycles, tous les 129 cycles, etc. Le nombre de cycles en question est envoyé sur une entrée d’initialisation du compteur. Les ''timers'' matériels peuvent compter de deux manières différentes, appelées '''mode une fois''' et '''mode périodique'''. * En mode une fois, le ''timer'' s'arrête une fois qu'il a atteint la limite configurée. On doit le réinitialiser manuellement, par l'intermédiaire du logiciel, pour l'utiliser une nouvelle fois. Cela permet de compter une certaine durée, exprimée en nombre de cycles d'horloge. * En mode périodique, le ''timer'' se réinitialise automatiquement avec la valeur de départ, ce qui fait qu'il reboucle à l'infini. En clair, le ''timer'' se comporte comme un diviseur de fréquence. Si le compteur est réglé de manière à émettre un signal tous les 9 cycles d'horloge, la fréquence de sortie sera de 9 fois moins celle de la fréquence d'entrée du compteur. Un ordinateur est rempli de ''timers'' divers. Dans ce qui va suivre, nous allons voir les principaux ''timers'', qui sont actuellement intégrés dans les PC modernes. Ils se trouvent sur la carte mère ou dans le processeur, tout dépend du ''timer''. ===Le ''watchdog timer''=== Le '''''watchdog timer''''' est un ''timer'' spécifique dont le but est de redémarrer automatiquement l'ordinateur si jamais celui-ci ne répond plus ou plante. Beaucoup de PC s'en passent, mais ce ''timer'' est très fréquent dans les architectures embarquées. Le ''watchdog timer'' est un compteur/décompteur qui doit être réinitialisé régulièrement. S'il n'est pas réinitialisé, le ''watchdog timer'' déborde (revient à 0 ou atteint 0) et envoie un signal qui redémarre le système. Le système est conçu pour réinitialiser le ''watchdog timer'' régulièrement, ce qui signifie que le système n'est pas censé redémarrer. Si jamais le système dysfonctionne gravement, le système ne pourra pas réinitialiser le ''watchdog timer'' et le système est redémarré automatiquement ou mis en arrêt. [[File:SimpleWatchdogTimer.gif|centre|vignette|upright=2|Le ''Watchdog Timer'' et l'ordinateur.]] ===Le ''Time Stamp Counter'' des processeurs x86=== Tous les processeurs des PC actuels sont des processeurs dits x86. Nous ne pouvons pas expliquer ce que cela signifie pour le moment, retenez juste ce terme. Sachez que tous les processeurs x86 contiennent un compteur de 64 bits, appelé le '''''Time Stamp Counter''''', qui mémorise le nombre de cycles d'horloge qu'a effectué le processeur depuis son démarrage. Les programmes peuvent accéder à ce registre assez facilement, ce qui est utile pour faire des mesures ou comparer les performances de deux applications. Il permet de compter combien de cycles d'horloge met un morceau de code à s’exécuter, combien de cycles prend une instruction à s’exécuter, etc. Les processeurs non-x86 ont un registre équivalent, que ce soit les processeurs ARM ou d'autres. Malheureusement, ce compteur est tombé en désuétude pour tout un tas de raisons. La principale est que les processeurs actuels font varier leur fréquence suivant les besoins. Ils augmentent leur fréquence quand on leur demande de faire beaucoup de calculs, et se mettent en mode basse(fréquence pour économiser de l'énergie si on ne leur demande pas grand chose. Avec une fréquence variable, le ''Time Stamp Counter'' perd complétement en fiabilité. Intel a tenté de corriger ce défaut en incrémentant ce registre à une fréquence constante, différente de celle du processeur, ce qui est encore le cas sur les processeurs Intel actuels. Le comportement est un peu différent sur les processeurs AMD, qui cadencent ce ''timer'' à la fréquence du processeur mais utilisent des mécanismes de synchronisation assez complexes pour corriger l'effet de la fréquence variable. ===L'horloge temps réel=== L''''horloge temps réel''' est un ''timer'' qui génère une fréquence de 1024 Hz, soit près d'un Kilohertz. Dans ce qui suit, nous la noterons RTC, ce qui est l'acronyme du terme anglais ''Real Time Clock''. La RTC prend en entrée un signal d'horloge de 32KHz, généré par un oscillateur à Quartz, et fournit en sortie un signal de fréquence 32 fois plus faible, c'est à dire de 1 KHz. Pour cela, elle est réglée en mode répétitif et son décompteur interne est initialisé à 32. La RTC génère donc un signal toutes les millisecondes, qui est envoyé au processeur. On peut, en théorie, changer la fréquence de la RTC, mais c'est rarement une bonne idée. En théorie, la RTC permet de compter des durées assez courtes, comme le ''ping'' (le temps de latence d'un réseau, pour simplifier), le temps de rafraichissement de l'écran, ou bien d'autres choses. Mais dans les faits, l'horloge temps réel sa fréquence n'aide pas : 1024 Hz est proche de 1000, mais pas assez pour faire des mesures à la milliseconde près, chose qui est nécessaire pour mesurer le ''ping'' ou d'autres choses utiles. A la place, l'ordinateur l'utilise pour que l'ordinateur soit toujours à l'heure. L'ordinateur sait quelle heure il est avec une précision de l'ordre de la seconde (vous pouvez regarder le bureau de Windows dans le coin inférieur droite de votre écran pour vous en convaincre). ===Le ''Programmable Interval Timer'' : l'Intel 8253=== L'Intel 8253 était un ''timer'' programmable autrefois soudé sur les cartes mères des premiers PC. Il fût suivi par l'Intel 8254, qui en était une légère amélioration. Il était cadencé par une horloge maitre, générée par un oscillateur à Quartz, dont la fréquence est de 32 768 Hertz, soit 2^15 cycles d'horloge par seconde. S'il n'est plus présent dans un boitier sur la carte mère, on trouve toujours un circuit semblable au 8253 à l'intérieur du ''chipset'' de la carte mère, voire à l'intérieur du processeur, pour des raisons de compatibilité. L'intérieur de l'Intel 8253 est illustré ci-dessous. Nous allons expliquer l'ensemble de ce schéma, rassurez-vous, mais les explications seront plus simples à comprendre si vous survolez ce schéma en premier lieu. [[File:Intel 8253 block diagram.svg|centre|vignette|upright=2|Intel 8253, intérieur.]] L'Intel 8253 contient trois compteurs de 16 bits, numérotés 0, 1 et 2. Pour chaque compteur, l'entrée CLOCK est celle de l'horloge de 32 MHz, l'entrée GATE active ou désactive le compteur, la sortie fournit le signal voulu et/ou la fréquence de sortie. Les trois compteurs étaient utilisés pour dériver plusieurs fréquences allant de 18,2 Hz à environ 500 KHz. Par exemple, il était utilisé par défaut pour le rafraichissement de la mémoire (D)RAM, mais il était souvent reprogrammé pour servir à générer des fréquences spécifiques par le BIOS ou la carte graphique. [[File:Intel 8253 and 8254.svg|vignette|Intel 8253 and 8254]] L'Intel 8253 lui-même possède plusieurs entrées et sorties. En premier lieu, on voit un port de 8 bits connecté aux trois compteurs, qui permet à l'Intel 8253 de communiquer avec le reste de l'ordinateur. La communication se fait dans les deux sens : soit de l'ordinateur vers les compteurs, soit des compteurs vers l'ordinateur. Dans le sens ordinateur -> compteurs, cela permet à l'ordinateur de programmer les compteurs, de les initialiser. Dans l'autre sens, cela permet de récupérer le contenu des compteurs, même si ce n'est pas très utilisé. Il y a aussi 5 entrées de configuration : * Deux bits A0 et A1 pour sélectionner le compteur voulu avec son numéro. * Un bit RD à mettre à 0 pour que l'ordinateur récupère le compteur sélectionné sur le port de 8 bits. * Un bit WR à mettre à 0 pour que l'ordinateur modifie le compteur sélectionné, en envoyant le nombre pour l'initialisation sur le port de 8 bits. * Un bit CS qui active ou désactive l'Intel 8253 et permet de l'allumer ou de l’éteindre. L'Intel 8253 intégre un registre de 8 bits, le ''Control Word register'' qui mémorise la configuration de l'Intel 8253. Pour programmer les trois compteurs, il faut écrire un mot de 8 bits dans ce ''Control Word register''. Pour écrire dans le ''Control Word register'', il faut mettre le bit CS à 0 (on active l'Intel 8253), mettre le bit RDà 1 , le bit WR à 0 le bit WR (on indique qu'on fait une écriture), sélectionner le ''Control Word register'' en mettant les deux bits A0 et A1 à 1, puis envoyer la configuration du ''Control Word register'' sur le port de 8 bits. ===Le ''High Precision Event Timer'' (HPET)=== De nos jours, l'horloge temps réel et l'Intel 8253/8254 tendent à être remplacé par un autre ''timer'', le ''High Precision Event Timer'' (HPET). Il s'agit d'un compteur de 64 bits, dont la fréquence est d'au moins 10 MHz. Il s'agit bien d'un compteur et non d'un décompteur. Il gère nativement plusieurs valeurs limites à laquelle générer un signal, qui sont configurables. Pour cela, il est couplé à plusieurs comparateurs, chacun associé à un registre pour mémoriser la valeur limite. Il doit y avoir au moins trois comparateurs/registres, mais le nombre peut monter jusqu’à 256. [[File:High Precision Event Timer.png|centre|vignette|upright=2|High Precision Event Timer]] Il faut noter que les systèmes d'exploitation conçus avant le HPET ne peuvent pas l'utiliser, pour des raisons de compatibilité matérielle. C'est le cas de Windows XP avant le Service Pack 3. C'est la raison pour laquelle les cartes mères émulent RTC et PIT dans leurs circuits. D'ailleurs, pour économiser des circuits, les cartes mères modernes émulent le PIT et la RTC avec le HPET : le premier comparateur fournisse la fréquence de 1024 Hz de la RTC, 3 autres comparateurs remplacent l'Intel 8253. Le HPET gère de nombreux modes de fonctionnement : ses comparateurs peuvent être configuré en mode une fois ou périodique, on peut lui demander d'émuler la RTC et le PIT, etc. Chaque comparateur doit pouvoir fonctionner en mode une fois, et au moins un comparateur doit pouvoir fonctionner en mode périodique. Aussi, il contient aussi 3 registres de configuration. Notons qu'il est aussi possible de lire ou écrire dans le compteur de 64 bits, mais ce n'est pas recommandé. ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les compteurs à rétroaction | nextText=Les compteurs à rétroaction }} </noinclude> op4pjj08zchdzi3svqvczcx923dsjrn 768083 768082 2026-06-18T17:07:02Z Mewtow 31375 /* L'intérieur d'un compteur */ 768083 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La taille d'un compteur est surtout pertinente sur les compteurs à incrément, elle a moins de pertinence sur les autres compteurs. La plupart des compteurs à incrément comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==L'intérieur d'un compteur== A une exception bien précise qu'on abordera plus bas, les compteurs sont composés d'un registre, qui mémorise le décompte, couplé à un circuit '''incrémenteur'''. Nous avions déjà abordé l'incrémenteur dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique. Le pas du compteur précise de combien on incrémente le compteur par cycle d'horloge.]] L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs à partir de compteurs plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs modulo=== Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les mal-nommés ''compteurs asynchrones''=== Les '''compteurs asynchrones''' n'utilisent pas de circuit incrémenteur. A la place, ils sont fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Précisons cependant qu'ils sont très mal nommés, à savoir que ce sont bien des circuits synchrones. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les diviseurs de fréquence : compter des cycles d'horloge== Les compteurs servent à créer divers circuits fortement liés la gestion de la fréquence, ainsi qu'à la mesure du temps. Les circuits en question comptent les cycles d'horloge, ce qui demande juste des compteurs automatiquement incrémentés à chaque cycle d'horloge. Compter les cycles d'horloge permet de mesurer des durées, ou de diviser une fréquence. Dans ce qui va suivre, nous allons voire deux types de circuits : les diviseurs de fréquence, et les ''timers''. Les '''diviseurs de fréquence''' sont des circuits qui prennent en entrée un signal d'horloge et fournissent en sortie un autre signal d'horloge de fréquence N fois plus faible. Plus précisément, la fréquence de sortie est 2, 3, 4, ou 18 fois plus faible que la fréquence d'entrée. Il existe des diviseurs de fréquence qui divisent la fréquence par 2, d'autres par 4, d'autres par 13, etc. ===Les diviseurs de fréquence basés sur des compteurs=== Leur implémentation est simple : il suffit d'un compteur auquel on rajoute une sortie. Pour un diviseur de fréquence par N, il faut plus précisément un compteur modulo par N. Tous les N cycles, le compteur déborde, à savoir qu'il dépasse sa valeur maximale et est remis à zéro. Une sortie du compteur indique si le compteur déborde : elle est mise à 1 lors d'un débordement et reste à 0 sinon. L'idée est de compter le nombre de cycles d'horloges, et de mettre à 1 la sortie quand le compteur déborde. Par exemple, pour diviser une fréquence par 8, on prend un compteur 3 bits. A chaque fois que le compteur déborde et est réinitialisé, on envoie un 1 en sortie. Le résultat est un signal qui est à 1 tous les 8 cycles d'horloge, à savoir un signal de fréquence 8 fois inférieure. La même idée marche avec un diviseur de fréquence par 6, sauf que l'on doit alors utiliser un compteur modulo par 6, ce qui veut dire qu'il compte de 0 à 5 comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le compteur déborde tous les 6 cycles d’horloge, ce qui fait que sa sortie de débordement est à 1 tous les 6 cycles, ce qui est demandé. Si n'importe quel compteur fait l'affaire, il est cependant utile d'utiliser les compteurs les plus adaptés à la tâche. Il est rare que l'on doive diviser une fréquence par 50 ou par 100, par exemple. Un diviseur de fréquence divise une fréquence par N, avec N très petit : 4, 6, 8, 10, 12, etc. Or, les compteurs en anneau, sont particulièrement adaptés pour compter jusqu'à des valeurs assez faibles. Il est donc naturel d'utiliser un compteur en anneau dans un diviseur de fréquence. Le circuit obtenu est beaucoup plus simple qu’avec un compteur normal. Et c'est la raison pour laquelle les diviseurs de fréquence sont souvent conçus en utilisant des compteurs ''one-hot''. Plus on divise une fréquence par un N très petit, plus les compteurs auront d'avantages : très simples, demandent peu de portes logiques, sont très rapides, prennent peu de place, permettent de se passer de circuit comparateur. ===Les diviseurs de fréquence basés sur des compteurs à bascule T=== Il est aussi possible de concevoir des diviseurs de fréquence avec des bascules T. La seule contrainte est qu'il faut diviser la fréquence d'entrée par une puissance de deux. Le cas le plus simple divise par 2 la fréquence d'entrée et ne demande qu'une simple bascule T. En effet, regardons ce qui se passe quand on envoie un signal constamment à 1 sur son entrée T. Dans ce cas, la bascule s'inversera une fois par chaque cycle d'horloge. Un cycle d'horloge sur la sortie correspond au temps passé entre deux inversions. [[File:Frequency divider by 2.svg|centre|vignette|upright=2|Diviseur de fréquence par 2.]] Pour créer un diviseur de fréquence par 4, il suffit d'enchainer deux fois le circuit précédent. Et pour créer un diviseur de fréquence par 8, il suffit d'enchainer trois fois le circuit précédent. Et ainsi de suite. Au final, un diviseur de fréquence qui divise la fréquence d'entrée par 2^N est un enchainement de N bascules T. [[File:Freq Divider mod 8.svg|centre|vignette|upright=2|Diviseur de fréquence par 8.]] On peut en profiter pour créer un circuit à plusieurs sorties, en mettant une sortie par bascule. Le circuit, illustré ci-dessous, fournit donc plusieurs fréquences de sortie : une à la moitié de la fréquence initiale, une autre au quart de la fréquence d'entrée, une autre au huitième, etc. [[File:Frequency divider animation.gif|centre|vignette|upright=2|Diviseur de fréquence multiple.]] ==Les ''timers'' : compter des durées== Les '''''timers''''', aussi appelés ''Programmable interval timer'', sont des circuits capables de compter des durées, exprimées en cycles d'horloge. Leur fonctionnement est assez simple : ils émettent un signal quand un certain nombre de cycles est écoulé, ce nombre de cycles étant configurable. On peut ainsi générer un signal qui surviendra après 50 cycles d'horloge, ou après 100 cycles d'horloge, etc. Le signal en question est disponible sur une sortie de 1 bit, et correspond tout simplement au fait que cette sortie est mise à 1, pendant un cycle d'horloge. Les ''timers'' sont composés d'un compteur/décompteur cadencé par un signal d'horloge. Le compteur initialisé à 0, puis est incrémenté à chaque signal d'horloge, jusqu’à atteinte d'une valeur limite où il génère un signal. Pour un décompteur, c'est la même chose, sauf que le décompteur est initialisé à sa valeur limite et est décrémenté à chaque cycle, et envoie un signal quand il atteint 0. Les ''timers'' basés sur des décompteurs sont nettement plus simples que les autres, ce qui fait qu'ils sont plus utilisés Pour que les ''timers'' soient configurables, on doit pouvoir préciser combien de cycles il faut (dé-)compter avant d'émettre un signal. On peut ainsi préciser s'il faut émettre le signal après 32 cycles d'horloge, après les 50 cycles, tous les 129 cycles, etc. Le nombre de cycles en question est envoyé sur une entrée d’initialisation du compteur. Les ''timers'' matériels peuvent compter de deux manières différentes, appelées '''mode une fois''' et '''mode périodique'''. * En mode une fois, le ''timer'' s'arrête une fois qu'il a atteint la limite configurée. On doit le réinitialiser manuellement, par l'intermédiaire du logiciel, pour l'utiliser une nouvelle fois. Cela permet de compter une certaine durée, exprimée en nombre de cycles d'horloge. * En mode périodique, le ''timer'' se réinitialise automatiquement avec la valeur de départ, ce qui fait qu'il reboucle à l'infini. En clair, le ''timer'' se comporte comme un diviseur de fréquence. Si le compteur est réglé de manière à émettre un signal tous les 9 cycles d'horloge, la fréquence de sortie sera de 9 fois moins celle de la fréquence d'entrée du compteur. Un ordinateur est rempli de ''timers'' divers. Dans ce qui va suivre, nous allons voir les principaux ''timers'', qui sont actuellement intégrés dans les PC modernes. Ils se trouvent sur la carte mère ou dans le processeur, tout dépend du ''timer''. ===Le ''watchdog timer''=== Le '''''watchdog timer''''' est un ''timer'' spécifique dont le but est de redémarrer automatiquement l'ordinateur si jamais celui-ci ne répond plus ou plante. Beaucoup de PC s'en passent, mais ce ''timer'' est très fréquent dans les architectures embarquées. Le ''watchdog timer'' est un compteur/décompteur qui doit être réinitialisé régulièrement. S'il n'est pas réinitialisé, le ''watchdog timer'' déborde (revient à 0 ou atteint 0) et envoie un signal qui redémarre le système. Le système est conçu pour réinitialiser le ''watchdog timer'' régulièrement, ce qui signifie que le système n'est pas censé redémarrer. Si jamais le système dysfonctionne gravement, le système ne pourra pas réinitialiser le ''watchdog timer'' et le système est redémarré automatiquement ou mis en arrêt. [[File:SimpleWatchdogTimer.gif|centre|vignette|upright=2|Le ''Watchdog Timer'' et l'ordinateur.]] ===Le ''Time Stamp Counter'' des processeurs x86=== Tous les processeurs des PC actuels sont des processeurs dits x86. Nous ne pouvons pas expliquer ce que cela signifie pour le moment, retenez juste ce terme. Sachez que tous les processeurs x86 contiennent un compteur de 64 bits, appelé le '''''Time Stamp Counter''''', qui mémorise le nombre de cycles d'horloge qu'a effectué le processeur depuis son démarrage. Les programmes peuvent accéder à ce registre assez facilement, ce qui est utile pour faire des mesures ou comparer les performances de deux applications. Il permet de compter combien de cycles d'horloge met un morceau de code à s’exécuter, combien de cycles prend une instruction à s’exécuter, etc. Les processeurs non-x86 ont un registre équivalent, que ce soit les processeurs ARM ou d'autres. Malheureusement, ce compteur est tombé en désuétude pour tout un tas de raisons. La principale est que les processeurs actuels font varier leur fréquence suivant les besoins. Ils augmentent leur fréquence quand on leur demande de faire beaucoup de calculs, et se mettent en mode basse(fréquence pour économiser de l'énergie si on ne leur demande pas grand chose. Avec une fréquence variable, le ''Time Stamp Counter'' perd complétement en fiabilité. Intel a tenté de corriger ce défaut en incrémentant ce registre à une fréquence constante, différente de celle du processeur, ce qui est encore le cas sur les processeurs Intel actuels. Le comportement est un peu différent sur les processeurs AMD, qui cadencent ce ''timer'' à la fréquence du processeur mais utilisent des mécanismes de synchronisation assez complexes pour corriger l'effet de la fréquence variable. ===L'horloge temps réel=== L''''horloge temps réel''' est un ''timer'' qui génère une fréquence de 1024 Hz, soit près d'un Kilohertz. Dans ce qui suit, nous la noterons RTC, ce qui est l'acronyme du terme anglais ''Real Time Clock''. La RTC prend en entrée un signal d'horloge de 32KHz, généré par un oscillateur à Quartz, et fournit en sortie un signal de fréquence 32 fois plus faible, c'est à dire de 1 KHz. Pour cela, elle est réglée en mode répétitif et son décompteur interne est initialisé à 32. La RTC génère donc un signal toutes les millisecondes, qui est envoyé au processeur. On peut, en théorie, changer la fréquence de la RTC, mais c'est rarement une bonne idée. En théorie, la RTC permet de compter des durées assez courtes, comme le ''ping'' (le temps de latence d'un réseau, pour simplifier), le temps de rafraichissement de l'écran, ou bien d'autres choses. Mais dans les faits, l'horloge temps réel sa fréquence n'aide pas : 1024 Hz est proche de 1000, mais pas assez pour faire des mesures à la milliseconde près, chose qui est nécessaire pour mesurer le ''ping'' ou d'autres choses utiles. A la place, l'ordinateur l'utilise pour que l'ordinateur soit toujours à l'heure. L'ordinateur sait quelle heure il est avec une précision de l'ordre de la seconde (vous pouvez regarder le bureau de Windows dans le coin inférieur droite de votre écran pour vous en convaincre). ===Le ''Programmable Interval Timer'' : l'Intel 8253=== L'Intel 8253 était un ''timer'' programmable autrefois soudé sur les cartes mères des premiers PC. Il fût suivi par l'Intel 8254, qui en était une légère amélioration. Il était cadencé par une horloge maitre, générée par un oscillateur à Quartz, dont la fréquence est de 32 768 Hertz, soit 2^15 cycles d'horloge par seconde. S'il n'est plus présent dans un boitier sur la carte mère, on trouve toujours un circuit semblable au 8253 à l'intérieur du ''chipset'' de la carte mère, voire à l'intérieur du processeur, pour des raisons de compatibilité. L'intérieur de l'Intel 8253 est illustré ci-dessous. Nous allons expliquer l'ensemble de ce schéma, rassurez-vous, mais les explications seront plus simples à comprendre si vous survolez ce schéma en premier lieu. [[File:Intel 8253 block diagram.svg|centre|vignette|upright=2|Intel 8253, intérieur.]] L'Intel 8253 contient trois compteurs de 16 bits, numérotés 0, 1 et 2. Pour chaque compteur, l'entrée CLOCK est celle de l'horloge de 32 MHz, l'entrée GATE active ou désactive le compteur, la sortie fournit le signal voulu et/ou la fréquence de sortie. Les trois compteurs étaient utilisés pour dériver plusieurs fréquences allant de 18,2 Hz à environ 500 KHz. Par exemple, il était utilisé par défaut pour le rafraichissement de la mémoire (D)RAM, mais il était souvent reprogrammé pour servir à générer des fréquences spécifiques par le BIOS ou la carte graphique. [[File:Intel 8253 and 8254.svg|vignette|Intel 8253 and 8254]] L'Intel 8253 lui-même possède plusieurs entrées et sorties. En premier lieu, on voit un port de 8 bits connecté aux trois compteurs, qui permet à l'Intel 8253 de communiquer avec le reste de l'ordinateur. La communication se fait dans les deux sens : soit de l'ordinateur vers les compteurs, soit des compteurs vers l'ordinateur. Dans le sens ordinateur -> compteurs, cela permet à l'ordinateur de programmer les compteurs, de les initialiser. Dans l'autre sens, cela permet de récupérer le contenu des compteurs, même si ce n'est pas très utilisé. Il y a aussi 5 entrées de configuration : * Deux bits A0 et A1 pour sélectionner le compteur voulu avec son numéro. * Un bit RD à mettre à 0 pour que l'ordinateur récupère le compteur sélectionné sur le port de 8 bits. * Un bit WR à mettre à 0 pour que l'ordinateur modifie le compteur sélectionné, en envoyant le nombre pour l'initialisation sur le port de 8 bits. * Un bit CS qui active ou désactive l'Intel 8253 et permet de l'allumer ou de l’éteindre. L'Intel 8253 intégre un registre de 8 bits, le ''Control Word register'' qui mémorise la configuration de l'Intel 8253. Pour programmer les trois compteurs, il faut écrire un mot de 8 bits dans ce ''Control Word register''. Pour écrire dans le ''Control Word register'', il faut mettre le bit CS à 0 (on active l'Intel 8253), mettre le bit RDà 1 , le bit WR à 0 le bit WR (on indique qu'on fait une écriture), sélectionner le ''Control Word register'' en mettant les deux bits A0 et A1 à 1, puis envoyer la configuration du ''Control Word register'' sur le port de 8 bits. ===Le ''High Precision Event Timer'' (HPET)=== De nos jours, l'horloge temps réel et l'Intel 8253/8254 tendent à être remplacé par un autre ''timer'', le ''High Precision Event Timer'' (HPET). Il s'agit d'un compteur de 64 bits, dont la fréquence est d'au moins 10 MHz. Il s'agit bien d'un compteur et non d'un décompteur. Il gère nativement plusieurs valeurs limites à laquelle générer un signal, qui sont configurables. Pour cela, il est couplé à plusieurs comparateurs, chacun associé à un registre pour mémoriser la valeur limite. Il doit y avoir au moins trois comparateurs/registres, mais le nombre peut monter jusqu’à 256. [[File:High Precision Event Timer.png|centre|vignette|upright=2|High Precision Event Timer]] Il faut noter que les systèmes d'exploitation conçus avant le HPET ne peuvent pas l'utiliser, pour des raisons de compatibilité matérielle. C'est le cas de Windows XP avant le Service Pack 3. C'est la raison pour laquelle les cartes mères émulent RTC et PIT dans leurs circuits. D'ailleurs, pour économiser des circuits, les cartes mères modernes émulent le PIT et la RTC avec le HPET : le premier comparateur fournisse la fréquence de 1024 Hz de la RTC, 3 autres comparateurs remplacent l'Intel 8253. Le HPET gère de nombreux modes de fonctionnement : ses comparateurs peuvent être configuré en mode une fois ou périodique, on peut lui demander d'émuler la RTC et le PIT, etc. Chaque comparateur doit pouvoir fonctionner en mode une fois, et au moins un comparateur doit pouvoir fonctionner en mode périodique. Aussi, il contient aussi 3 registres de configuration. Notons qu'il est aussi possible de lire ou écrire dans le compteur de 64 bits, mais ce n'est pas recommandé. ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les compteurs à rétroaction | nextText=Les compteurs à rétroaction }} </noinclude> 5n6d8ybhriqmk06ho8x9chgme43p8vy 768085 768083 2026-06-18T17:10:36Z Mewtow 31375 /* Les diviseurs de fréquence basés sur des compteurs */ 768085 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La taille d'un compteur est surtout pertinente sur les compteurs à incrément, elle a moins de pertinence sur les autres compteurs. La plupart des compteurs à incrément comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==L'intérieur d'un compteur== A une exception bien précise qu'on abordera plus bas, les compteurs sont composés d'un registre, qui mémorise le décompte, couplé à un circuit '''incrémenteur'''. Nous avions déjà abordé l'incrémenteur dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique. Le pas du compteur précise de combien on incrémente le compteur par cycle d'horloge.]] L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs à partir de compteurs plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs modulo=== Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les mal-nommés ''compteurs asynchrones''=== Les '''compteurs asynchrones''' n'utilisent pas de circuit incrémenteur. A la place, ils sont fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Précisons cependant qu'ils sont très mal nommés, à savoir que ce sont bien des circuits synchrones. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les diviseurs de fréquence : compter des cycles d'horloge== Les compteurs servent à créer divers circuits fortement liés la gestion de la fréquence, ainsi qu'à la mesure du temps. Les circuits en question comptent les cycles d'horloge, ce qui demande juste des compteurs automatiquement incrémentés à chaque cycle d'horloge. Compter les cycles d'horloge permet de mesurer des durées, ou de diviser une fréquence. Dans ce qui va suivre, nous allons voire deux types de circuits : les diviseurs de fréquence, et les ''timers''. Les '''diviseurs de fréquence''' sont des circuits qui prennent en entrée un signal d'horloge et fournissent en sortie un autre signal d'horloge de fréquence N fois plus faible. Plus précisément, la fréquence de sortie est 2, 3, 4, ou 18 fois plus faible que la fréquence d'entrée. Il existe des diviseurs de fréquence qui divisent la fréquence par 2, d'autres par 4, d'autres par 13, etc. ===Les diviseurs de fréquence basés sur des compteurs=== Leur implémentation est simple : il suffit d'un compteur auquel on rajoute une sortie. Pour un diviseur de fréquence par N, il faut plus précisément un compteur modulo par N. Tous les N cycles, le compteur déborde, à savoir qu'il dépasse sa valeur maximale et est remis à zéro. Une sortie du compteur indique si le compteur déborde : elle est mise à 1 lors d'un débordement et reste à 0 sinon. L'idée est de compter le nombre de cycles d'horloges, et de mettre à 1 la sortie quand le compteur déborde. Par exemple, pour diviser une fréquence par 8, on prend un compteur 3 bits. A chaque fois que le compteur déborde et est réinitialisé, on envoie un 1 en sortie. Le résultat est un signal qui est à 1 tous les 8 cycles d'horloge, à savoir un signal de fréquence 8 fois inférieure. La même idée marche avec un diviseur de fréquence par 6, sauf que l'on doit alors utiliser un compteur modulo par 6, ce qui veut dire qu'il compte de 0 à 5 comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le compteur déborde tous les 6 cycles d’horloge, ce qui fait que sa sortie de débordement est à 1 tous les 6 cycles, ce qui est demandé. ===Les diviseurs de fréquence basés sur des compteurs à bascule T=== Il est aussi possible de concevoir des diviseurs de fréquence avec des bascules T. La seule contrainte est qu'il faut diviser la fréquence d'entrée par une puissance de deux. Le cas le plus simple divise par 2 la fréquence d'entrée et ne demande qu'une simple bascule T. En effet, regardons ce qui se passe quand on envoie un signal constamment à 1 sur son entrée T. Dans ce cas, la bascule s'inversera une fois par chaque cycle d'horloge. Un cycle d'horloge sur la sortie correspond au temps passé entre deux inversions. [[File:Frequency divider by 2.svg|centre|vignette|upright=2|Diviseur de fréquence par 2.]] Pour créer un diviseur de fréquence par 4, il suffit d'enchainer deux fois le circuit précédent. Et pour créer un diviseur de fréquence par 8, il suffit d'enchainer trois fois le circuit précédent. Et ainsi de suite. Au final, un diviseur de fréquence qui divise la fréquence d'entrée par 2^N est un enchainement de N bascules T. [[File:Freq Divider mod 8.svg|centre|vignette|upright=2|Diviseur de fréquence par 8.]] On peut en profiter pour créer un circuit à plusieurs sorties, en mettant une sortie par bascule. Le circuit, illustré ci-dessous, fournit donc plusieurs fréquences de sortie : une à la moitié de la fréquence initiale, une autre au quart de la fréquence d'entrée, une autre au huitième, etc. [[File:Frequency divider animation.gif|centre|vignette|upright=2|Diviseur de fréquence multiple.]] ==Les ''timers'' : compter des durées== Les '''''timers''''', aussi appelés ''Programmable interval timer'', sont des circuits capables de compter des durées, exprimées en cycles d'horloge. Leur fonctionnement est assez simple : ils émettent un signal quand un certain nombre de cycles est écoulé, ce nombre de cycles étant configurable. On peut ainsi générer un signal qui surviendra après 50 cycles d'horloge, ou après 100 cycles d'horloge, etc. Le signal en question est disponible sur une sortie de 1 bit, et correspond tout simplement au fait que cette sortie est mise à 1, pendant un cycle d'horloge. Les ''timers'' sont composés d'un compteur/décompteur cadencé par un signal d'horloge. Le compteur initialisé à 0, puis est incrémenté à chaque signal d'horloge, jusqu’à atteinte d'une valeur limite où il génère un signal. Pour un décompteur, c'est la même chose, sauf que le décompteur est initialisé à sa valeur limite et est décrémenté à chaque cycle, et envoie un signal quand il atteint 0. Les ''timers'' basés sur des décompteurs sont nettement plus simples que les autres, ce qui fait qu'ils sont plus utilisés Pour que les ''timers'' soient configurables, on doit pouvoir préciser combien de cycles il faut (dé-)compter avant d'émettre un signal. On peut ainsi préciser s'il faut émettre le signal après 32 cycles d'horloge, après les 50 cycles, tous les 129 cycles, etc. Le nombre de cycles en question est envoyé sur une entrée d’initialisation du compteur. Les ''timers'' matériels peuvent compter de deux manières différentes, appelées '''mode une fois''' et '''mode périodique'''. * En mode une fois, le ''timer'' s'arrête une fois qu'il a atteint la limite configurée. On doit le réinitialiser manuellement, par l'intermédiaire du logiciel, pour l'utiliser une nouvelle fois. Cela permet de compter une certaine durée, exprimée en nombre de cycles d'horloge. * En mode périodique, le ''timer'' se réinitialise automatiquement avec la valeur de départ, ce qui fait qu'il reboucle à l'infini. En clair, le ''timer'' se comporte comme un diviseur de fréquence. Si le compteur est réglé de manière à émettre un signal tous les 9 cycles d'horloge, la fréquence de sortie sera de 9 fois moins celle de la fréquence d'entrée du compteur. Un ordinateur est rempli de ''timers'' divers. Dans ce qui va suivre, nous allons voir les principaux ''timers'', qui sont actuellement intégrés dans les PC modernes. Ils se trouvent sur la carte mère ou dans le processeur, tout dépend du ''timer''. ===Le ''watchdog timer''=== Le '''''watchdog timer''''' est un ''timer'' spécifique dont le but est de redémarrer automatiquement l'ordinateur si jamais celui-ci ne répond plus ou plante. Beaucoup de PC s'en passent, mais ce ''timer'' est très fréquent dans les architectures embarquées. Le ''watchdog timer'' est un compteur/décompteur qui doit être réinitialisé régulièrement. S'il n'est pas réinitialisé, le ''watchdog timer'' déborde (revient à 0 ou atteint 0) et envoie un signal qui redémarre le système. Le système est conçu pour réinitialiser le ''watchdog timer'' régulièrement, ce qui signifie que le système n'est pas censé redémarrer. Si jamais le système dysfonctionne gravement, le système ne pourra pas réinitialiser le ''watchdog timer'' et le système est redémarré automatiquement ou mis en arrêt. [[File:SimpleWatchdogTimer.gif|centre|vignette|upright=2|Le ''Watchdog Timer'' et l'ordinateur.]] ===Le ''Time Stamp Counter'' des processeurs x86=== Tous les processeurs des PC actuels sont des processeurs dits x86. Nous ne pouvons pas expliquer ce que cela signifie pour le moment, retenez juste ce terme. Sachez que tous les processeurs x86 contiennent un compteur de 64 bits, appelé le '''''Time Stamp Counter''''', qui mémorise le nombre de cycles d'horloge qu'a effectué le processeur depuis son démarrage. Les programmes peuvent accéder à ce registre assez facilement, ce qui est utile pour faire des mesures ou comparer les performances de deux applications. Il permet de compter combien de cycles d'horloge met un morceau de code à s’exécuter, combien de cycles prend une instruction à s’exécuter, etc. Les processeurs non-x86 ont un registre équivalent, que ce soit les processeurs ARM ou d'autres. Malheureusement, ce compteur est tombé en désuétude pour tout un tas de raisons. La principale est que les processeurs actuels font varier leur fréquence suivant les besoins. Ils augmentent leur fréquence quand on leur demande de faire beaucoup de calculs, et se mettent en mode basse(fréquence pour économiser de l'énergie si on ne leur demande pas grand chose. Avec une fréquence variable, le ''Time Stamp Counter'' perd complétement en fiabilité. Intel a tenté de corriger ce défaut en incrémentant ce registre à une fréquence constante, différente de celle du processeur, ce qui est encore le cas sur les processeurs Intel actuels. Le comportement est un peu différent sur les processeurs AMD, qui cadencent ce ''timer'' à la fréquence du processeur mais utilisent des mécanismes de synchronisation assez complexes pour corriger l'effet de la fréquence variable. ===L'horloge temps réel=== L''''horloge temps réel''' est un ''timer'' qui génère une fréquence de 1024 Hz, soit près d'un Kilohertz. Dans ce qui suit, nous la noterons RTC, ce qui est l'acronyme du terme anglais ''Real Time Clock''. La RTC prend en entrée un signal d'horloge de 32KHz, généré par un oscillateur à Quartz, et fournit en sortie un signal de fréquence 32 fois plus faible, c'est à dire de 1 KHz. Pour cela, elle est réglée en mode répétitif et son décompteur interne est initialisé à 32. La RTC génère donc un signal toutes les millisecondes, qui est envoyé au processeur. On peut, en théorie, changer la fréquence de la RTC, mais c'est rarement une bonne idée. En théorie, la RTC permet de compter des durées assez courtes, comme le ''ping'' (le temps de latence d'un réseau, pour simplifier), le temps de rafraichissement de l'écran, ou bien d'autres choses. Mais dans les faits, l'horloge temps réel sa fréquence n'aide pas : 1024 Hz est proche de 1000, mais pas assez pour faire des mesures à la milliseconde près, chose qui est nécessaire pour mesurer le ''ping'' ou d'autres choses utiles. A la place, l'ordinateur l'utilise pour que l'ordinateur soit toujours à l'heure. L'ordinateur sait quelle heure il est avec une précision de l'ordre de la seconde (vous pouvez regarder le bureau de Windows dans le coin inférieur droite de votre écran pour vous en convaincre). ===Le ''Programmable Interval Timer'' : l'Intel 8253=== L'Intel 8253 était un ''timer'' programmable autrefois soudé sur les cartes mères des premiers PC. Il fût suivi par l'Intel 8254, qui en était une légère amélioration. Il était cadencé par une horloge maitre, générée par un oscillateur à Quartz, dont la fréquence est de 32 768 Hertz, soit 2^15 cycles d'horloge par seconde. S'il n'est plus présent dans un boitier sur la carte mère, on trouve toujours un circuit semblable au 8253 à l'intérieur du ''chipset'' de la carte mère, voire à l'intérieur du processeur, pour des raisons de compatibilité. L'intérieur de l'Intel 8253 est illustré ci-dessous. Nous allons expliquer l'ensemble de ce schéma, rassurez-vous, mais les explications seront plus simples à comprendre si vous survolez ce schéma en premier lieu. [[File:Intel 8253 block diagram.svg|centre|vignette|upright=2|Intel 8253, intérieur.]] L'Intel 8253 contient trois compteurs de 16 bits, numérotés 0, 1 et 2. Pour chaque compteur, l'entrée CLOCK est celle de l'horloge de 32 MHz, l'entrée GATE active ou désactive le compteur, la sortie fournit le signal voulu et/ou la fréquence de sortie. Les trois compteurs étaient utilisés pour dériver plusieurs fréquences allant de 18,2 Hz à environ 500 KHz. Par exemple, il était utilisé par défaut pour le rafraichissement de la mémoire (D)RAM, mais il était souvent reprogrammé pour servir à générer des fréquences spécifiques par le BIOS ou la carte graphique. [[File:Intel 8253 and 8254.svg|vignette|Intel 8253 and 8254]] L'Intel 8253 lui-même possède plusieurs entrées et sorties. En premier lieu, on voit un port de 8 bits connecté aux trois compteurs, qui permet à l'Intel 8253 de communiquer avec le reste de l'ordinateur. La communication se fait dans les deux sens : soit de l'ordinateur vers les compteurs, soit des compteurs vers l'ordinateur. Dans le sens ordinateur -> compteurs, cela permet à l'ordinateur de programmer les compteurs, de les initialiser. Dans l'autre sens, cela permet de récupérer le contenu des compteurs, même si ce n'est pas très utilisé. Il y a aussi 5 entrées de configuration : * Deux bits A0 et A1 pour sélectionner le compteur voulu avec son numéro. * Un bit RD à mettre à 0 pour que l'ordinateur récupère le compteur sélectionné sur le port de 8 bits. * Un bit WR à mettre à 0 pour que l'ordinateur modifie le compteur sélectionné, en envoyant le nombre pour l'initialisation sur le port de 8 bits. * Un bit CS qui active ou désactive l'Intel 8253 et permet de l'allumer ou de l’éteindre. L'Intel 8253 intégre un registre de 8 bits, le ''Control Word register'' qui mémorise la configuration de l'Intel 8253. Pour programmer les trois compteurs, il faut écrire un mot de 8 bits dans ce ''Control Word register''. Pour écrire dans le ''Control Word register'', il faut mettre le bit CS à 0 (on active l'Intel 8253), mettre le bit RDà 1 , le bit WR à 0 le bit WR (on indique qu'on fait une écriture), sélectionner le ''Control Word register'' en mettant les deux bits A0 et A1 à 1, puis envoyer la configuration du ''Control Word register'' sur le port de 8 bits. ===Le ''High Precision Event Timer'' (HPET)=== De nos jours, l'horloge temps réel et l'Intel 8253/8254 tendent à être remplacé par un autre ''timer'', le ''High Precision Event Timer'' (HPET). Il s'agit d'un compteur de 64 bits, dont la fréquence est d'au moins 10 MHz. Il s'agit bien d'un compteur et non d'un décompteur. Il gère nativement plusieurs valeurs limites à laquelle générer un signal, qui sont configurables. Pour cela, il est couplé à plusieurs comparateurs, chacun associé à un registre pour mémoriser la valeur limite. Il doit y avoir au moins trois comparateurs/registres, mais le nombre peut monter jusqu’à 256. [[File:High Precision Event Timer.png|centre|vignette|upright=2|High Precision Event Timer]] Il faut noter que les systèmes d'exploitation conçus avant le HPET ne peuvent pas l'utiliser, pour des raisons de compatibilité matérielle. C'est le cas de Windows XP avant le Service Pack 3. C'est la raison pour laquelle les cartes mères émulent RTC et PIT dans leurs circuits. D'ailleurs, pour économiser des circuits, les cartes mères modernes émulent le PIT et la RTC avec le HPET : le premier comparateur fournisse la fréquence de 1024 Hz de la RTC, 3 autres comparateurs remplacent l'Intel 8253. Le HPET gère de nombreux modes de fonctionnement : ses comparateurs peuvent être configuré en mode une fois ou périodique, on peut lui demander d'émuler la RTC et le PIT, etc. Chaque comparateur doit pouvoir fonctionner en mode une fois, et au moins un comparateur doit pouvoir fonctionner en mode périodique. Aussi, il contient aussi 3 registres de configuration. Notons qu'il est aussi possible de lire ou écrire dans le compteur de 64 bits, mais ce n'est pas recommandé. ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les compteurs à rétroaction | nextText=Les compteurs à rétroaction }} </noinclude> bm149s47v13tic8mjw2b1mwjouvdpg5 768087 768085 2026-06-18T17:11:58Z Mewtow 31375 /* Les timers : compter des durées */ 768087 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La taille d'un compteur est surtout pertinente sur les compteurs à incrément, elle a moins de pertinence sur les autres compteurs. La plupart des compteurs à incrément comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==L'intérieur d'un compteur== A une exception bien précise qu'on abordera plus bas, les compteurs sont composés d'un registre, qui mémorise le décompte, couplé à un circuit '''incrémenteur'''. Nous avions déjà abordé l'incrémenteur dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique. Le pas du compteur précise de combien on incrémente le compteur par cycle d'horloge.]] L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs à partir de compteurs plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs modulo=== Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les mal-nommés ''compteurs asynchrones''=== Les '''compteurs asynchrones''' n'utilisent pas de circuit incrémenteur. A la place, ils sont fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Précisons cependant qu'ils sont très mal nommés, à savoir que ce sont bien des circuits synchrones. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les diviseurs de fréquence : compter des cycles d'horloge== Les compteurs servent à créer divers circuits fortement liés la gestion de la fréquence, ainsi qu'à la mesure du temps. Les circuits en question comptent les cycles d'horloge, ce qui demande juste des compteurs automatiquement incrémentés à chaque cycle d'horloge. Compter les cycles d'horloge permet de mesurer des durées, ou de diviser une fréquence. Dans ce qui va suivre, nous allons voire deux types de circuits : les diviseurs de fréquence, et les ''timers''. Les '''diviseurs de fréquence''' sont des circuits qui prennent en entrée un signal d'horloge et fournissent en sortie un autre signal d'horloge de fréquence N fois plus faible. Plus précisément, la fréquence de sortie est 2, 3, 4, ou 18 fois plus faible que la fréquence d'entrée. Il existe des diviseurs de fréquence qui divisent la fréquence par 2, d'autres par 4, d'autres par 13, etc. ===Les diviseurs de fréquence basés sur des compteurs=== Leur implémentation est simple : il suffit d'un compteur auquel on rajoute une sortie. Pour un diviseur de fréquence par N, il faut plus précisément un compteur modulo par N. Tous les N cycles, le compteur déborde, à savoir qu'il dépasse sa valeur maximale et est remis à zéro. Une sortie du compteur indique si le compteur déborde : elle est mise à 1 lors d'un débordement et reste à 0 sinon. L'idée est de compter le nombre de cycles d'horloges, et de mettre à 1 la sortie quand le compteur déborde. Par exemple, pour diviser une fréquence par 8, on prend un compteur 3 bits. A chaque fois que le compteur déborde et est réinitialisé, on envoie un 1 en sortie. Le résultat est un signal qui est à 1 tous les 8 cycles d'horloge, à savoir un signal de fréquence 8 fois inférieure. La même idée marche avec un diviseur de fréquence par 6, sauf que l'on doit alors utiliser un compteur modulo par 6, ce qui veut dire qu'il compte de 0 à 5 comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le compteur déborde tous les 6 cycles d’horloge, ce qui fait que sa sortie de débordement est à 1 tous les 6 cycles, ce qui est demandé. ===Les diviseurs de fréquence basés sur des compteurs à bascule T=== Il est aussi possible de concevoir des diviseurs de fréquence avec des bascules T. La seule contrainte est qu'il faut diviser la fréquence d'entrée par une puissance de deux. Le cas le plus simple divise par 2 la fréquence d'entrée et ne demande qu'une simple bascule T. En effet, regardons ce qui se passe quand on envoie un signal constamment à 1 sur son entrée T. Dans ce cas, la bascule s'inversera une fois par chaque cycle d'horloge. Un cycle d'horloge sur la sortie correspond au temps passé entre deux inversions. [[File:Frequency divider by 2.svg|centre|vignette|upright=2|Diviseur de fréquence par 2.]] Pour créer un diviseur de fréquence par 4, il suffit d'enchainer deux fois le circuit précédent. Et pour créer un diviseur de fréquence par 8, il suffit d'enchainer trois fois le circuit précédent. Et ainsi de suite. Au final, un diviseur de fréquence qui divise la fréquence d'entrée par 2^N est un enchainement de N bascules T. [[File:Freq Divider mod 8.svg|centre|vignette|upright=2|Diviseur de fréquence par 8.]] On peut en profiter pour créer un circuit à plusieurs sorties, en mettant une sortie par bascule. Le circuit, illustré ci-dessous, fournit donc plusieurs fréquences de sortie : une à la moitié de la fréquence initiale, une autre au quart de la fréquence d'entrée, une autre au huitième, etc. [[File:Frequency divider animation.gif|centre|vignette|upright=2|Diviseur de fréquence multiple.]] ==Les ''timers'' : compter des durées, compter des cycles d'horloge== Les '''''timers''''', aussi appelés ''Programmable interval timer'', sont des circuits capables de compter des durées, exprimées en cycles d'horloge. Leur fonctionnement est assez simple : ils émettent un signal quand un certain nombre de cycles est écoulé, ce nombre de cycles étant configurable. On peut ainsi générer un signal qui surviendra après 50 cycles d'horloge, ou après 100 cycles d'horloge, etc. Le signal en question est disponible sur une sortie de 1 bit, et correspond tout simplement au fait que cette sortie est mise à 1, pendant un cycle d'horloge. Les ''timers'' sont composés d'un compteur/décompteur cadencé par un signal d'horloge. Le compteur initialisé à 0, puis est incrémenté à chaque signal d'horloge, jusqu’à atteinte d'une valeur limite où il génère un signal. Pour un décompteur, c'est la même chose, sauf que le décompteur est initialisé à sa valeur limite et est décrémenté à chaque cycle, et envoie un signal quand il atteint 0. Les ''timers'' basés sur des décompteurs sont nettement plus simples que les autres, ce qui fait qu'ils sont plus utilisés Pour que les ''timers'' soient configurables, on doit pouvoir préciser combien de cycles il faut (dé-)compter avant d'émettre un signal. On peut ainsi préciser s'il faut émettre le signal après 32 cycles d'horloge, après les 50 cycles, tous les 129 cycles, etc. Le nombre de cycles en question est envoyé sur une entrée d’initialisation du compteur. Les ''timers'' matériels peuvent compter de deux manières différentes, appelées '''mode une fois''' et '''mode périodique'''. * En mode une fois, le ''timer'' s'arrête une fois qu'il a atteint la limite configurée. On doit le réinitialiser manuellement, par l'intermédiaire du logiciel, pour l'utiliser une nouvelle fois. Cela permet de compter une certaine durée, exprimée en nombre de cycles d'horloge. * En mode périodique, le ''timer'' se réinitialise automatiquement avec la valeur de départ, ce qui fait qu'il reboucle à l'infini. En clair, le ''timer'' se comporte comme un diviseur de fréquence. Si le compteur est réglé de manière à émettre un signal tous les 9 cycles d'horloge, la fréquence de sortie sera de 9 fois moins celle de la fréquence d'entrée du compteur. Un ordinateur est rempli de ''timers'' divers. Dans ce qui va suivre, nous allons voir les principaux ''timers'', qui sont actuellement intégrés dans les PC modernes. Ils se trouvent sur la carte mère ou dans le processeur, tout dépend du ''timer''. ===Le ''watchdog timer''=== Le '''''watchdog timer''''' est un ''timer'' spécifique dont le but est de redémarrer automatiquement l'ordinateur si jamais celui-ci ne répond plus ou plante. Beaucoup de PC s'en passent, mais ce ''timer'' est très fréquent dans les architectures embarquées. Le ''watchdog timer'' est un compteur/décompteur qui doit être réinitialisé régulièrement. S'il n'est pas réinitialisé, le ''watchdog timer'' déborde (revient à 0 ou atteint 0) et envoie un signal qui redémarre le système. Le système est conçu pour réinitialiser le ''watchdog timer'' régulièrement, ce qui signifie que le système n'est pas censé redémarrer. Si jamais le système dysfonctionne gravement, le système ne pourra pas réinitialiser le ''watchdog timer'' et le système est redémarré automatiquement ou mis en arrêt. [[File:SimpleWatchdogTimer.gif|centre|vignette|upright=2|Le ''Watchdog Timer'' et l'ordinateur.]] ===Le ''Time Stamp Counter'' des processeurs x86=== Tous les processeurs des PC actuels sont des processeurs dits x86. Nous ne pouvons pas expliquer ce que cela signifie pour le moment, retenez juste ce terme. Sachez que tous les processeurs x86 contiennent un compteur de 64 bits, appelé le '''''Time Stamp Counter''''', qui mémorise le nombre de cycles d'horloge qu'a effectué le processeur depuis son démarrage. Les programmes peuvent accéder à ce registre assez facilement, ce qui est utile pour faire des mesures ou comparer les performances de deux applications. Il permet de compter combien de cycles d'horloge met un morceau de code à s’exécuter, combien de cycles prend une instruction à s’exécuter, etc. Les processeurs non-x86 ont un registre équivalent, que ce soit les processeurs ARM ou d'autres. Malheureusement, ce compteur est tombé en désuétude pour tout un tas de raisons. La principale est que les processeurs actuels font varier leur fréquence suivant les besoins. Ils augmentent leur fréquence quand on leur demande de faire beaucoup de calculs, et se mettent en mode basse(fréquence pour économiser de l'énergie si on ne leur demande pas grand chose. Avec une fréquence variable, le ''Time Stamp Counter'' perd complétement en fiabilité. Intel a tenté de corriger ce défaut en incrémentant ce registre à une fréquence constante, différente de celle du processeur, ce qui est encore le cas sur les processeurs Intel actuels. Le comportement est un peu différent sur les processeurs AMD, qui cadencent ce ''timer'' à la fréquence du processeur mais utilisent des mécanismes de synchronisation assez complexes pour corriger l'effet de la fréquence variable. ===L'horloge temps réel=== L''''horloge temps réel''' est un ''timer'' qui génère une fréquence de 1024 Hz, soit près d'un Kilohertz. Dans ce qui suit, nous la noterons RTC, ce qui est l'acronyme du terme anglais ''Real Time Clock''. La RTC prend en entrée un signal d'horloge de 32KHz, généré par un oscillateur à Quartz, et fournit en sortie un signal de fréquence 32 fois plus faible, c'est à dire de 1 KHz. Pour cela, elle est réglée en mode répétitif et son décompteur interne est initialisé à 32. La RTC génère donc un signal toutes les millisecondes, qui est envoyé au processeur. On peut, en théorie, changer la fréquence de la RTC, mais c'est rarement une bonne idée. En théorie, la RTC permet de compter des durées assez courtes, comme le ''ping'' (le temps de latence d'un réseau, pour simplifier), le temps de rafraichissement de l'écran, ou bien d'autres choses. Mais dans les faits, l'horloge temps réel sa fréquence n'aide pas : 1024 Hz est proche de 1000, mais pas assez pour faire des mesures à la milliseconde près, chose qui est nécessaire pour mesurer le ''ping'' ou d'autres choses utiles. A la place, l'ordinateur l'utilise pour que l'ordinateur soit toujours à l'heure. L'ordinateur sait quelle heure il est avec une précision de l'ordre de la seconde (vous pouvez regarder le bureau de Windows dans le coin inférieur droite de votre écran pour vous en convaincre). ===Le ''Programmable Interval Timer'' : l'Intel 8253=== L'Intel 8253 était un ''timer'' programmable autrefois soudé sur les cartes mères des premiers PC. Il fût suivi par l'Intel 8254, qui en était une légère amélioration. Il était cadencé par une horloge maitre, générée par un oscillateur à Quartz, dont la fréquence est de 32 768 Hertz, soit 2^15 cycles d'horloge par seconde. S'il n'est plus présent dans un boitier sur la carte mère, on trouve toujours un circuit semblable au 8253 à l'intérieur du ''chipset'' de la carte mère, voire à l'intérieur du processeur, pour des raisons de compatibilité. L'intérieur de l'Intel 8253 est illustré ci-dessous. Nous allons expliquer l'ensemble de ce schéma, rassurez-vous, mais les explications seront plus simples à comprendre si vous survolez ce schéma en premier lieu. [[File:Intel 8253 block diagram.svg|centre|vignette|upright=2|Intel 8253, intérieur.]] L'Intel 8253 contient trois compteurs de 16 bits, numérotés 0, 1 et 2. Pour chaque compteur, l'entrée CLOCK est celle de l'horloge de 32 MHz, l'entrée GATE active ou désactive le compteur, la sortie fournit le signal voulu et/ou la fréquence de sortie. Les trois compteurs étaient utilisés pour dériver plusieurs fréquences allant de 18,2 Hz à environ 500 KHz. Par exemple, il était utilisé par défaut pour le rafraichissement de la mémoire (D)RAM, mais il était souvent reprogrammé pour servir à générer des fréquences spécifiques par le BIOS ou la carte graphique. [[File:Intel 8253 and 8254.svg|vignette|Intel 8253 and 8254]] L'Intel 8253 lui-même possède plusieurs entrées et sorties. En premier lieu, on voit un port de 8 bits connecté aux trois compteurs, qui permet à l'Intel 8253 de communiquer avec le reste de l'ordinateur. La communication se fait dans les deux sens : soit de l'ordinateur vers les compteurs, soit des compteurs vers l'ordinateur. Dans le sens ordinateur -> compteurs, cela permet à l'ordinateur de programmer les compteurs, de les initialiser. Dans l'autre sens, cela permet de récupérer le contenu des compteurs, même si ce n'est pas très utilisé. Il y a aussi 5 entrées de configuration : * Deux bits A0 et A1 pour sélectionner le compteur voulu avec son numéro. * Un bit RD à mettre à 0 pour que l'ordinateur récupère le compteur sélectionné sur le port de 8 bits. * Un bit WR à mettre à 0 pour que l'ordinateur modifie le compteur sélectionné, en envoyant le nombre pour l'initialisation sur le port de 8 bits. * Un bit CS qui active ou désactive l'Intel 8253 et permet de l'allumer ou de l’éteindre. L'Intel 8253 intégre un registre de 8 bits, le ''Control Word register'' qui mémorise la configuration de l'Intel 8253. Pour programmer les trois compteurs, il faut écrire un mot de 8 bits dans ce ''Control Word register''. Pour écrire dans le ''Control Word register'', il faut mettre le bit CS à 0 (on active l'Intel 8253), mettre le bit RDà 1 , le bit WR à 0 le bit WR (on indique qu'on fait une écriture), sélectionner le ''Control Word register'' en mettant les deux bits A0 et A1 à 1, puis envoyer la configuration du ''Control Word register'' sur le port de 8 bits. ===Le ''High Precision Event Timer'' (HPET)=== De nos jours, l'horloge temps réel et l'Intel 8253/8254 tendent à être remplacé par un autre ''timer'', le ''High Precision Event Timer'' (HPET). Il s'agit d'un compteur de 64 bits, dont la fréquence est d'au moins 10 MHz. Il s'agit bien d'un compteur et non d'un décompteur. Il gère nativement plusieurs valeurs limites à laquelle générer un signal, qui sont configurables. Pour cela, il est couplé à plusieurs comparateurs, chacun associé à un registre pour mémoriser la valeur limite. Il doit y avoir au moins trois comparateurs/registres, mais le nombre peut monter jusqu’à 256. [[File:High Precision Event Timer.png|centre|vignette|upright=2|High Precision Event Timer]] Il faut noter que les systèmes d'exploitation conçus avant le HPET ne peuvent pas l'utiliser, pour des raisons de compatibilité matérielle. C'est le cas de Windows XP avant le Service Pack 3. C'est la raison pour laquelle les cartes mères émulent RTC et PIT dans leurs circuits. D'ailleurs, pour économiser des circuits, les cartes mères modernes émulent le PIT et la RTC avec le HPET : le premier comparateur fournisse la fréquence de 1024 Hz de la RTC, 3 autres comparateurs remplacent l'Intel 8253. Le HPET gère de nombreux modes de fonctionnement : ses comparateurs peuvent être configuré en mode une fois ou périodique, on peut lui demander d'émuler la RTC et le PIT, etc. Chaque comparateur doit pouvoir fonctionner en mode une fois, et au moins un comparateur doit pouvoir fonctionner en mode périodique. Aussi, il contient aussi 3 registres de configuration. Notons qu'il est aussi possible de lire ou écrire dans le compteur de 64 bits, mais ce n'est pas recommandé. ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les compteurs à rétroaction | nextText=Les compteurs à rétroaction }} </noinclude> 7uvkarq5152p1xoxz4pv0j243oxyhhe 768088 768087 2026-06-18T17:12:17Z Mewtow 31375 /* Les diviseurs de fréquence : compter des cycles d'horloge */ 768088 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La taille d'un compteur est surtout pertinente sur les compteurs à incrément, elle a moins de pertinence sur les autres compteurs. La plupart des compteurs à incrément comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==L'intérieur d'un compteur== A une exception bien précise qu'on abordera plus bas, les compteurs sont composés d'un registre, qui mémorise le décompte, couplé à un circuit '''incrémenteur'''. Nous avions déjà abordé l'incrémenteur dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique. Le pas du compteur précise de combien on incrémente le compteur par cycle d'horloge.]] L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs à partir de compteurs plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs modulo=== Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les mal-nommés ''compteurs asynchrones''=== Les '''compteurs asynchrones''' n'utilisent pas de circuit incrémenteur. A la place, ils sont fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Précisons cependant qu'ils sont très mal nommés, à savoir que ce sont bien des circuits synchrones. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les ''timers'' : compter des durées, compter des cycles d'horloge== Les '''''timers''''', aussi appelés ''Programmable interval timer'', sont des circuits capables de compter des durées, exprimées en cycles d'horloge. Leur fonctionnement est assez simple : ils émettent un signal quand un certain nombre de cycles est écoulé, ce nombre de cycles étant configurable. On peut ainsi générer un signal qui surviendra après 50 cycles d'horloge, ou après 100 cycles d'horloge, etc. Le signal en question est disponible sur une sortie de 1 bit, et correspond tout simplement au fait que cette sortie est mise à 1, pendant un cycle d'horloge. Les ''timers'' sont composés d'un compteur/décompteur cadencé par un signal d'horloge. Le compteur initialisé à 0, puis est incrémenté à chaque signal d'horloge, jusqu’à atteinte d'une valeur limite où il génère un signal. Pour un décompteur, c'est la même chose, sauf que le décompteur est initialisé à sa valeur limite et est décrémenté à chaque cycle, et envoie un signal quand il atteint 0. Les ''timers'' basés sur des décompteurs sont nettement plus simples que les autres, ce qui fait qu'ils sont plus utilisés Pour que les ''timers'' soient configurables, on doit pouvoir préciser combien de cycles il faut (dé-)compter avant d'émettre un signal. On peut ainsi préciser s'il faut émettre le signal après 32 cycles d'horloge, après les 50 cycles, tous les 129 cycles, etc. Le nombre de cycles en question est envoyé sur une entrée d’initialisation du compteur. Les ''timers'' matériels peuvent compter de deux manières différentes, appelées '''mode une fois''' et '''mode périodique'''. * En mode une fois, le ''timer'' s'arrête une fois qu'il a atteint la limite configurée. On doit le réinitialiser manuellement, par l'intermédiaire du logiciel, pour l'utiliser une nouvelle fois. Cela permet de compter une certaine durée, exprimée en nombre de cycles d'horloge. * En mode périodique, le ''timer'' se réinitialise automatiquement avec la valeur de départ, ce qui fait qu'il reboucle à l'infini. En clair, le ''timer'' se comporte comme un diviseur de fréquence. Si le compteur est réglé de manière à émettre un signal tous les 9 cycles d'horloge, la fréquence de sortie sera de 9 fois moins celle de la fréquence d'entrée du compteur. Un ordinateur est rempli de ''timers'' divers. Dans ce qui va suivre, nous allons voir les principaux ''timers'', qui sont actuellement intégrés dans les PC modernes. Ils se trouvent sur la carte mère ou dans le processeur, tout dépend du ''timer''. ===Le ''watchdog timer''=== Le '''''watchdog timer''''' est un ''timer'' spécifique dont le but est de redémarrer automatiquement l'ordinateur si jamais celui-ci ne répond plus ou plante. Beaucoup de PC s'en passent, mais ce ''timer'' est très fréquent dans les architectures embarquées. Le ''watchdog timer'' est un compteur/décompteur qui doit être réinitialisé régulièrement. S'il n'est pas réinitialisé, le ''watchdog timer'' déborde (revient à 0 ou atteint 0) et envoie un signal qui redémarre le système. Le système est conçu pour réinitialiser le ''watchdog timer'' régulièrement, ce qui signifie que le système n'est pas censé redémarrer. Si jamais le système dysfonctionne gravement, le système ne pourra pas réinitialiser le ''watchdog timer'' et le système est redémarré automatiquement ou mis en arrêt. [[File:SimpleWatchdogTimer.gif|centre|vignette|upright=2|Le ''Watchdog Timer'' et l'ordinateur.]] ===Le ''Time Stamp Counter'' des processeurs x86=== Tous les processeurs des PC actuels sont des processeurs dits x86. Nous ne pouvons pas expliquer ce que cela signifie pour le moment, retenez juste ce terme. Sachez que tous les processeurs x86 contiennent un compteur de 64 bits, appelé le '''''Time Stamp Counter''''', qui mémorise le nombre de cycles d'horloge qu'a effectué le processeur depuis son démarrage. Les programmes peuvent accéder à ce registre assez facilement, ce qui est utile pour faire des mesures ou comparer les performances de deux applications. Il permet de compter combien de cycles d'horloge met un morceau de code à s’exécuter, combien de cycles prend une instruction à s’exécuter, etc. Les processeurs non-x86 ont un registre équivalent, que ce soit les processeurs ARM ou d'autres. Malheureusement, ce compteur est tombé en désuétude pour tout un tas de raisons. La principale est que les processeurs actuels font varier leur fréquence suivant les besoins. Ils augmentent leur fréquence quand on leur demande de faire beaucoup de calculs, et se mettent en mode basse(fréquence pour économiser de l'énergie si on ne leur demande pas grand chose. Avec une fréquence variable, le ''Time Stamp Counter'' perd complétement en fiabilité. Intel a tenté de corriger ce défaut en incrémentant ce registre à une fréquence constante, différente de celle du processeur, ce qui est encore le cas sur les processeurs Intel actuels. Le comportement est un peu différent sur les processeurs AMD, qui cadencent ce ''timer'' à la fréquence du processeur mais utilisent des mécanismes de synchronisation assez complexes pour corriger l'effet de la fréquence variable. ===L'horloge temps réel=== L''''horloge temps réel''' est un ''timer'' qui génère une fréquence de 1024 Hz, soit près d'un Kilohertz. Dans ce qui suit, nous la noterons RTC, ce qui est l'acronyme du terme anglais ''Real Time Clock''. La RTC prend en entrée un signal d'horloge de 32KHz, généré par un oscillateur à Quartz, et fournit en sortie un signal de fréquence 32 fois plus faible, c'est à dire de 1 KHz. Pour cela, elle est réglée en mode répétitif et son décompteur interne est initialisé à 32. La RTC génère donc un signal toutes les millisecondes, qui est envoyé au processeur. On peut, en théorie, changer la fréquence de la RTC, mais c'est rarement une bonne idée. En théorie, la RTC permet de compter des durées assez courtes, comme le ''ping'' (le temps de latence d'un réseau, pour simplifier), le temps de rafraichissement de l'écran, ou bien d'autres choses. Mais dans les faits, l'horloge temps réel sa fréquence n'aide pas : 1024 Hz est proche de 1000, mais pas assez pour faire des mesures à la milliseconde près, chose qui est nécessaire pour mesurer le ''ping'' ou d'autres choses utiles. A la place, l'ordinateur l'utilise pour que l'ordinateur soit toujours à l'heure. L'ordinateur sait quelle heure il est avec une précision de l'ordre de la seconde (vous pouvez regarder le bureau de Windows dans le coin inférieur droite de votre écran pour vous en convaincre). ===Le ''Programmable Interval Timer'' : l'Intel 8253=== L'Intel 8253 était un ''timer'' programmable autrefois soudé sur les cartes mères des premiers PC. Il fût suivi par l'Intel 8254, qui en était une légère amélioration. Il était cadencé par une horloge maitre, générée par un oscillateur à Quartz, dont la fréquence est de 32 768 Hertz, soit 2^15 cycles d'horloge par seconde. S'il n'est plus présent dans un boitier sur la carte mère, on trouve toujours un circuit semblable au 8253 à l'intérieur du ''chipset'' de la carte mère, voire à l'intérieur du processeur, pour des raisons de compatibilité. L'intérieur de l'Intel 8253 est illustré ci-dessous. Nous allons expliquer l'ensemble de ce schéma, rassurez-vous, mais les explications seront plus simples à comprendre si vous survolez ce schéma en premier lieu. [[File:Intel 8253 block diagram.svg|centre|vignette|upright=2|Intel 8253, intérieur.]] L'Intel 8253 contient trois compteurs de 16 bits, numérotés 0, 1 et 2. Pour chaque compteur, l'entrée CLOCK est celle de l'horloge de 32 MHz, l'entrée GATE active ou désactive le compteur, la sortie fournit le signal voulu et/ou la fréquence de sortie. Les trois compteurs étaient utilisés pour dériver plusieurs fréquences allant de 18,2 Hz à environ 500 KHz. Par exemple, il était utilisé par défaut pour le rafraichissement de la mémoire (D)RAM, mais il était souvent reprogrammé pour servir à générer des fréquences spécifiques par le BIOS ou la carte graphique. [[File:Intel 8253 and 8254.svg|vignette|Intel 8253 and 8254]] L'Intel 8253 lui-même possède plusieurs entrées et sorties. En premier lieu, on voit un port de 8 bits connecté aux trois compteurs, qui permet à l'Intel 8253 de communiquer avec le reste de l'ordinateur. La communication se fait dans les deux sens : soit de l'ordinateur vers les compteurs, soit des compteurs vers l'ordinateur. Dans le sens ordinateur -> compteurs, cela permet à l'ordinateur de programmer les compteurs, de les initialiser. Dans l'autre sens, cela permet de récupérer le contenu des compteurs, même si ce n'est pas très utilisé. Il y a aussi 5 entrées de configuration : * Deux bits A0 et A1 pour sélectionner le compteur voulu avec son numéro. * Un bit RD à mettre à 0 pour que l'ordinateur récupère le compteur sélectionné sur le port de 8 bits. * Un bit WR à mettre à 0 pour que l'ordinateur modifie le compteur sélectionné, en envoyant le nombre pour l'initialisation sur le port de 8 bits. * Un bit CS qui active ou désactive l'Intel 8253 et permet de l'allumer ou de l’éteindre. L'Intel 8253 intégre un registre de 8 bits, le ''Control Word register'' qui mémorise la configuration de l'Intel 8253. Pour programmer les trois compteurs, il faut écrire un mot de 8 bits dans ce ''Control Word register''. Pour écrire dans le ''Control Word register'', il faut mettre le bit CS à 0 (on active l'Intel 8253), mettre le bit RDà 1 , le bit WR à 0 le bit WR (on indique qu'on fait une écriture), sélectionner le ''Control Word register'' en mettant les deux bits A0 et A1 à 1, puis envoyer la configuration du ''Control Word register'' sur le port de 8 bits. ===Le ''High Precision Event Timer'' (HPET)=== De nos jours, l'horloge temps réel et l'Intel 8253/8254 tendent à être remplacé par un autre ''timer'', le ''High Precision Event Timer'' (HPET). Il s'agit d'un compteur de 64 bits, dont la fréquence est d'au moins 10 MHz. Il s'agit bien d'un compteur et non d'un décompteur. Il gère nativement plusieurs valeurs limites à laquelle générer un signal, qui sont configurables. Pour cela, il est couplé à plusieurs comparateurs, chacun associé à un registre pour mémoriser la valeur limite. Il doit y avoir au moins trois comparateurs/registres, mais le nombre peut monter jusqu’à 256. [[File:High Precision Event Timer.png|centre|vignette|upright=2|High Precision Event Timer]] Il faut noter que les systèmes d'exploitation conçus avant le HPET ne peuvent pas l'utiliser, pour des raisons de compatibilité matérielle. C'est le cas de Windows XP avant le Service Pack 3. C'est la raison pour laquelle les cartes mères émulent RTC et PIT dans leurs circuits. D'ailleurs, pour économiser des circuits, les cartes mères modernes émulent le PIT et la RTC avec le HPET : le premier comparateur fournisse la fréquence de 1024 Hz de la RTC, 3 autres comparateurs remplacent l'Intel 8253. Le HPET gère de nombreux modes de fonctionnement : ses comparateurs peuvent être configuré en mode une fois ou périodique, on peut lui demander d'émuler la RTC et le PIT, etc. Chaque comparateur doit pouvoir fonctionner en mode une fois, et au moins un comparateur doit pouvoir fonctionner en mode périodique. Aussi, il contient aussi 3 registres de configuration. Notons qu'il est aussi possible de lire ou écrire dans le compteur de 64 bits, mais ce n'est pas recommandé. ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les compteurs à rétroaction | nextText=Les compteurs à rétroaction }} </noinclude> cgoxlp7v7kty5xpo8ohgx23wio4bsjv 768099 768088 2026-06-18T19:15:37Z Mewtow 31375 /* Les timers : compter des durées, compter des cycles d'horloge */ 768099 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La taille d'un compteur est surtout pertinente sur les compteurs à incrément, elle a moins de pertinence sur les autres compteurs. La plupart des compteurs à incrément comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers'' (qu'on verra dans le prochain chapitre). Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==L'intérieur d'un compteur== A une exception bien précise qu'on abordera plus bas, les compteurs sont composés d'un registre, qui mémorise le décompte, couplé à un circuit '''incrémenteur'''. Nous avions déjà abordé l'incrémenteur dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique. Le pas du compteur précise de combien on incrémente le compteur par cycle d'horloge.]] L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs à partir de compteurs plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs modulo=== Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les mal-nommés ''compteurs asynchrones''=== Les '''compteurs asynchrones''' n'utilisent pas de circuit incrémenteur. A la place, ils sont fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Précisons cependant qu'ils sont très mal nommés, à savoir que ce sont bien des circuits synchrones. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les ''timers'' : compter des durées, compter des cycles d'horloge== Les '''''timers''''', aussi appelés ''Programmable interval timer'', sont des circuits capables de compter des durées, exprimées en cycles d'horloge. Leur fonctionnement est assez simple : ils émettent un signal quand un certain nombre de cycles est écoulé, ce nombre de cycles étant configurable. On peut ainsi générer un signal qui surviendra après 50 cycles d'horloge, ou après 100 cycles d'horloge, etc. Le signal en question est disponible sur une sortie de 1 bit, et correspond tout simplement au fait que cette sortie est mise à 1, pendant un cycle d'horloge. Les ''timers'' sont composés d'un compteur/décompteur cadencé par un signal d'horloge. Le compteur initialisé à 0, puis est incrémenté à chaque signal d'horloge, jusqu’à atteinte d'une valeur limite où il génère un signal. Pour un décompteur, c'est la même chose, sauf que le décompteur est initialisé à sa valeur limite et est décrémenté à chaque cycle, et envoie un signal quand il atteint 0. Les ''timers'' basés sur des décompteurs sont nettement plus simples que les autres, ce qui fait qu'ils sont plus utilisés Pour que les ''timers'' soient configurables, on doit pouvoir préciser combien de cycles il faut (dé-)compter avant d'émettre un signal. On peut ainsi préciser s'il faut émettre le signal après 32 cycles d'horloge, après les 50 cycles, tous les 129 cycles, etc. Le nombre de cycles en question est envoyé sur une entrée d’initialisation du compteur. Les ''timers'' matériels peuvent compter de deux manières différentes, appelées '''mode une fois''' et '''mode périodique'''. * En mode une fois, le ''timer'' s'arrête une fois qu'il a atteint la limite configurée. On doit le réinitialiser manuellement, par l'intermédiaire du logiciel, pour l'utiliser une nouvelle fois. Cela permet de compter une certaine durée, exprimée en nombre de cycles d'horloge. * En mode périodique, le ''timer'' se réinitialise automatiquement avec la valeur de départ, ce qui fait qu'il reboucle à l'infini. Un ordinateur est rempli de ''timers'' divers. Dans ce qui va suivre, nous allons voir les principaux ''timers'', qui sont actuellement intégrés dans les PC modernes. Ils se trouvent sur la carte mère ou dans le processeur, tout dépend du ''timer''. ===Le ''watchdog timer''=== Le '''''watchdog timer''''' est un ''timer'' spécifique dont le but est de redémarrer automatiquement l'ordinateur si jamais celui-ci ne répond plus ou plante. Beaucoup de PC s'en passent, mais ce ''timer'' est très fréquent dans les architectures embarquées. Le ''watchdog timer'' est un compteur/décompteur qui doit être réinitialisé régulièrement. S'il n'est pas réinitialisé, le ''watchdog timer'' déborde (revient à 0 ou atteint 0) et envoie un signal qui redémarre le système. Le système est conçu pour réinitialiser le ''watchdog timer'' régulièrement, ce qui signifie que le système n'est pas censé redémarrer. Si jamais le système dysfonctionne gravement, le système ne pourra pas réinitialiser le ''watchdog timer'' et le système est redémarré automatiquement ou mis en arrêt. [[File:SimpleWatchdogTimer.gif|centre|vignette|upright=2|Le ''Watchdog Timer'' et l'ordinateur.]] ===Le ''Time Stamp Counter'' des processeurs x86=== Tous les processeurs des PC actuels sont des processeurs dits x86. Nous ne pouvons pas expliquer ce que cela signifie pour le moment, retenez juste ce terme. Sachez que tous les processeurs x86 contiennent un compteur de 64 bits, appelé le '''''Time Stamp Counter''''', qui mémorise le nombre de cycles d'horloge qu'a effectué le processeur depuis son démarrage. Les programmes peuvent accéder à ce registre assez facilement, ce qui est utile pour faire des mesures ou comparer les performances de deux applications. Il permet de compter combien de cycles d'horloge met un morceau de code à s’exécuter, combien de cycles prend une instruction à s’exécuter, etc. Les processeurs non-x86 ont un registre équivalent, que ce soit les processeurs ARM ou d'autres. Malheureusement, ce compteur est tombé en désuétude pour tout un tas de raisons. La principale est que les processeurs actuels font varier leur fréquence suivant les besoins. Ils augmentent leur fréquence quand on leur demande de faire beaucoup de calculs, et se mettent en mode basse(fréquence pour économiser de l'énergie si on ne leur demande pas grand chose. Avec une fréquence variable, le ''Time Stamp Counter'' perd complétement en fiabilité. Intel a tenté de corriger ce défaut en incrémentant ce registre à une fréquence constante, différente de celle du processeur, ce qui est encore le cas sur les processeurs Intel actuels. Le comportement est un peu différent sur les processeurs AMD, qui cadencent ce ''timer'' à la fréquence du processeur mais utilisent des mécanismes de synchronisation assez complexes pour corriger l'effet de la fréquence variable. ===L'horloge temps réel=== L''''horloge temps réel''' est un ''timer'' qui génère une fréquence de 1024 Hz, soit près d'un Kilohertz. Dans ce qui suit, nous la noterons RTC, ce qui est l'acronyme du terme anglais ''Real Time Clock''. La RTC prend en entrée un signal d'horloge de 32KHz, généré par un oscillateur à Quartz, et fournit en sortie un signal de fréquence 32 fois plus faible, c'est à dire de 1 KHz. Pour cela, elle est réglée en mode répétitif et son décompteur interne est initialisé à 32. La RTC génère donc un signal toutes les millisecondes, qui est envoyé au processeur. On peut, en théorie, changer la fréquence de la RTC, mais c'est rarement une bonne idée. En théorie, la RTC permet de compter des durées assez courtes, comme le ''ping'' (le temps de latence d'un réseau, pour simplifier), le temps de rafraichissement de l'écran, ou bien d'autres choses. Mais dans les faits, l'horloge temps réel sa fréquence n'aide pas : 1024 Hz est proche de 1000, mais pas assez pour faire des mesures à la milliseconde près, chose qui est nécessaire pour mesurer le ''ping'' ou d'autres choses utiles. A la place, l'ordinateur l'utilise pour que l'ordinateur soit toujours à l'heure. L'ordinateur sait quelle heure il est avec une précision de l'ordre de la seconde (vous pouvez regarder le bureau de Windows dans le coin inférieur droite de votre écran pour vous en convaincre). ===Le ''Programmable Interval Timer'' : l'Intel 8253=== L'Intel 8253 était un ''timer'' programmable autrefois soudé sur les cartes mères des premiers PC. Il fût suivi par l'Intel 8254, qui en était une légère amélioration. Il était cadencé par une horloge maitre, générée par un oscillateur à Quartz, dont la fréquence est de 32 768 Hertz, soit 2^15 cycles d'horloge par seconde. S'il n'est plus présent dans un boitier sur la carte mère, on trouve toujours un circuit semblable au 8253 à l'intérieur du ''chipset'' de la carte mère, voire à l'intérieur du processeur, pour des raisons de compatibilité. L'intérieur de l'Intel 8253 est illustré ci-dessous. Nous allons expliquer l'ensemble de ce schéma, rassurez-vous, mais les explications seront plus simples à comprendre si vous survolez ce schéma en premier lieu. [[File:Intel 8253 block diagram.svg|centre|vignette|upright=2|Intel 8253, intérieur.]] L'Intel 8253 contient trois compteurs de 16 bits, numérotés 0, 1 et 2. Pour chaque compteur, l'entrée CLOCK est celle de l'horloge de 32 MHz, l'entrée GATE active ou désactive le compteur, la sortie fournit le signal voulu et/ou la fréquence de sortie. Les trois compteurs étaient utilisés pour dériver plusieurs fréquences allant de 18,2 Hz à environ 500 KHz. Par exemple, il était utilisé par défaut pour le rafraichissement de la mémoire (D)RAM, mais il était souvent reprogrammé pour servir à générer des fréquences spécifiques par le BIOS ou la carte graphique. [[File:Intel 8253 and 8254.svg|vignette|Intel 8253 and 8254]] L'Intel 8253 lui-même possède plusieurs entrées et sorties. En premier lieu, on voit un port de 8 bits connecté aux trois compteurs, qui permet à l'Intel 8253 de communiquer avec le reste de l'ordinateur. La communication se fait dans les deux sens : soit de l'ordinateur vers les compteurs, soit des compteurs vers l'ordinateur. Dans le sens ordinateur -> compteurs, cela permet à l'ordinateur de programmer les compteurs, de les initialiser. Dans l'autre sens, cela permet de récupérer le contenu des compteurs, même si ce n'est pas très utilisé. Il y a aussi 5 entrées de configuration : * Deux bits A0 et A1 pour sélectionner le compteur voulu avec son numéro. * Un bit RD à mettre à 0 pour que l'ordinateur récupère le compteur sélectionné sur le port de 8 bits. * Un bit WR à mettre à 0 pour que l'ordinateur modifie le compteur sélectionné, en envoyant le nombre pour l'initialisation sur le port de 8 bits. * Un bit CS qui active ou désactive l'Intel 8253 et permet de l'allumer ou de l’éteindre. L'Intel 8253 intégre un registre de 8 bits, le ''Control Word register'' qui mémorise la configuration de l'Intel 8253. Pour programmer les trois compteurs, il faut écrire un mot de 8 bits dans ce ''Control Word register''. Pour écrire dans le ''Control Word register'', il faut mettre le bit CS à 0 (on active l'Intel 8253), mettre le bit RDà 1 , le bit WR à 0 le bit WR (on indique qu'on fait une écriture), sélectionner le ''Control Word register'' en mettant les deux bits A0 et A1 à 1, puis envoyer la configuration du ''Control Word register'' sur le port de 8 bits. ===Le ''High Precision Event Timer'' (HPET)=== De nos jours, l'horloge temps réel et l'Intel 8253/8254 tendent à être remplacé par un autre ''timer'', le ''High Precision Event Timer'' (HPET). Il s'agit d'un compteur de 64 bits, dont la fréquence est d'au moins 10 MHz. Il s'agit bien d'un compteur et non d'un décompteur. Il gère nativement plusieurs valeurs limites à laquelle générer un signal, qui sont configurables. Pour cela, il est couplé à plusieurs comparateurs, chacun associé à un registre pour mémoriser la valeur limite. Il doit y avoir au moins trois comparateurs/registres, mais le nombre peut monter jusqu’à 256. [[File:High Precision Event Timer.png|centre|vignette|upright=2|High Precision Event Timer]] Il faut noter que les systèmes d'exploitation conçus avant le HPET ne peuvent pas l'utiliser, pour des raisons de compatibilité matérielle. C'est le cas de Windows XP avant le Service Pack 3. C'est la raison pour laquelle les cartes mères émulent RTC et PIT dans leurs circuits. D'ailleurs, pour économiser des circuits, les cartes mères modernes émulent le PIT et la RTC avec le HPET : le premier comparateur fournisse la fréquence de 1024 Hz de la RTC, 3 autres comparateurs remplacent l'Intel 8253. Le HPET gère de nombreux modes de fonctionnement : ses comparateurs peuvent être configuré en mode une fois ou périodique, on peut lui demander d'émuler la RTC et le PIT, etc. Chaque comparateur doit pouvoir fonctionner en mode une fois, et au moins un comparateur doit pouvoir fonctionner en mode périodique. Aussi, il contient aussi 3 registres de configuration. Notons qu'il est aussi possible de lire ou écrire dans le compteur de 64 bits, mais ce n'est pas recommandé. ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les compteurs à rétroaction | nextText=Les compteurs à rétroaction }} </noinclude> pyq6bps3hplg2xy3dj6qj428ssn11w5 768100 768099 2026-06-18T19:15:55Z Mewtow 31375 /* L'interface d'un compteur/décompteur */ 768100 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La taille d'un compteur est surtout pertinente sur les compteurs à incrément, elle a moins de pertinence sur les autres compteurs. La plupart des compteurs à incrément comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. D'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers''. Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==L'intérieur d'un compteur== A une exception bien précise qu'on abordera plus bas, les compteurs sont composés d'un registre, qui mémorise le décompte, couplé à un circuit '''incrémenteur'''. Nous avions déjà abordé l'incrémenteur dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique. Le pas du compteur précise de combien on incrémente le compteur par cycle d'horloge.]] L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs à partir de compteurs plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs modulo=== Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les mal-nommés ''compteurs asynchrones''=== Les '''compteurs asynchrones''' n'utilisent pas de circuit incrémenteur. A la place, ils sont fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Précisons cependant qu'ils sont très mal nommés, à savoir que ce sont bien des circuits synchrones. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les ''timers'' : compter des durées, compter des cycles d'horloge== Les '''''timers''''', aussi appelés ''Programmable interval timer'', sont des circuits capables de compter des durées, exprimées en cycles d'horloge. Leur fonctionnement est assez simple : ils émettent un signal quand un certain nombre de cycles est écoulé, ce nombre de cycles étant configurable. On peut ainsi générer un signal qui surviendra après 50 cycles d'horloge, ou après 100 cycles d'horloge, etc. Le signal en question est disponible sur une sortie de 1 bit, et correspond tout simplement au fait que cette sortie est mise à 1, pendant un cycle d'horloge. Les ''timers'' sont composés d'un compteur/décompteur cadencé par un signal d'horloge. Le compteur initialisé à 0, puis est incrémenté à chaque signal d'horloge, jusqu’à atteinte d'une valeur limite où il génère un signal. Pour un décompteur, c'est la même chose, sauf que le décompteur est initialisé à sa valeur limite et est décrémenté à chaque cycle, et envoie un signal quand il atteint 0. Les ''timers'' basés sur des décompteurs sont nettement plus simples que les autres, ce qui fait qu'ils sont plus utilisés Pour que les ''timers'' soient configurables, on doit pouvoir préciser combien de cycles il faut (dé-)compter avant d'émettre un signal. On peut ainsi préciser s'il faut émettre le signal après 32 cycles d'horloge, après les 50 cycles, tous les 129 cycles, etc. Le nombre de cycles en question est envoyé sur une entrée d’initialisation du compteur. Les ''timers'' matériels peuvent compter de deux manières différentes, appelées '''mode une fois''' et '''mode périodique'''. * En mode une fois, le ''timer'' s'arrête une fois qu'il a atteint la limite configurée. On doit le réinitialiser manuellement, par l'intermédiaire du logiciel, pour l'utiliser une nouvelle fois. Cela permet de compter une certaine durée, exprimée en nombre de cycles d'horloge. * En mode périodique, le ''timer'' se réinitialise automatiquement avec la valeur de départ, ce qui fait qu'il reboucle à l'infini. Un ordinateur est rempli de ''timers'' divers. Dans ce qui va suivre, nous allons voir les principaux ''timers'', qui sont actuellement intégrés dans les PC modernes. Ils se trouvent sur la carte mère ou dans le processeur, tout dépend du ''timer''. ===Le ''watchdog timer''=== Le '''''watchdog timer''''' est un ''timer'' spécifique dont le but est de redémarrer automatiquement l'ordinateur si jamais celui-ci ne répond plus ou plante. Beaucoup de PC s'en passent, mais ce ''timer'' est très fréquent dans les architectures embarquées. Le ''watchdog timer'' est un compteur/décompteur qui doit être réinitialisé régulièrement. S'il n'est pas réinitialisé, le ''watchdog timer'' déborde (revient à 0 ou atteint 0) et envoie un signal qui redémarre le système. Le système est conçu pour réinitialiser le ''watchdog timer'' régulièrement, ce qui signifie que le système n'est pas censé redémarrer. Si jamais le système dysfonctionne gravement, le système ne pourra pas réinitialiser le ''watchdog timer'' et le système est redémarré automatiquement ou mis en arrêt. [[File:SimpleWatchdogTimer.gif|centre|vignette|upright=2|Le ''Watchdog Timer'' et l'ordinateur.]] ===Le ''Time Stamp Counter'' des processeurs x86=== Tous les processeurs des PC actuels sont des processeurs dits x86. Nous ne pouvons pas expliquer ce que cela signifie pour le moment, retenez juste ce terme. Sachez que tous les processeurs x86 contiennent un compteur de 64 bits, appelé le '''''Time Stamp Counter''''', qui mémorise le nombre de cycles d'horloge qu'a effectué le processeur depuis son démarrage. Les programmes peuvent accéder à ce registre assez facilement, ce qui est utile pour faire des mesures ou comparer les performances de deux applications. Il permet de compter combien de cycles d'horloge met un morceau de code à s’exécuter, combien de cycles prend une instruction à s’exécuter, etc. Les processeurs non-x86 ont un registre équivalent, que ce soit les processeurs ARM ou d'autres. Malheureusement, ce compteur est tombé en désuétude pour tout un tas de raisons. La principale est que les processeurs actuels font varier leur fréquence suivant les besoins. Ils augmentent leur fréquence quand on leur demande de faire beaucoup de calculs, et se mettent en mode basse(fréquence pour économiser de l'énergie si on ne leur demande pas grand chose. Avec une fréquence variable, le ''Time Stamp Counter'' perd complétement en fiabilité. Intel a tenté de corriger ce défaut en incrémentant ce registre à une fréquence constante, différente de celle du processeur, ce qui est encore le cas sur les processeurs Intel actuels. Le comportement est un peu différent sur les processeurs AMD, qui cadencent ce ''timer'' à la fréquence du processeur mais utilisent des mécanismes de synchronisation assez complexes pour corriger l'effet de la fréquence variable. ===L'horloge temps réel=== L''''horloge temps réel''' est un ''timer'' qui génère une fréquence de 1024 Hz, soit près d'un Kilohertz. Dans ce qui suit, nous la noterons RTC, ce qui est l'acronyme du terme anglais ''Real Time Clock''. La RTC prend en entrée un signal d'horloge de 32KHz, généré par un oscillateur à Quartz, et fournit en sortie un signal de fréquence 32 fois plus faible, c'est à dire de 1 KHz. Pour cela, elle est réglée en mode répétitif et son décompteur interne est initialisé à 32. La RTC génère donc un signal toutes les millisecondes, qui est envoyé au processeur. On peut, en théorie, changer la fréquence de la RTC, mais c'est rarement une bonne idée. En théorie, la RTC permet de compter des durées assez courtes, comme le ''ping'' (le temps de latence d'un réseau, pour simplifier), le temps de rafraichissement de l'écran, ou bien d'autres choses. Mais dans les faits, l'horloge temps réel sa fréquence n'aide pas : 1024 Hz est proche de 1000, mais pas assez pour faire des mesures à la milliseconde près, chose qui est nécessaire pour mesurer le ''ping'' ou d'autres choses utiles. A la place, l'ordinateur l'utilise pour que l'ordinateur soit toujours à l'heure. L'ordinateur sait quelle heure il est avec une précision de l'ordre de la seconde (vous pouvez regarder le bureau de Windows dans le coin inférieur droite de votre écran pour vous en convaincre). ===Le ''Programmable Interval Timer'' : l'Intel 8253=== L'Intel 8253 était un ''timer'' programmable autrefois soudé sur les cartes mères des premiers PC. Il fût suivi par l'Intel 8254, qui en était une légère amélioration. Il était cadencé par une horloge maitre, générée par un oscillateur à Quartz, dont la fréquence est de 32 768 Hertz, soit 2^15 cycles d'horloge par seconde. S'il n'est plus présent dans un boitier sur la carte mère, on trouve toujours un circuit semblable au 8253 à l'intérieur du ''chipset'' de la carte mère, voire à l'intérieur du processeur, pour des raisons de compatibilité. L'intérieur de l'Intel 8253 est illustré ci-dessous. Nous allons expliquer l'ensemble de ce schéma, rassurez-vous, mais les explications seront plus simples à comprendre si vous survolez ce schéma en premier lieu. [[File:Intel 8253 block diagram.svg|centre|vignette|upright=2|Intel 8253, intérieur.]] L'Intel 8253 contient trois compteurs de 16 bits, numérotés 0, 1 et 2. Pour chaque compteur, l'entrée CLOCK est celle de l'horloge de 32 MHz, l'entrée GATE active ou désactive le compteur, la sortie fournit le signal voulu et/ou la fréquence de sortie. Les trois compteurs étaient utilisés pour dériver plusieurs fréquences allant de 18,2 Hz à environ 500 KHz. Par exemple, il était utilisé par défaut pour le rafraichissement de la mémoire (D)RAM, mais il était souvent reprogrammé pour servir à générer des fréquences spécifiques par le BIOS ou la carte graphique. [[File:Intel 8253 and 8254.svg|vignette|Intel 8253 and 8254]] L'Intel 8253 lui-même possède plusieurs entrées et sorties. En premier lieu, on voit un port de 8 bits connecté aux trois compteurs, qui permet à l'Intel 8253 de communiquer avec le reste de l'ordinateur. La communication se fait dans les deux sens : soit de l'ordinateur vers les compteurs, soit des compteurs vers l'ordinateur. Dans le sens ordinateur -> compteurs, cela permet à l'ordinateur de programmer les compteurs, de les initialiser. Dans l'autre sens, cela permet de récupérer le contenu des compteurs, même si ce n'est pas très utilisé. Il y a aussi 5 entrées de configuration : * Deux bits A0 et A1 pour sélectionner le compteur voulu avec son numéro. * Un bit RD à mettre à 0 pour que l'ordinateur récupère le compteur sélectionné sur le port de 8 bits. * Un bit WR à mettre à 0 pour que l'ordinateur modifie le compteur sélectionné, en envoyant le nombre pour l'initialisation sur le port de 8 bits. * Un bit CS qui active ou désactive l'Intel 8253 et permet de l'allumer ou de l’éteindre. L'Intel 8253 intégre un registre de 8 bits, le ''Control Word register'' qui mémorise la configuration de l'Intel 8253. Pour programmer les trois compteurs, il faut écrire un mot de 8 bits dans ce ''Control Word register''. Pour écrire dans le ''Control Word register'', il faut mettre le bit CS à 0 (on active l'Intel 8253), mettre le bit RDà 1 , le bit WR à 0 le bit WR (on indique qu'on fait une écriture), sélectionner le ''Control Word register'' en mettant les deux bits A0 et A1 à 1, puis envoyer la configuration du ''Control Word register'' sur le port de 8 bits. ===Le ''High Precision Event Timer'' (HPET)=== De nos jours, l'horloge temps réel et l'Intel 8253/8254 tendent à être remplacé par un autre ''timer'', le ''High Precision Event Timer'' (HPET). Il s'agit d'un compteur de 64 bits, dont la fréquence est d'au moins 10 MHz. Il s'agit bien d'un compteur et non d'un décompteur. Il gère nativement plusieurs valeurs limites à laquelle générer un signal, qui sont configurables. Pour cela, il est couplé à plusieurs comparateurs, chacun associé à un registre pour mémoriser la valeur limite. Il doit y avoir au moins trois comparateurs/registres, mais le nombre peut monter jusqu’à 256. [[File:High Precision Event Timer.png|centre|vignette|upright=2|High Precision Event Timer]] Il faut noter que les systèmes d'exploitation conçus avant le HPET ne peuvent pas l'utiliser, pour des raisons de compatibilité matérielle. C'est le cas de Windows XP avant le Service Pack 3. C'est la raison pour laquelle les cartes mères émulent RTC et PIT dans leurs circuits. D'ailleurs, pour économiser des circuits, les cartes mères modernes émulent le PIT et la RTC avec le HPET : le premier comparateur fournisse la fréquence de 1024 Hz de la RTC, 3 autres comparateurs remplacent l'Intel 8253. Le HPET gère de nombreux modes de fonctionnement : ses comparateurs peuvent être configuré en mode une fois ou périodique, on peut lui demander d'émuler la RTC et le PIT, etc. Chaque comparateur doit pouvoir fonctionner en mode une fois, et au moins un comparateur doit pouvoir fonctionner en mode périodique. Aussi, il contient aussi 3 registres de configuration. Notons qu'il est aussi possible de lire ou écrire dans le compteur de 64 bits, mais ce n'est pas recommandé. ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les compteurs à rétroaction | nextText=Les compteurs à rétroaction }} </noinclude> mgr3se54sl70vdn7ieebh6t2e90ssjb 768101 768100 2026-06-18T19:18:55Z Mewtow 31375 768101 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. La taille d'un compteur est surtout pertinente sur les compteurs à incrément, elle a moins de pertinence sur les autres compteurs. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers''. Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==L'intérieur d'un compteur== A une exception bien précise qu'on abordera plus bas, les compteurs sont composés d'un registre, qui mémorise le décompte, couplé à un circuit '''incrémenteur'''. Nous avions déjà abordé l'incrémenteur dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique. Le pas du compteur précise de combien on incrémente le compteur par cycle d'horloge.]] L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs à partir de compteurs plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs modulo=== La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. Mais d'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les mal-nommés ''compteurs asynchrones''=== Les '''compteurs asynchrones''' n'utilisent pas de circuit incrémenteur. A la place, ils sont fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Précisons cependant qu'ils sont très mal nommés, à savoir que ce sont bien des circuits synchrones. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les ''timers'' : compter des durées, compter des cycles d'horloge== Les '''''timers''''', aussi appelés ''Programmable interval timer'', sont des circuits capables de compter des durées, exprimées en cycles d'horloge. Leur fonctionnement est assez simple : ils émettent un signal quand un certain nombre de cycles est écoulé, ce nombre de cycles étant configurable. On peut ainsi générer un signal qui surviendra après 50 cycles d'horloge, ou après 100 cycles d'horloge, etc. Le signal en question est disponible sur une sortie de 1 bit, et correspond tout simplement au fait que cette sortie est mise à 1, pendant un cycle d'horloge. Les ''timers'' sont composés d'un compteur/décompteur cadencé par un signal d'horloge. Le compteur initialisé à 0, puis est incrémenté à chaque signal d'horloge, jusqu’à atteinte d'une valeur limite où il génère un signal. Pour un décompteur, c'est la même chose, sauf que le décompteur est initialisé à sa valeur limite et est décrémenté à chaque cycle, et envoie un signal quand il atteint 0. Les ''timers'' basés sur des décompteurs sont nettement plus simples que les autres, ce qui fait qu'ils sont plus utilisés Pour que les ''timers'' soient configurables, on doit pouvoir préciser combien de cycles il faut (dé-)compter avant d'émettre un signal. On peut ainsi préciser s'il faut émettre le signal après 32 cycles d'horloge, après les 50 cycles, tous les 129 cycles, etc. Le nombre de cycles en question est envoyé sur une entrée d’initialisation du compteur. Les ''timers'' matériels peuvent compter de deux manières différentes, appelées '''mode une fois''' et '''mode périodique'''. * En mode une fois, le ''timer'' s'arrête une fois qu'il a atteint la limite configurée. On doit le réinitialiser manuellement, par l'intermédiaire du logiciel, pour l'utiliser une nouvelle fois. Cela permet de compter une certaine durée, exprimée en nombre de cycles d'horloge. * En mode périodique, le ''timer'' se réinitialise automatiquement avec la valeur de départ, ce qui fait qu'il reboucle à l'infini. Un ordinateur est rempli de ''timers'' divers. Dans ce qui va suivre, nous allons voir les principaux ''timers'', qui sont actuellement intégrés dans les PC modernes. Ils se trouvent sur la carte mère ou dans le processeur, tout dépend du ''timer''. ===Le ''watchdog timer''=== Le '''''watchdog timer''''' est un ''timer'' spécifique dont le but est de redémarrer automatiquement l'ordinateur si jamais celui-ci ne répond plus ou plante. Beaucoup de PC s'en passent, mais ce ''timer'' est très fréquent dans les architectures embarquées. Le ''watchdog timer'' est un compteur/décompteur qui doit être réinitialisé régulièrement. S'il n'est pas réinitialisé, le ''watchdog timer'' déborde (revient à 0 ou atteint 0) et envoie un signal qui redémarre le système. Le système est conçu pour réinitialiser le ''watchdog timer'' régulièrement, ce qui signifie que le système n'est pas censé redémarrer. Si jamais le système dysfonctionne gravement, le système ne pourra pas réinitialiser le ''watchdog timer'' et le système est redémarré automatiquement ou mis en arrêt. [[File:SimpleWatchdogTimer.gif|centre|vignette|upright=2|Le ''Watchdog Timer'' et l'ordinateur.]] ===Le ''Time Stamp Counter'' des processeurs x86=== Tous les processeurs des PC actuels sont des processeurs dits x86. Nous ne pouvons pas expliquer ce que cela signifie pour le moment, retenez juste ce terme. Sachez que tous les processeurs x86 contiennent un compteur de 64 bits, appelé le '''''Time Stamp Counter''''', qui mémorise le nombre de cycles d'horloge qu'a effectué le processeur depuis son démarrage. Les programmes peuvent accéder à ce registre assez facilement, ce qui est utile pour faire des mesures ou comparer les performances de deux applications. Il permet de compter combien de cycles d'horloge met un morceau de code à s’exécuter, combien de cycles prend une instruction à s’exécuter, etc. Les processeurs non-x86 ont un registre équivalent, que ce soit les processeurs ARM ou d'autres. Malheureusement, ce compteur est tombé en désuétude pour tout un tas de raisons. La principale est que les processeurs actuels font varier leur fréquence suivant les besoins. Ils augmentent leur fréquence quand on leur demande de faire beaucoup de calculs, et se mettent en mode basse(fréquence pour économiser de l'énergie si on ne leur demande pas grand chose. Avec une fréquence variable, le ''Time Stamp Counter'' perd complétement en fiabilité. Intel a tenté de corriger ce défaut en incrémentant ce registre à une fréquence constante, différente de celle du processeur, ce qui est encore le cas sur les processeurs Intel actuels. Le comportement est un peu différent sur les processeurs AMD, qui cadencent ce ''timer'' à la fréquence du processeur mais utilisent des mécanismes de synchronisation assez complexes pour corriger l'effet de la fréquence variable. ===L'horloge temps réel=== L''''horloge temps réel''' est un ''timer'' qui génère une fréquence de 1024 Hz, soit près d'un Kilohertz. Dans ce qui suit, nous la noterons RTC, ce qui est l'acronyme du terme anglais ''Real Time Clock''. La RTC prend en entrée un signal d'horloge de 32KHz, généré par un oscillateur à Quartz, et fournit en sortie un signal de fréquence 32 fois plus faible, c'est à dire de 1 KHz. Pour cela, elle est réglée en mode répétitif et son décompteur interne est initialisé à 32. La RTC génère donc un signal toutes les millisecondes, qui est envoyé au processeur. On peut, en théorie, changer la fréquence de la RTC, mais c'est rarement une bonne idée. En théorie, la RTC permet de compter des durées assez courtes, comme le ''ping'' (le temps de latence d'un réseau, pour simplifier), le temps de rafraichissement de l'écran, ou bien d'autres choses. Mais dans les faits, l'horloge temps réel sa fréquence n'aide pas : 1024 Hz est proche de 1000, mais pas assez pour faire des mesures à la milliseconde près, chose qui est nécessaire pour mesurer le ''ping'' ou d'autres choses utiles. A la place, l'ordinateur l'utilise pour que l'ordinateur soit toujours à l'heure. L'ordinateur sait quelle heure il est avec une précision de l'ordre de la seconde (vous pouvez regarder le bureau de Windows dans le coin inférieur droite de votre écran pour vous en convaincre). ===Le ''Programmable Interval Timer'' : l'Intel 8253=== L'Intel 8253 était un ''timer'' programmable autrefois soudé sur les cartes mères des premiers PC. Il fût suivi par l'Intel 8254, qui en était une légère amélioration. Il était cadencé par une horloge maitre, générée par un oscillateur à Quartz, dont la fréquence est de 32 768 Hertz, soit 2^15 cycles d'horloge par seconde. S'il n'est plus présent dans un boitier sur la carte mère, on trouve toujours un circuit semblable au 8253 à l'intérieur du ''chipset'' de la carte mère, voire à l'intérieur du processeur, pour des raisons de compatibilité. L'intérieur de l'Intel 8253 est illustré ci-dessous. Nous allons expliquer l'ensemble de ce schéma, rassurez-vous, mais les explications seront plus simples à comprendre si vous survolez ce schéma en premier lieu. [[File:Intel 8253 block diagram.svg|centre|vignette|upright=2|Intel 8253, intérieur.]] L'Intel 8253 contient trois compteurs de 16 bits, numérotés 0, 1 et 2. Pour chaque compteur, l'entrée CLOCK est celle de l'horloge de 32 MHz, l'entrée GATE active ou désactive le compteur, la sortie fournit le signal voulu et/ou la fréquence de sortie. Les trois compteurs étaient utilisés pour dériver plusieurs fréquences allant de 18,2 Hz à environ 500 KHz. Par exemple, il était utilisé par défaut pour le rafraichissement de la mémoire (D)RAM, mais il était souvent reprogrammé pour servir à générer des fréquences spécifiques par le BIOS ou la carte graphique. [[File:Intel 8253 and 8254.svg|vignette|Intel 8253 and 8254]] L'Intel 8253 lui-même possède plusieurs entrées et sorties. En premier lieu, on voit un port de 8 bits connecté aux trois compteurs, qui permet à l'Intel 8253 de communiquer avec le reste de l'ordinateur. La communication se fait dans les deux sens : soit de l'ordinateur vers les compteurs, soit des compteurs vers l'ordinateur. Dans le sens ordinateur -> compteurs, cela permet à l'ordinateur de programmer les compteurs, de les initialiser. Dans l'autre sens, cela permet de récupérer le contenu des compteurs, même si ce n'est pas très utilisé. Il y a aussi 5 entrées de configuration : * Deux bits A0 et A1 pour sélectionner le compteur voulu avec son numéro. * Un bit RD à mettre à 0 pour que l'ordinateur récupère le compteur sélectionné sur le port de 8 bits. * Un bit WR à mettre à 0 pour que l'ordinateur modifie le compteur sélectionné, en envoyant le nombre pour l'initialisation sur le port de 8 bits. * Un bit CS qui active ou désactive l'Intel 8253 et permet de l'allumer ou de l’éteindre. L'Intel 8253 intégre un registre de 8 bits, le ''Control Word register'' qui mémorise la configuration de l'Intel 8253. Pour programmer les trois compteurs, il faut écrire un mot de 8 bits dans ce ''Control Word register''. Pour écrire dans le ''Control Word register'', il faut mettre le bit CS à 0 (on active l'Intel 8253), mettre le bit RDà 1 , le bit WR à 0 le bit WR (on indique qu'on fait une écriture), sélectionner le ''Control Word register'' en mettant les deux bits A0 et A1 à 1, puis envoyer la configuration du ''Control Word register'' sur le port de 8 bits. ===Le ''High Precision Event Timer'' (HPET)=== De nos jours, l'horloge temps réel et l'Intel 8253/8254 tendent à être remplacé par un autre ''timer'', le ''High Precision Event Timer'' (HPET). Il s'agit d'un compteur de 64 bits, dont la fréquence est d'au moins 10 MHz. Il s'agit bien d'un compteur et non d'un décompteur. Il gère nativement plusieurs valeurs limites à laquelle générer un signal, qui sont configurables. Pour cela, il est couplé à plusieurs comparateurs, chacun associé à un registre pour mémoriser la valeur limite. Il doit y avoir au moins trois comparateurs/registres, mais le nombre peut monter jusqu’à 256. [[File:High Precision Event Timer.png|centre|vignette|upright=2|High Precision Event Timer]] Il faut noter que les systèmes d'exploitation conçus avant le HPET ne peuvent pas l'utiliser, pour des raisons de compatibilité matérielle. C'est le cas de Windows XP avant le Service Pack 3. C'est la raison pour laquelle les cartes mères émulent RTC et PIT dans leurs circuits. D'ailleurs, pour économiser des circuits, les cartes mères modernes émulent le PIT et la RTC avec le HPET : le premier comparateur fournisse la fréquence de 1024 Hz de la RTC, 3 autres comparateurs remplacent l'Intel 8253. Le HPET gère de nombreux modes de fonctionnement : ses comparateurs peuvent être configuré en mode une fois ou périodique, on peut lui demander d'émuler la RTC et le PIT, etc. Chaque comparateur doit pouvoir fonctionner en mode une fois, et au moins un comparateur doit pouvoir fonctionner en mode périodique. Aussi, il contient aussi 3 registres de configuration. Notons qu'il est aussi possible de lire ou écrire dans le compteur de 64 bits, mais ce n'est pas recommandé. ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les compteurs à rétroaction | nextText=Les compteurs à rétroaction }} </noinclude> 0zhe26h0zbb19jld5izqt93vudw2y7p 768102 768101 2026-06-18T19:19:33Z Mewtow 31375 768102 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Outre la valeur de la limite du compteur, il est aussi intéressant de se pencher sur ce qui se passe quand le décompte atteint cette limite. Certains restent bloqués sur le décompte maximale tant qu'on ne les remet pas à zéro "manuellement" : ce sont des ''compteurs à saturation''. D'autres recommencent à compter naturellement à partir de zéro : ce sont des ''compteurs modulaires''. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers''. Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==L'intérieur d'un compteur== A une exception bien précise qu'on abordera plus bas, les compteurs sont composés d'un registre, qui mémorise le décompte, couplé à un circuit '''incrémenteur'''. Nous avions déjà abordé l'incrémenteur dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique. Le pas du compteur précise de combien on incrémente le compteur par cycle d'horloge.]] L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs à partir de compteurs plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs modulo=== La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. Mais d'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les mal-nommés ''compteurs asynchrones''=== Les '''compteurs asynchrones''' n'utilisent pas de circuit incrémenteur. A la place, ils sont fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Précisons cependant qu'ils sont très mal nommés, à savoir que ce sont bien des circuits synchrones. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les ''timers'' : compter des durées, compter des cycles d'horloge== Les '''''timers''''', aussi appelés ''Programmable interval timer'', sont des circuits capables de compter des durées, exprimées en cycles d'horloge. Leur fonctionnement est assez simple : ils émettent un signal quand un certain nombre de cycles est écoulé, ce nombre de cycles étant configurable. On peut ainsi générer un signal qui surviendra après 50 cycles d'horloge, ou après 100 cycles d'horloge, etc. Le signal en question est disponible sur une sortie de 1 bit, et correspond tout simplement au fait que cette sortie est mise à 1, pendant un cycle d'horloge. Les ''timers'' sont composés d'un compteur/décompteur cadencé par un signal d'horloge. Le compteur initialisé à 0, puis est incrémenté à chaque signal d'horloge, jusqu’à atteinte d'une valeur limite où il génère un signal. Pour un décompteur, c'est la même chose, sauf que le décompteur est initialisé à sa valeur limite et est décrémenté à chaque cycle, et envoie un signal quand il atteint 0. Les ''timers'' basés sur des décompteurs sont nettement plus simples que les autres, ce qui fait qu'ils sont plus utilisés Pour que les ''timers'' soient configurables, on doit pouvoir préciser combien de cycles il faut (dé-)compter avant d'émettre un signal. On peut ainsi préciser s'il faut émettre le signal après 32 cycles d'horloge, après les 50 cycles, tous les 129 cycles, etc. Le nombre de cycles en question est envoyé sur une entrée d’initialisation du compteur. Les ''timers'' matériels peuvent compter de deux manières différentes, appelées '''mode une fois''' et '''mode périodique'''. * En mode une fois, le ''timer'' s'arrête une fois qu'il a atteint la limite configurée. On doit le réinitialiser manuellement, par l'intermédiaire du logiciel, pour l'utiliser une nouvelle fois. Cela permet de compter une certaine durée, exprimée en nombre de cycles d'horloge. * En mode périodique, le ''timer'' se réinitialise automatiquement avec la valeur de départ, ce qui fait qu'il reboucle à l'infini. Un ordinateur est rempli de ''timers'' divers. Dans ce qui va suivre, nous allons voir les principaux ''timers'', qui sont actuellement intégrés dans les PC modernes. Ils se trouvent sur la carte mère ou dans le processeur, tout dépend du ''timer''. ===Le ''watchdog timer''=== Le '''''watchdog timer''''' est un ''timer'' spécifique dont le but est de redémarrer automatiquement l'ordinateur si jamais celui-ci ne répond plus ou plante. Beaucoup de PC s'en passent, mais ce ''timer'' est très fréquent dans les architectures embarquées. Le ''watchdog timer'' est un compteur/décompteur qui doit être réinitialisé régulièrement. S'il n'est pas réinitialisé, le ''watchdog timer'' déborde (revient à 0 ou atteint 0) et envoie un signal qui redémarre le système. Le système est conçu pour réinitialiser le ''watchdog timer'' régulièrement, ce qui signifie que le système n'est pas censé redémarrer. Si jamais le système dysfonctionne gravement, le système ne pourra pas réinitialiser le ''watchdog timer'' et le système est redémarré automatiquement ou mis en arrêt. [[File:SimpleWatchdogTimer.gif|centre|vignette|upright=2|Le ''Watchdog Timer'' et l'ordinateur.]] ===Le ''Time Stamp Counter'' des processeurs x86=== Tous les processeurs des PC actuels sont des processeurs dits x86. Nous ne pouvons pas expliquer ce que cela signifie pour le moment, retenez juste ce terme. Sachez que tous les processeurs x86 contiennent un compteur de 64 bits, appelé le '''''Time Stamp Counter''''', qui mémorise le nombre de cycles d'horloge qu'a effectué le processeur depuis son démarrage. Les programmes peuvent accéder à ce registre assez facilement, ce qui est utile pour faire des mesures ou comparer les performances de deux applications. Il permet de compter combien de cycles d'horloge met un morceau de code à s’exécuter, combien de cycles prend une instruction à s’exécuter, etc. Les processeurs non-x86 ont un registre équivalent, que ce soit les processeurs ARM ou d'autres. Malheureusement, ce compteur est tombé en désuétude pour tout un tas de raisons. La principale est que les processeurs actuels font varier leur fréquence suivant les besoins. Ils augmentent leur fréquence quand on leur demande de faire beaucoup de calculs, et se mettent en mode basse(fréquence pour économiser de l'énergie si on ne leur demande pas grand chose. Avec une fréquence variable, le ''Time Stamp Counter'' perd complétement en fiabilité. Intel a tenté de corriger ce défaut en incrémentant ce registre à une fréquence constante, différente de celle du processeur, ce qui est encore le cas sur les processeurs Intel actuels. Le comportement est un peu différent sur les processeurs AMD, qui cadencent ce ''timer'' à la fréquence du processeur mais utilisent des mécanismes de synchronisation assez complexes pour corriger l'effet de la fréquence variable. ===L'horloge temps réel=== L''''horloge temps réel''' est un ''timer'' qui génère une fréquence de 1024 Hz, soit près d'un Kilohertz. Dans ce qui suit, nous la noterons RTC, ce qui est l'acronyme du terme anglais ''Real Time Clock''. La RTC prend en entrée un signal d'horloge de 32KHz, généré par un oscillateur à Quartz, et fournit en sortie un signal de fréquence 32 fois plus faible, c'est à dire de 1 KHz. Pour cela, elle est réglée en mode répétitif et son décompteur interne est initialisé à 32. La RTC génère donc un signal toutes les millisecondes, qui est envoyé au processeur. On peut, en théorie, changer la fréquence de la RTC, mais c'est rarement une bonne idée. En théorie, la RTC permet de compter des durées assez courtes, comme le ''ping'' (le temps de latence d'un réseau, pour simplifier), le temps de rafraichissement de l'écran, ou bien d'autres choses. Mais dans les faits, l'horloge temps réel sa fréquence n'aide pas : 1024 Hz est proche de 1000, mais pas assez pour faire des mesures à la milliseconde près, chose qui est nécessaire pour mesurer le ''ping'' ou d'autres choses utiles. A la place, l'ordinateur l'utilise pour que l'ordinateur soit toujours à l'heure. L'ordinateur sait quelle heure il est avec une précision de l'ordre de la seconde (vous pouvez regarder le bureau de Windows dans le coin inférieur droite de votre écran pour vous en convaincre). ===Le ''Programmable Interval Timer'' : l'Intel 8253=== L'Intel 8253 était un ''timer'' programmable autrefois soudé sur les cartes mères des premiers PC. Il fût suivi par l'Intel 8254, qui en était une légère amélioration. Il était cadencé par une horloge maitre, générée par un oscillateur à Quartz, dont la fréquence est de 32 768 Hertz, soit 2^15 cycles d'horloge par seconde. S'il n'est plus présent dans un boitier sur la carte mère, on trouve toujours un circuit semblable au 8253 à l'intérieur du ''chipset'' de la carte mère, voire à l'intérieur du processeur, pour des raisons de compatibilité. L'intérieur de l'Intel 8253 est illustré ci-dessous. Nous allons expliquer l'ensemble de ce schéma, rassurez-vous, mais les explications seront plus simples à comprendre si vous survolez ce schéma en premier lieu. [[File:Intel 8253 block diagram.svg|centre|vignette|upright=2|Intel 8253, intérieur.]] L'Intel 8253 contient trois compteurs de 16 bits, numérotés 0, 1 et 2. Pour chaque compteur, l'entrée CLOCK est celle de l'horloge de 32 MHz, l'entrée GATE active ou désactive le compteur, la sortie fournit le signal voulu et/ou la fréquence de sortie. Les trois compteurs étaient utilisés pour dériver plusieurs fréquences allant de 18,2 Hz à environ 500 KHz. Par exemple, il était utilisé par défaut pour le rafraichissement de la mémoire (D)RAM, mais il était souvent reprogrammé pour servir à générer des fréquences spécifiques par le BIOS ou la carte graphique. [[File:Intel 8253 and 8254.svg|vignette|Intel 8253 and 8254]] L'Intel 8253 lui-même possède plusieurs entrées et sorties. En premier lieu, on voit un port de 8 bits connecté aux trois compteurs, qui permet à l'Intel 8253 de communiquer avec le reste de l'ordinateur. La communication se fait dans les deux sens : soit de l'ordinateur vers les compteurs, soit des compteurs vers l'ordinateur. Dans le sens ordinateur -> compteurs, cela permet à l'ordinateur de programmer les compteurs, de les initialiser. Dans l'autre sens, cela permet de récupérer le contenu des compteurs, même si ce n'est pas très utilisé. Il y a aussi 5 entrées de configuration : * Deux bits A0 et A1 pour sélectionner le compteur voulu avec son numéro. * Un bit RD à mettre à 0 pour que l'ordinateur récupère le compteur sélectionné sur le port de 8 bits. * Un bit WR à mettre à 0 pour que l'ordinateur modifie le compteur sélectionné, en envoyant le nombre pour l'initialisation sur le port de 8 bits. * Un bit CS qui active ou désactive l'Intel 8253 et permet de l'allumer ou de l’éteindre. L'Intel 8253 intégre un registre de 8 bits, le ''Control Word register'' qui mémorise la configuration de l'Intel 8253. Pour programmer les trois compteurs, il faut écrire un mot de 8 bits dans ce ''Control Word register''. Pour écrire dans le ''Control Word register'', il faut mettre le bit CS à 0 (on active l'Intel 8253), mettre le bit RDà 1 , le bit WR à 0 le bit WR (on indique qu'on fait une écriture), sélectionner le ''Control Word register'' en mettant les deux bits A0 et A1 à 1, puis envoyer la configuration du ''Control Word register'' sur le port de 8 bits. ===Le ''High Precision Event Timer'' (HPET)=== De nos jours, l'horloge temps réel et l'Intel 8253/8254 tendent à être remplacé par un autre ''timer'', le ''High Precision Event Timer'' (HPET). Il s'agit d'un compteur de 64 bits, dont la fréquence est d'au moins 10 MHz. Il s'agit bien d'un compteur et non d'un décompteur. Il gère nativement plusieurs valeurs limites à laquelle générer un signal, qui sont configurables. Pour cela, il est couplé à plusieurs comparateurs, chacun associé à un registre pour mémoriser la valeur limite. Il doit y avoir au moins trois comparateurs/registres, mais le nombre peut monter jusqu’à 256. [[File:High Precision Event Timer.png|centre|vignette|upright=2|High Precision Event Timer]] Il faut noter que les systèmes d'exploitation conçus avant le HPET ne peuvent pas l'utiliser, pour des raisons de compatibilité matérielle. C'est le cas de Windows XP avant le Service Pack 3. C'est la raison pour laquelle les cartes mères émulent RTC et PIT dans leurs circuits. D'ailleurs, pour économiser des circuits, les cartes mères modernes émulent le PIT et la RTC avec le HPET : le premier comparateur fournisse la fréquence de 1024 Hz de la RTC, 3 autres comparateurs remplacent l'Intel 8253. Le HPET gère de nombreux modes de fonctionnement : ses comparateurs peuvent être configuré en mode une fois ou périodique, on peut lui demander d'émuler la RTC et le PIT, etc. Chaque comparateur doit pouvoir fonctionner en mode une fois, et au moins un comparateur doit pouvoir fonctionner en mode périodique. Aussi, il contient aussi 3 registres de configuration. Notons qu'il est aussi possible de lire ou écrire dans le compteur de 64 bits, mais ce n'est pas recommandé. ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les compteurs à rétroaction | nextText=Les compteurs à rétroaction }} </noinclude> cljjv45jw9aopt72jjy93710fbvaxmm 768103 768102 2026-06-18T19:20:55Z Mewtow 31375 768103 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un débordement d'entier a lieu, à savoir quand le compteur n'a pas assez de bits pour encoder le décompte. Le compteur est alors remis à zéro, dans la plupart des cas. Mais il faut prévenir que le compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers''. Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==L'intérieur d'un compteur== A une exception bien précise qu'on abordera plus bas, les compteurs sont composés d'un registre, qui mémorise le décompte, couplé à un circuit '''incrémenteur'''. Nous avions déjà abordé l'incrémenteur dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique. Le pas du compteur précise de combien on incrémente le compteur par cycle d'horloge.]] L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs à partir de compteurs plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs modulo=== La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. Mais d'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les mal-nommés ''compteurs asynchrones''=== Les '''compteurs asynchrones''' n'utilisent pas de circuit incrémenteur. A la place, ils sont fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Précisons cependant qu'ils sont très mal nommés, à savoir que ce sont bien des circuits synchrones. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les ''timers'' : compter des durées, compter des cycles d'horloge== Les '''''timers''''', aussi appelés ''Programmable interval timer'', sont des circuits capables de compter des durées, exprimées en cycles d'horloge. Leur fonctionnement est assez simple : ils émettent un signal quand un certain nombre de cycles est écoulé, ce nombre de cycles étant configurable. On peut ainsi générer un signal qui surviendra après 50 cycles d'horloge, ou après 100 cycles d'horloge, etc. Le signal en question est disponible sur une sortie de 1 bit, et correspond tout simplement au fait que cette sortie est mise à 1, pendant un cycle d'horloge. Les ''timers'' sont composés d'un compteur/décompteur cadencé par un signal d'horloge. Le compteur initialisé à 0, puis est incrémenté à chaque signal d'horloge, jusqu’à atteinte d'une valeur limite où il génère un signal. Pour un décompteur, c'est la même chose, sauf que le décompteur est initialisé à sa valeur limite et est décrémenté à chaque cycle, et envoie un signal quand il atteint 0. Les ''timers'' basés sur des décompteurs sont nettement plus simples que les autres, ce qui fait qu'ils sont plus utilisés Pour que les ''timers'' soient configurables, on doit pouvoir préciser combien de cycles il faut (dé-)compter avant d'émettre un signal. On peut ainsi préciser s'il faut émettre le signal après 32 cycles d'horloge, après les 50 cycles, tous les 129 cycles, etc. Le nombre de cycles en question est envoyé sur une entrée d’initialisation du compteur. Les ''timers'' matériels peuvent compter de deux manières différentes, appelées '''mode une fois''' et '''mode périodique'''. * En mode une fois, le ''timer'' s'arrête une fois qu'il a atteint la limite configurée. On doit le réinitialiser manuellement, par l'intermédiaire du logiciel, pour l'utiliser une nouvelle fois. Cela permet de compter une certaine durée, exprimée en nombre de cycles d'horloge. * En mode périodique, le ''timer'' se réinitialise automatiquement avec la valeur de départ, ce qui fait qu'il reboucle à l'infini. Un ordinateur est rempli de ''timers'' divers. Dans ce qui va suivre, nous allons voir les principaux ''timers'', qui sont actuellement intégrés dans les PC modernes. Ils se trouvent sur la carte mère ou dans le processeur, tout dépend du ''timer''. ===Le ''watchdog timer''=== Le '''''watchdog timer''''' est un ''timer'' spécifique dont le but est de redémarrer automatiquement l'ordinateur si jamais celui-ci ne répond plus ou plante. Beaucoup de PC s'en passent, mais ce ''timer'' est très fréquent dans les architectures embarquées. Le ''watchdog timer'' est un compteur/décompteur qui doit être réinitialisé régulièrement. S'il n'est pas réinitialisé, le ''watchdog timer'' déborde (revient à 0 ou atteint 0) et envoie un signal qui redémarre le système. Le système est conçu pour réinitialiser le ''watchdog timer'' régulièrement, ce qui signifie que le système n'est pas censé redémarrer. Si jamais le système dysfonctionne gravement, le système ne pourra pas réinitialiser le ''watchdog timer'' et le système est redémarré automatiquement ou mis en arrêt. [[File:SimpleWatchdogTimer.gif|centre|vignette|upright=2|Le ''Watchdog Timer'' et l'ordinateur.]] ===Le ''Time Stamp Counter'' des processeurs x86=== Tous les processeurs des PC actuels sont des processeurs dits x86. Nous ne pouvons pas expliquer ce que cela signifie pour le moment, retenez juste ce terme. Sachez que tous les processeurs x86 contiennent un compteur de 64 bits, appelé le '''''Time Stamp Counter''''', qui mémorise le nombre de cycles d'horloge qu'a effectué le processeur depuis son démarrage. Les programmes peuvent accéder à ce registre assez facilement, ce qui est utile pour faire des mesures ou comparer les performances de deux applications. Il permet de compter combien de cycles d'horloge met un morceau de code à s’exécuter, combien de cycles prend une instruction à s’exécuter, etc. Les processeurs non-x86 ont un registre équivalent, que ce soit les processeurs ARM ou d'autres. Malheureusement, ce compteur est tombé en désuétude pour tout un tas de raisons. La principale est que les processeurs actuels font varier leur fréquence suivant les besoins. Ils augmentent leur fréquence quand on leur demande de faire beaucoup de calculs, et se mettent en mode basse(fréquence pour économiser de l'énergie si on ne leur demande pas grand chose. Avec une fréquence variable, le ''Time Stamp Counter'' perd complétement en fiabilité. Intel a tenté de corriger ce défaut en incrémentant ce registre à une fréquence constante, différente de celle du processeur, ce qui est encore le cas sur les processeurs Intel actuels. Le comportement est un peu différent sur les processeurs AMD, qui cadencent ce ''timer'' à la fréquence du processeur mais utilisent des mécanismes de synchronisation assez complexes pour corriger l'effet de la fréquence variable. ===L'horloge temps réel=== L''''horloge temps réel''' est un ''timer'' qui génère une fréquence de 1024 Hz, soit près d'un Kilohertz. Dans ce qui suit, nous la noterons RTC, ce qui est l'acronyme du terme anglais ''Real Time Clock''. La RTC prend en entrée un signal d'horloge de 32KHz, généré par un oscillateur à Quartz, et fournit en sortie un signal de fréquence 32 fois plus faible, c'est à dire de 1 KHz. Pour cela, elle est réglée en mode répétitif et son décompteur interne est initialisé à 32. La RTC génère donc un signal toutes les millisecondes, qui est envoyé au processeur. On peut, en théorie, changer la fréquence de la RTC, mais c'est rarement une bonne idée. En théorie, la RTC permet de compter des durées assez courtes, comme le ''ping'' (le temps de latence d'un réseau, pour simplifier), le temps de rafraichissement de l'écran, ou bien d'autres choses. Mais dans les faits, l'horloge temps réel sa fréquence n'aide pas : 1024 Hz est proche de 1000, mais pas assez pour faire des mesures à la milliseconde près, chose qui est nécessaire pour mesurer le ''ping'' ou d'autres choses utiles. A la place, l'ordinateur l'utilise pour que l'ordinateur soit toujours à l'heure. L'ordinateur sait quelle heure il est avec une précision de l'ordre de la seconde (vous pouvez regarder le bureau de Windows dans le coin inférieur droite de votre écran pour vous en convaincre). ===Le ''Programmable Interval Timer'' : l'Intel 8253=== L'Intel 8253 était un ''timer'' programmable autrefois soudé sur les cartes mères des premiers PC. Il fût suivi par l'Intel 8254, qui en était une légère amélioration. Il était cadencé par une horloge maitre, générée par un oscillateur à Quartz, dont la fréquence est de 32 768 Hertz, soit 2^15 cycles d'horloge par seconde. S'il n'est plus présent dans un boitier sur la carte mère, on trouve toujours un circuit semblable au 8253 à l'intérieur du ''chipset'' de la carte mère, voire à l'intérieur du processeur, pour des raisons de compatibilité. L'intérieur de l'Intel 8253 est illustré ci-dessous. Nous allons expliquer l'ensemble de ce schéma, rassurez-vous, mais les explications seront plus simples à comprendre si vous survolez ce schéma en premier lieu. [[File:Intel 8253 block diagram.svg|centre|vignette|upright=2|Intel 8253, intérieur.]] L'Intel 8253 contient trois compteurs de 16 bits, numérotés 0, 1 et 2. Pour chaque compteur, l'entrée CLOCK est celle de l'horloge de 32 MHz, l'entrée GATE active ou désactive le compteur, la sortie fournit le signal voulu et/ou la fréquence de sortie. Les trois compteurs étaient utilisés pour dériver plusieurs fréquences allant de 18,2 Hz à environ 500 KHz. Par exemple, il était utilisé par défaut pour le rafraichissement de la mémoire (D)RAM, mais il était souvent reprogrammé pour servir à générer des fréquences spécifiques par le BIOS ou la carte graphique. [[File:Intel 8253 and 8254.svg|vignette|Intel 8253 and 8254]] L'Intel 8253 lui-même possède plusieurs entrées et sorties. En premier lieu, on voit un port de 8 bits connecté aux trois compteurs, qui permet à l'Intel 8253 de communiquer avec le reste de l'ordinateur. La communication se fait dans les deux sens : soit de l'ordinateur vers les compteurs, soit des compteurs vers l'ordinateur. Dans le sens ordinateur -> compteurs, cela permet à l'ordinateur de programmer les compteurs, de les initialiser. Dans l'autre sens, cela permet de récupérer le contenu des compteurs, même si ce n'est pas très utilisé. Il y a aussi 5 entrées de configuration : * Deux bits A0 et A1 pour sélectionner le compteur voulu avec son numéro. * Un bit RD à mettre à 0 pour que l'ordinateur récupère le compteur sélectionné sur le port de 8 bits. * Un bit WR à mettre à 0 pour que l'ordinateur modifie le compteur sélectionné, en envoyant le nombre pour l'initialisation sur le port de 8 bits. * Un bit CS qui active ou désactive l'Intel 8253 et permet de l'allumer ou de l’éteindre. L'Intel 8253 intégre un registre de 8 bits, le ''Control Word register'' qui mémorise la configuration de l'Intel 8253. Pour programmer les trois compteurs, il faut écrire un mot de 8 bits dans ce ''Control Word register''. Pour écrire dans le ''Control Word register'', il faut mettre le bit CS à 0 (on active l'Intel 8253), mettre le bit RDà 1 , le bit WR à 0 le bit WR (on indique qu'on fait une écriture), sélectionner le ''Control Word register'' en mettant les deux bits A0 et A1 à 1, puis envoyer la configuration du ''Control Word register'' sur le port de 8 bits. ===Le ''High Precision Event Timer'' (HPET)=== De nos jours, l'horloge temps réel et l'Intel 8253/8254 tendent à être remplacé par un autre ''timer'', le ''High Precision Event Timer'' (HPET). Il s'agit d'un compteur de 64 bits, dont la fréquence est d'au moins 10 MHz. Il s'agit bien d'un compteur et non d'un décompteur. Il gère nativement plusieurs valeurs limites à laquelle générer un signal, qui sont configurables. Pour cela, il est couplé à plusieurs comparateurs, chacun associé à un registre pour mémoriser la valeur limite. Il doit y avoir au moins trois comparateurs/registres, mais le nombre peut monter jusqu’à 256. [[File:High Precision Event Timer.png|centre|vignette|upright=2|High Precision Event Timer]] Il faut noter que les systèmes d'exploitation conçus avant le HPET ne peuvent pas l'utiliser, pour des raisons de compatibilité matérielle. C'est le cas de Windows XP avant le Service Pack 3. C'est la raison pour laquelle les cartes mères émulent RTC et PIT dans leurs circuits. D'ailleurs, pour économiser des circuits, les cartes mères modernes émulent le PIT et la RTC avec le HPET : le premier comparateur fournisse la fréquence de 1024 Hz de la RTC, 3 autres comparateurs remplacent l'Intel 8253. Le HPET gère de nombreux modes de fonctionnement : ses comparateurs peuvent être configuré en mode une fois ou périodique, on peut lui demander d'émuler la RTC et le PIT, etc. Chaque comparateur doit pouvoir fonctionner en mode une fois, et au moins un comparateur doit pouvoir fonctionner en mode périodique. Aussi, il contient aussi 3 registres de configuration. Notons qu'il est aussi possible de lire ou écrire dans le compteur de 64 bits, mais ce n'est pas recommandé. ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les compteurs à rétroaction | nextText=Les compteurs à rétroaction }} </noinclude> 8ea87fhrky41psvwpbwhdr5axejidez 768104 768103 2026-06-18T19:21:14Z Mewtow 31375 768104 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un débordement d'entier a lieu, à savoir quand le compteur n'a pas assez de bits pour encoder le décompte. Le compteur est alors remis à zéro, dans la plupart des cas. Mais il faut prévenir que le compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers''. Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==L'intérieur d'un compteur== A une exception bien précise qu'on abordera plus bas, les compteurs sont composés d'un registre, qui mémorise le décompte, couplé à un circuit '''incrémenteur'''. Nous avions déjà abordé l'incrémenteur dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique. Le pas du compteur précise de combien on incrémente le compteur par cycle d'horloge.]] L'incrémenteur à propagation de retenue est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs à partir de compteurs plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs modulo=== La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. Mais d'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les mal-nommés ''compteurs asynchrones''=== Les '''compteurs asynchrones''' n'utilisent pas de circuit incrémenteur. A la place, ils sont fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Précisons cependant qu'ils sont très mal nommés, à savoir que ce sont bien des circuits synchrones. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les ''timers'' : compter des durées, compter des cycles d'horloge== Les '''''timers''''', aussi appelés ''Programmable interval timer'', sont des circuits capables de compter des durées, exprimées en cycles d'horloge. Leur fonctionnement est assez simple : ils émettent un signal quand un certain nombre de cycles est écoulé, ce nombre de cycles étant configurable. On peut ainsi générer un signal qui surviendra après 50 cycles d'horloge, ou après 100 cycles d'horloge, etc. Le signal en question est disponible sur une sortie de 1 bit, et correspond tout simplement au fait que cette sortie est mise à 1, pendant un cycle d'horloge. Les ''timers'' sont composés d'un compteur/décompteur cadencé par un signal d'horloge. Le compteur initialisé à 0, puis est incrémenté à chaque signal d'horloge, jusqu’à atteinte d'une valeur limite où il génère un signal. Pour un décompteur, c'est la même chose, sauf que le décompteur est initialisé à sa valeur limite et est décrémenté à chaque cycle, et envoie un signal quand il atteint 0. Les ''timers'' basés sur des décompteurs sont nettement plus simples que les autres, ce qui fait qu'ils sont plus utilisés Pour que les ''timers'' soient configurables, on doit pouvoir préciser combien de cycles il faut (dé-)compter avant d'émettre un signal. On peut ainsi préciser s'il faut émettre le signal après 32 cycles d'horloge, après les 50 cycles, tous les 129 cycles, etc. Le nombre de cycles en question est envoyé sur une entrée d’initialisation du compteur. Les ''timers'' matériels peuvent compter de deux manières différentes, appelées '''mode une fois''' et '''mode périodique'''. * En mode une fois, le ''timer'' s'arrête une fois qu'il a atteint la limite configurée. On doit le réinitialiser manuellement, par l'intermédiaire du logiciel, pour l'utiliser une nouvelle fois. Cela permet de compter une certaine durée, exprimée en nombre de cycles d'horloge. * En mode périodique, le ''timer'' se réinitialise automatiquement avec la valeur de départ, ce qui fait qu'il reboucle à l'infini. Un ordinateur est rempli de ''timers'' divers. Dans ce qui va suivre, nous allons voir les principaux ''timers'', qui sont actuellement intégrés dans les PC modernes. Ils se trouvent sur la carte mère ou dans le processeur, tout dépend du ''timer''. ===Le ''watchdog timer''=== Le '''''watchdog timer''''' est un ''timer'' spécifique dont le but est de redémarrer automatiquement l'ordinateur si jamais celui-ci ne répond plus ou plante. Beaucoup de PC s'en passent, mais ce ''timer'' est très fréquent dans les architectures embarquées. Le ''watchdog timer'' est un compteur/décompteur qui doit être réinitialisé régulièrement. S'il n'est pas réinitialisé, le ''watchdog timer'' déborde (revient à 0 ou atteint 0) et envoie un signal qui redémarre le système. Le système est conçu pour réinitialiser le ''watchdog timer'' régulièrement, ce qui signifie que le système n'est pas censé redémarrer. Si jamais le système dysfonctionne gravement, le système ne pourra pas réinitialiser le ''watchdog timer'' et le système est redémarré automatiquement ou mis en arrêt. [[File:SimpleWatchdogTimer.gif|centre|vignette|upright=2|Le ''Watchdog Timer'' et l'ordinateur.]] ===Le ''Time Stamp Counter'' des processeurs x86=== Tous les processeurs des PC actuels sont des processeurs dits x86. Nous ne pouvons pas expliquer ce que cela signifie pour le moment, retenez juste ce terme. Sachez que tous les processeurs x86 contiennent un compteur de 64 bits, appelé le '''''Time Stamp Counter''''', qui mémorise le nombre de cycles d'horloge qu'a effectué le processeur depuis son démarrage. Les programmes peuvent accéder à ce registre assez facilement, ce qui est utile pour faire des mesures ou comparer les performances de deux applications. Il permet de compter combien de cycles d'horloge met un morceau de code à s’exécuter, combien de cycles prend une instruction à s’exécuter, etc. Les processeurs non-x86 ont un registre équivalent, que ce soit les processeurs ARM ou d'autres. Malheureusement, ce compteur est tombé en désuétude pour tout un tas de raisons. La principale est que les processeurs actuels font varier leur fréquence suivant les besoins. Ils augmentent leur fréquence quand on leur demande de faire beaucoup de calculs, et se mettent en mode basse(fréquence pour économiser de l'énergie si on ne leur demande pas grand chose. Avec une fréquence variable, le ''Time Stamp Counter'' perd complétement en fiabilité. Intel a tenté de corriger ce défaut en incrémentant ce registre à une fréquence constante, différente de celle du processeur, ce qui est encore le cas sur les processeurs Intel actuels. Le comportement est un peu différent sur les processeurs AMD, qui cadencent ce ''timer'' à la fréquence du processeur mais utilisent des mécanismes de synchronisation assez complexes pour corriger l'effet de la fréquence variable. ===L'horloge temps réel=== L''''horloge temps réel''' est un ''timer'' qui génère une fréquence de 1024 Hz, soit près d'un Kilohertz. Dans ce qui suit, nous la noterons RTC, ce qui est l'acronyme du terme anglais ''Real Time Clock''. La RTC prend en entrée un signal d'horloge de 32KHz, généré par un oscillateur à Quartz, et fournit en sortie un signal de fréquence 32 fois plus faible, c'est à dire de 1 KHz. Pour cela, elle est réglée en mode répétitif et son décompteur interne est initialisé à 32. La RTC génère donc un signal toutes les millisecondes, qui est envoyé au processeur. On peut, en théorie, changer la fréquence de la RTC, mais c'est rarement une bonne idée. En théorie, la RTC permet de compter des durées assez courtes, comme le ''ping'' (le temps de latence d'un réseau, pour simplifier), le temps de rafraichissement de l'écran, ou bien d'autres choses. Mais dans les faits, l'horloge temps réel sa fréquence n'aide pas : 1024 Hz est proche de 1000, mais pas assez pour faire des mesures à la milliseconde près, chose qui est nécessaire pour mesurer le ''ping'' ou d'autres choses utiles. A la place, l'ordinateur l'utilise pour que l'ordinateur soit toujours à l'heure. L'ordinateur sait quelle heure il est avec une précision de l'ordre de la seconde (vous pouvez regarder le bureau de Windows dans le coin inférieur droite de votre écran pour vous en convaincre). ===Le ''Programmable Interval Timer'' : l'Intel 8253=== L'Intel 8253 était un ''timer'' programmable autrefois soudé sur les cartes mères des premiers PC. Il fût suivi par l'Intel 8254, qui en était une légère amélioration. Il était cadencé par une horloge maitre, générée par un oscillateur à Quartz, dont la fréquence est de 32 768 Hertz, soit 2^15 cycles d'horloge par seconde. S'il n'est plus présent dans un boitier sur la carte mère, on trouve toujours un circuit semblable au 8253 à l'intérieur du ''chipset'' de la carte mère, voire à l'intérieur du processeur, pour des raisons de compatibilité. L'intérieur de l'Intel 8253 est illustré ci-dessous. Nous allons expliquer l'ensemble de ce schéma, rassurez-vous, mais les explications seront plus simples à comprendre si vous survolez ce schéma en premier lieu. [[File:Intel 8253 block diagram.svg|centre|vignette|upright=2|Intel 8253, intérieur.]] L'Intel 8253 contient trois compteurs de 16 bits, numérotés 0, 1 et 2. Pour chaque compteur, l'entrée CLOCK est celle de l'horloge de 32 MHz, l'entrée GATE active ou désactive le compteur, la sortie fournit le signal voulu et/ou la fréquence de sortie. Les trois compteurs étaient utilisés pour dériver plusieurs fréquences allant de 18,2 Hz à environ 500 KHz. Par exemple, il était utilisé par défaut pour le rafraichissement de la mémoire (D)RAM, mais il était souvent reprogrammé pour servir à générer des fréquences spécifiques par le BIOS ou la carte graphique. [[File:Intel 8253 and 8254.svg|vignette|Intel 8253 and 8254]] L'Intel 8253 lui-même possède plusieurs entrées et sorties. En premier lieu, on voit un port de 8 bits connecté aux trois compteurs, qui permet à l'Intel 8253 de communiquer avec le reste de l'ordinateur. La communication se fait dans les deux sens : soit de l'ordinateur vers les compteurs, soit des compteurs vers l'ordinateur. Dans le sens ordinateur -> compteurs, cela permet à l'ordinateur de programmer les compteurs, de les initialiser. Dans l'autre sens, cela permet de récupérer le contenu des compteurs, même si ce n'est pas très utilisé. Il y a aussi 5 entrées de configuration : * Deux bits A0 et A1 pour sélectionner le compteur voulu avec son numéro. * Un bit RD à mettre à 0 pour que l'ordinateur récupère le compteur sélectionné sur le port de 8 bits. * Un bit WR à mettre à 0 pour que l'ordinateur modifie le compteur sélectionné, en envoyant le nombre pour l'initialisation sur le port de 8 bits. * Un bit CS qui active ou désactive l'Intel 8253 et permet de l'allumer ou de l’éteindre. L'Intel 8253 intégre un registre de 8 bits, le ''Control Word register'' qui mémorise la configuration de l'Intel 8253. Pour programmer les trois compteurs, il faut écrire un mot de 8 bits dans ce ''Control Word register''. Pour écrire dans le ''Control Word register'', il faut mettre le bit CS à 0 (on active l'Intel 8253), mettre le bit RDà 1 , le bit WR à 0 le bit WR (on indique qu'on fait une écriture), sélectionner le ''Control Word register'' en mettant les deux bits A0 et A1 à 1, puis envoyer la configuration du ''Control Word register'' sur le port de 8 bits. ===Le ''High Precision Event Timer'' (HPET)=== De nos jours, l'horloge temps réel et l'Intel 8253/8254 tendent à être remplacé par un autre ''timer'', le ''High Precision Event Timer'' (HPET). Il s'agit d'un compteur de 64 bits, dont la fréquence est d'au moins 10 MHz. Il s'agit bien d'un compteur et non d'un décompteur. Il gère nativement plusieurs valeurs limites à laquelle générer un signal, qui sont configurables. Pour cela, il est couplé à plusieurs comparateurs, chacun associé à un registre pour mémoriser la valeur limite. Il doit y avoir au moins trois comparateurs/registres, mais le nombre peut monter jusqu’à 256. [[File:High Precision Event Timer.png|centre|vignette|upright=2|High Precision Event Timer]] Il faut noter que les systèmes d'exploitation conçus avant le HPET ne peuvent pas l'utiliser, pour des raisons de compatibilité matérielle. C'est le cas de Windows XP avant le Service Pack 3. C'est la raison pour laquelle les cartes mères émulent RTC et PIT dans leurs circuits. D'ailleurs, pour économiser des circuits, les cartes mères modernes émulent le PIT et la RTC avec le HPET : le premier comparateur fournisse la fréquence de 1024 Hz de la RTC, 3 autres comparateurs remplacent l'Intel 8253. Le HPET gère de nombreux modes de fonctionnement : ses comparateurs peuvent être configuré en mode une fois ou périodique, on peut lui demander d'émuler la RTC et le PIT, etc. Chaque comparateur doit pouvoir fonctionner en mode une fois, et au moins un comparateur doit pouvoir fonctionner en mode périodique. Aussi, il contient aussi 3 registres de configuration. Notons qu'il est aussi possible de lire ou écrire dans le compteur de 64 bits, mais ce n'est pas recommandé. ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les compteurs à rétroaction | nextText=Les compteurs à rétroaction }} </noinclude> 806aka4y2pq0rn8gd7zh9hqyqp2j35p 768105 768104 2026-06-18T19:25:08Z Mewtow 31375 /* L'intérieur d'un compteur */ 768105 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un débordement d'entier a lieu, à savoir quand le compteur n'a pas assez de bits pour encoder le décompte. Le compteur est alors remis à zéro, dans la plupart des cas. Mais il faut prévenir que le compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers''. Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==L'intérieur d'un compteur== A une exception bien précise qu'on abordera plus bas, les compteurs sont composés d'un registre, qui mémorise le décompte, couplé à un circuit '''incrémenteur'''. Nous avions déjà abordé l'incrémenteur dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique. Le pas du compteur précise de combien on incrémente le compteur par cycle d'horloge.]] L'incrémenteur le plus simple, à propagation de retenue, est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : {| |[[File:Dual Sync Counter Forward Backward.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec sortie de débordement.]] |[[File:Dual Sync Counter Forward Carry.svg|centre|vignette|upright=1.5|Compteur à propagation de retenues, avec entrée d'incrémentation configurable.]] |} Si on ouvre la boite noire qu'est un demi-additionneur, on obtient ceci : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs à partir de compteurs plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs modulo=== La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. Mais d'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les mal-nommés ''compteurs asynchrones''=== Les '''compteurs asynchrones''' n'utilisent pas de circuit incrémenteur. A la place, ils sont fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Précisons cependant qu'ils sont très mal nommés, à savoir que ce sont bien des circuits synchrones. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les ''timers'' : compter des durées, compter des cycles d'horloge== Les '''''timers''''', aussi appelés ''Programmable interval timer'', sont des circuits capables de compter des durées, exprimées en cycles d'horloge. Leur fonctionnement est assez simple : ils émettent un signal quand un certain nombre de cycles est écoulé, ce nombre de cycles étant configurable. On peut ainsi générer un signal qui surviendra après 50 cycles d'horloge, ou après 100 cycles d'horloge, etc. Le signal en question est disponible sur une sortie de 1 bit, et correspond tout simplement au fait que cette sortie est mise à 1, pendant un cycle d'horloge. Les ''timers'' sont composés d'un compteur/décompteur cadencé par un signal d'horloge. Le compteur initialisé à 0, puis est incrémenté à chaque signal d'horloge, jusqu’à atteinte d'une valeur limite où il génère un signal. Pour un décompteur, c'est la même chose, sauf que le décompteur est initialisé à sa valeur limite et est décrémenté à chaque cycle, et envoie un signal quand il atteint 0. Les ''timers'' basés sur des décompteurs sont nettement plus simples que les autres, ce qui fait qu'ils sont plus utilisés Pour que les ''timers'' soient configurables, on doit pouvoir préciser combien de cycles il faut (dé-)compter avant d'émettre un signal. On peut ainsi préciser s'il faut émettre le signal après 32 cycles d'horloge, après les 50 cycles, tous les 129 cycles, etc. Le nombre de cycles en question est envoyé sur une entrée d’initialisation du compteur. Les ''timers'' matériels peuvent compter de deux manières différentes, appelées '''mode une fois''' et '''mode périodique'''. * En mode une fois, le ''timer'' s'arrête une fois qu'il a atteint la limite configurée. On doit le réinitialiser manuellement, par l'intermédiaire du logiciel, pour l'utiliser une nouvelle fois. Cela permet de compter une certaine durée, exprimée en nombre de cycles d'horloge. * En mode périodique, le ''timer'' se réinitialise automatiquement avec la valeur de départ, ce qui fait qu'il reboucle à l'infini. Un ordinateur est rempli de ''timers'' divers. Dans ce qui va suivre, nous allons voir les principaux ''timers'', qui sont actuellement intégrés dans les PC modernes. Ils se trouvent sur la carte mère ou dans le processeur, tout dépend du ''timer''. ===Le ''watchdog timer''=== Le '''''watchdog timer''''' est un ''timer'' spécifique dont le but est de redémarrer automatiquement l'ordinateur si jamais celui-ci ne répond plus ou plante. Beaucoup de PC s'en passent, mais ce ''timer'' est très fréquent dans les architectures embarquées. Le ''watchdog timer'' est un compteur/décompteur qui doit être réinitialisé régulièrement. S'il n'est pas réinitialisé, le ''watchdog timer'' déborde (revient à 0 ou atteint 0) et envoie un signal qui redémarre le système. Le système est conçu pour réinitialiser le ''watchdog timer'' régulièrement, ce qui signifie que le système n'est pas censé redémarrer. Si jamais le système dysfonctionne gravement, le système ne pourra pas réinitialiser le ''watchdog timer'' et le système est redémarré automatiquement ou mis en arrêt. [[File:SimpleWatchdogTimer.gif|centre|vignette|upright=2|Le ''Watchdog Timer'' et l'ordinateur.]] ===Le ''Time Stamp Counter'' des processeurs x86=== Tous les processeurs des PC actuels sont des processeurs dits x86. Nous ne pouvons pas expliquer ce que cela signifie pour le moment, retenez juste ce terme. Sachez que tous les processeurs x86 contiennent un compteur de 64 bits, appelé le '''''Time Stamp Counter''''', qui mémorise le nombre de cycles d'horloge qu'a effectué le processeur depuis son démarrage. Les programmes peuvent accéder à ce registre assez facilement, ce qui est utile pour faire des mesures ou comparer les performances de deux applications. Il permet de compter combien de cycles d'horloge met un morceau de code à s’exécuter, combien de cycles prend une instruction à s’exécuter, etc. Les processeurs non-x86 ont un registre équivalent, que ce soit les processeurs ARM ou d'autres. Malheureusement, ce compteur est tombé en désuétude pour tout un tas de raisons. La principale est que les processeurs actuels font varier leur fréquence suivant les besoins. Ils augmentent leur fréquence quand on leur demande de faire beaucoup de calculs, et se mettent en mode basse(fréquence pour économiser de l'énergie si on ne leur demande pas grand chose. Avec une fréquence variable, le ''Time Stamp Counter'' perd complétement en fiabilité. Intel a tenté de corriger ce défaut en incrémentant ce registre à une fréquence constante, différente de celle du processeur, ce qui est encore le cas sur les processeurs Intel actuels. Le comportement est un peu différent sur les processeurs AMD, qui cadencent ce ''timer'' à la fréquence du processeur mais utilisent des mécanismes de synchronisation assez complexes pour corriger l'effet de la fréquence variable. ===L'horloge temps réel=== L''''horloge temps réel''' est un ''timer'' qui génère une fréquence de 1024 Hz, soit près d'un Kilohertz. Dans ce qui suit, nous la noterons RTC, ce qui est l'acronyme du terme anglais ''Real Time Clock''. La RTC prend en entrée un signal d'horloge de 32KHz, généré par un oscillateur à Quartz, et fournit en sortie un signal de fréquence 32 fois plus faible, c'est à dire de 1 KHz. Pour cela, elle est réglée en mode répétitif et son décompteur interne est initialisé à 32. La RTC génère donc un signal toutes les millisecondes, qui est envoyé au processeur. On peut, en théorie, changer la fréquence de la RTC, mais c'est rarement une bonne idée. En théorie, la RTC permet de compter des durées assez courtes, comme le ''ping'' (le temps de latence d'un réseau, pour simplifier), le temps de rafraichissement de l'écran, ou bien d'autres choses. Mais dans les faits, l'horloge temps réel sa fréquence n'aide pas : 1024 Hz est proche de 1000, mais pas assez pour faire des mesures à la milliseconde près, chose qui est nécessaire pour mesurer le ''ping'' ou d'autres choses utiles. A la place, l'ordinateur l'utilise pour que l'ordinateur soit toujours à l'heure. L'ordinateur sait quelle heure il est avec une précision de l'ordre de la seconde (vous pouvez regarder le bureau de Windows dans le coin inférieur droite de votre écran pour vous en convaincre). ===Le ''Programmable Interval Timer'' : l'Intel 8253=== L'Intel 8253 était un ''timer'' programmable autrefois soudé sur les cartes mères des premiers PC. Il fût suivi par l'Intel 8254, qui en était une légère amélioration. Il était cadencé par une horloge maitre, générée par un oscillateur à Quartz, dont la fréquence est de 32 768 Hertz, soit 2^15 cycles d'horloge par seconde. S'il n'est plus présent dans un boitier sur la carte mère, on trouve toujours un circuit semblable au 8253 à l'intérieur du ''chipset'' de la carte mère, voire à l'intérieur du processeur, pour des raisons de compatibilité. L'intérieur de l'Intel 8253 est illustré ci-dessous. Nous allons expliquer l'ensemble de ce schéma, rassurez-vous, mais les explications seront plus simples à comprendre si vous survolez ce schéma en premier lieu. [[File:Intel 8253 block diagram.svg|centre|vignette|upright=2|Intel 8253, intérieur.]] L'Intel 8253 contient trois compteurs de 16 bits, numérotés 0, 1 et 2. Pour chaque compteur, l'entrée CLOCK est celle de l'horloge de 32 MHz, l'entrée GATE active ou désactive le compteur, la sortie fournit le signal voulu et/ou la fréquence de sortie. Les trois compteurs étaient utilisés pour dériver plusieurs fréquences allant de 18,2 Hz à environ 500 KHz. Par exemple, il était utilisé par défaut pour le rafraichissement de la mémoire (D)RAM, mais il était souvent reprogrammé pour servir à générer des fréquences spécifiques par le BIOS ou la carte graphique. [[File:Intel 8253 and 8254.svg|vignette|Intel 8253 and 8254]] L'Intel 8253 lui-même possède plusieurs entrées et sorties. En premier lieu, on voit un port de 8 bits connecté aux trois compteurs, qui permet à l'Intel 8253 de communiquer avec le reste de l'ordinateur. La communication se fait dans les deux sens : soit de l'ordinateur vers les compteurs, soit des compteurs vers l'ordinateur. Dans le sens ordinateur -> compteurs, cela permet à l'ordinateur de programmer les compteurs, de les initialiser. Dans l'autre sens, cela permet de récupérer le contenu des compteurs, même si ce n'est pas très utilisé. Il y a aussi 5 entrées de configuration : * Deux bits A0 et A1 pour sélectionner le compteur voulu avec son numéro. * Un bit RD à mettre à 0 pour que l'ordinateur récupère le compteur sélectionné sur le port de 8 bits. * Un bit WR à mettre à 0 pour que l'ordinateur modifie le compteur sélectionné, en envoyant le nombre pour l'initialisation sur le port de 8 bits. * Un bit CS qui active ou désactive l'Intel 8253 et permet de l'allumer ou de l’éteindre. L'Intel 8253 intégre un registre de 8 bits, le ''Control Word register'' qui mémorise la configuration de l'Intel 8253. Pour programmer les trois compteurs, il faut écrire un mot de 8 bits dans ce ''Control Word register''. Pour écrire dans le ''Control Word register'', il faut mettre le bit CS à 0 (on active l'Intel 8253), mettre le bit RDà 1 , le bit WR à 0 le bit WR (on indique qu'on fait une écriture), sélectionner le ''Control Word register'' en mettant les deux bits A0 et A1 à 1, puis envoyer la configuration du ''Control Word register'' sur le port de 8 bits. ===Le ''High Precision Event Timer'' (HPET)=== De nos jours, l'horloge temps réel et l'Intel 8253/8254 tendent à être remplacé par un autre ''timer'', le ''High Precision Event Timer'' (HPET). Il s'agit d'un compteur de 64 bits, dont la fréquence est d'au moins 10 MHz. Il s'agit bien d'un compteur et non d'un décompteur. Il gère nativement plusieurs valeurs limites à laquelle générer un signal, qui sont configurables. Pour cela, il est couplé à plusieurs comparateurs, chacun associé à un registre pour mémoriser la valeur limite. Il doit y avoir au moins trois comparateurs/registres, mais le nombre peut monter jusqu’à 256. [[File:High Precision Event Timer.png|centre|vignette|upright=2|High Precision Event Timer]] Il faut noter que les systèmes d'exploitation conçus avant le HPET ne peuvent pas l'utiliser, pour des raisons de compatibilité matérielle. C'est le cas de Windows XP avant le Service Pack 3. C'est la raison pour laquelle les cartes mères émulent RTC et PIT dans leurs circuits. D'ailleurs, pour économiser des circuits, les cartes mères modernes émulent le PIT et la RTC avec le HPET : le premier comparateur fournisse la fréquence de 1024 Hz de la RTC, 3 autres comparateurs remplacent l'Intel 8253. Le HPET gère de nombreux modes de fonctionnement : ses comparateurs peuvent être configuré en mode une fois ou périodique, on peut lui demander d'émuler la RTC et le PIT, etc. Chaque comparateur doit pouvoir fonctionner en mode une fois, et au moins un comparateur doit pouvoir fonctionner en mode périodique. Aussi, il contient aussi 3 registres de configuration. Notons qu'il est aussi possible de lire ou écrire dans le compteur de 64 bits, mais ce n'est pas recommandé. ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les compteurs à rétroaction | nextText=Les compteurs à rétroaction }} </noinclude> 5rpm0p563if1l0cgc9sawqbw0r4zi8y 768106 768105 2026-06-18T19:26:13Z Mewtow 31375 /* L'intérieur d'un compteur */ 768106 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. Un compteur mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux, suivant ce qu'on leur demande. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un débordement d'entier a lieu, à savoir quand le compteur n'a pas assez de bits pour encoder le décompte. Le compteur est alors remis à zéro, dans la plupart des cas. Mais il faut prévenir que le compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers''. Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==L'intérieur d'un compteur== A une exception bien précise qu'on abordera plus bas, les compteurs sont composés d'un registre, qui mémorise le décompte, couplé à un circuit '''incrémenteur'''. Nous avions déjà abordé l'incrémenteur dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique. Le pas du compteur précise de combien on incrémente le compteur par cycle d'horloge.]] L'incrémenteur le plus simple, à propagation de retenue, est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs à partir de compteurs plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs modulo=== La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. Mais d'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les mal-nommés ''compteurs asynchrones''=== Les '''compteurs asynchrones''' n'utilisent pas de circuit incrémenteur. A la place, ils sont fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Précisons cependant qu'ils sont très mal nommés, à savoir que ce sont bien des circuits synchrones. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les ''timers'' : compter des durées, compter des cycles d'horloge== Les '''''timers''''', aussi appelés ''Programmable interval timer'', sont des circuits capables de compter des durées, exprimées en cycles d'horloge. Leur fonctionnement est assez simple : ils émettent un signal quand un certain nombre de cycles est écoulé, ce nombre de cycles étant configurable. On peut ainsi générer un signal qui surviendra après 50 cycles d'horloge, ou après 100 cycles d'horloge, etc. Le signal en question est disponible sur une sortie de 1 bit, et correspond tout simplement au fait que cette sortie est mise à 1, pendant un cycle d'horloge. Les ''timers'' sont composés d'un compteur/décompteur cadencé par un signal d'horloge. Le compteur initialisé à 0, puis est incrémenté à chaque signal d'horloge, jusqu’à atteinte d'une valeur limite où il génère un signal. Pour un décompteur, c'est la même chose, sauf que le décompteur est initialisé à sa valeur limite et est décrémenté à chaque cycle, et envoie un signal quand il atteint 0. Les ''timers'' basés sur des décompteurs sont nettement plus simples que les autres, ce qui fait qu'ils sont plus utilisés Pour que les ''timers'' soient configurables, on doit pouvoir préciser combien de cycles il faut (dé-)compter avant d'émettre un signal. On peut ainsi préciser s'il faut émettre le signal après 32 cycles d'horloge, après les 50 cycles, tous les 129 cycles, etc. Le nombre de cycles en question est envoyé sur une entrée d’initialisation du compteur. Les ''timers'' matériels peuvent compter de deux manières différentes, appelées '''mode une fois''' et '''mode périodique'''. * En mode une fois, le ''timer'' s'arrête une fois qu'il a atteint la limite configurée. On doit le réinitialiser manuellement, par l'intermédiaire du logiciel, pour l'utiliser une nouvelle fois. Cela permet de compter une certaine durée, exprimée en nombre de cycles d'horloge. * En mode périodique, le ''timer'' se réinitialise automatiquement avec la valeur de départ, ce qui fait qu'il reboucle à l'infini. Un ordinateur est rempli de ''timers'' divers. Dans ce qui va suivre, nous allons voir les principaux ''timers'', qui sont actuellement intégrés dans les PC modernes. Ils se trouvent sur la carte mère ou dans le processeur, tout dépend du ''timer''. ===Le ''watchdog timer''=== Le '''''watchdog timer''''' est un ''timer'' spécifique dont le but est de redémarrer automatiquement l'ordinateur si jamais celui-ci ne répond plus ou plante. Beaucoup de PC s'en passent, mais ce ''timer'' est très fréquent dans les architectures embarquées. Le ''watchdog timer'' est un compteur/décompteur qui doit être réinitialisé régulièrement. S'il n'est pas réinitialisé, le ''watchdog timer'' déborde (revient à 0 ou atteint 0) et envoie un signal qui redémarre le système. Le système est conçu pour réinitialiser le ''watchdog timer'' régulièrement, ce qui signifie que le système n'est pas censé redémarrer. Si jamais le système dysfonctionne gravement, le système ne pourra pas réinitialiser le ''watchdog timer'' et le système est redémarré automatiquement ou mis en arrêt. [[File:SimpleWatchdogTimer.gif|centre|vignette|upright=2|Le ''Watchdog Timer'' et l'ordinateur.]] ===Le ''Time Stamp Counter'' des processeurs x86=== Tous les processeurs des PC actuels sont des processeurs dits x86. Nous ne pouvons pas expliquer ce que cela signifie pour le moment, retenez juste ce terme. Sachez que tous les processeurs x86 contiennent un compteur de 64 bits, appelé le '''''Time Stamp Counter''''', qui mémorise le nombre de cycles d'horloge qu'a effectué le processeur depuis son démarrage. Les programmes peuvent accéder à ce registre assez facilement, ce qui est utile pour faire des mesures ou comparer les performances de deux applications. Il permet de compter combien de cycles d'horloge met un morceau de code à s’exécuter, combien de cycles prend une instruction à s’exécuter, etc. Les processeurs non-x86 ont un registre équivalent, que ce soit les processeurs ARM ou d'autres. Malheureusement, ce compteur est tombé en désuétude pour tout un tas de raisons. La principale est que les processeurs actuels font varier leur fréquence suivant les besoins. Ils augmentent leur fréquence quand on leur demande de faire beaucoup de calculs, et se mettent en mode basse(fréquence pour économiser de l'énergie si on ne leur demande pas grand chose. Avec une fréquence variable, le ''Time Stamp Counter'' perd complétement en fiabilité. Intel a tenté de corriger ce défaut en incrémentant ce registre à une fréquence constante, différente de celle du processeur, ce qui est encore le cas sur les processeurs Intel actuels. Le comportement est un peu différent sur les processeurs AMD, qui cadencent ce ''timer'' à la fréquence du processeur mais utilisent des mécanismes de synchronisation assez complexes pour corriger l'effet de la fréquence variable. ===L'horloge temps réel=== L''''horloge temps réel''' est un ''timer'' qui génère une fréquence de 1024 Hz, soit près d'un Kilohertz. Dans ce qui suit, nous la noterons RTC, ce qui est l'acronyme du terme anglais ''Real Time Clock''. La RTC prend en entrée un signal d'horloge de 32KHz, généré par un oscillateur à Quartz, et fournit en sortie un signal de fréquence 32 fois plus faible, c'est à dire de 1 KHz. Pour cela, elle est réglée en mode répétitif et son décompteur interne est initialisé à 32. La RTC génère donc un signal toutes les millisecondes, qui est envoyé au processeur. On peut, en théorie, changer la fréquence de la RTC, mais c'est rarement une bonne idée. En théorie, la RTC permet de compter des durées assez courtes, comme le ''ping'' (le temps de latence d'un réseau, pour simplifier), le temps de rafraichissement de l'écran, ou bien d'autres choses. Mais dans les faits, l'horloge temps réel sa fréquence n'aide pas : 1024 Hz est proche de 1000, mais pas assez pour faire des mesures à la milliseconde près, chose qui est nécessaire pour mesurer le ''ping'' ou d'autres choses utiles. A la place, l'ordinateur l'utilise pour que l'ordinateur soit toujours à l'heure. L'ordinateur sait quelle heure il est avec une précision de l'ordre de la seconde (vous pouvez regarder le bureau de Windows dans le coin inférieur droite de votre écran pour vous en convaincre). ===Le ''Programmable Interval Timer'' : l'Intel 8253=== L'Intel 8253 était un ''timer'' programmable autrefois soudé sur les cartes mères des premiers PC. Il fût suivi par l'Intel 8254, qui en était une légère amélioration. Il était cadencé par une horloge maitre, générée par un oscillateur à Quartz, dont la fréquence est de 32 768 Hertz, soit 2^15 cycles d'horloge par seconde. S'il n'est plus présent dans un boitier sur la carte mère, on trouve toujours un circuit semblable au 8253 à l'intérieur du ''chipset'' de la carte mère, voire à l'intérieur du processeur, pour des raisons de compatibilité. L'intérieur de l'Intel 8253 est illustré ci-dessous. Nous allons expliquer l'ensemble de ce schéma, rassurez-vous, mais les explications seront plus simples à comprendre si vous survolez ce schéma en premier lieu. [[File:Intel 8253 block diagram.svg|centre|vignette|upright=2|Intel 8253, intérieur.]] L'Intel 8253 contient trois compteurs de 16 bits, numérotés 0, 1 et 2. Pour chaque compteur, l'entrée CLOCK est celle de l'horloge de 32 MHz, l'entrée GATE active ou désactive le compteur, la sortie fournit le signal voulu et/ou la fréquence de sortie. Les trois compteurs étaient utilisés pour dériver plusieurs fréquences allant de 18,2 Hz à environ 500 KHz. Par exemple, il était utilisé par défaut pour le rafraichissement de la mémoire (D)RAM, mais il était souvent reprogrammé pour servir à générer des fréquences spécifiques par le BIOS ou la carte graphique. [[File:Intel 8253 and 8254.svg|vignette|Intel 8253 and 8254]] L'Intel 8253 lui-même possède plusieurs entrées et sorties. En premier lieu, on voit un port de 8 bits connecté aux trois compteurs, qui permet à l'Intel 8253 de communiquer avec le reste de l'ordinateur. La communication se fait dans les deux sens : soit de l'ordinateur vers les compteurs, soit des compteurs vers l'ordinateur. Dans le sens ordinateur -> compteurs, cela permet à l'ordinateur de programmer les compteurs, de les initialiser. Dans l'autre sens, cela permet de récupérer le contenu des compteurs, même si ce n'est pas très utilisé. Il y a aussi 5 entrées de configuration : * Deux bits A0 et A1 pour sélectionner le compteur voulu avec son numéro. * Un bit RD à mettre à 0 pour que l'ordinateur récupère le compteur sélectionné sur le port de 8 bits. * Un bit WR à mettre à 0 pour que l'ordinateur modifie le compteur sélectionné, en envoyant le nombre pour l'initialisation sur le port de 8 bits. * Un bit CS qui active ou désactive l'Intel 8253 et permet de l'allumer ou de l’éteindre. L'Intel 8253 intégre un registre de 8 bits, le ''Control Word register'' qui mémorise la configuration de l'Intel 8253. Pour programmer les trois compteurs, il faut écrire un mot de 8 bits dans ce ''Control Word register''. Pour écrire dans le ''Control Word register'', il faut mettre le bit CS à 0 (on active l'Intel 8253), mettre le bit RDà 1 , le bit WR à 0 le bit WR (on indique qu'on fait une écriture), sélectionner le ''Control Word register'' en mettant les deux bits A0 et A1 à 1, puis envoyer la configuration du ''Control Word register'' sur le port de 8 bits. ===Le ''High Precision Event Timer'' (HPET)=== De nos jours, l'horloge temps réel et l'Intel 8253/8254 tendent à être remplacé par un autre ''timer'', le ''High Precision Event Timer'' (HPET). Il s'agit d'un compteur de 64 bits, dont la fréquence est d'au moins 10 MHz. Il s'agit bien d'un compteur et non d'un décompteur. Il gère nativement plusieurs valeurs limites à laquelle générer un signal, qui sont configurables. Pour cela, il est couplé à plusieurs comparateurs, chacun associé à un registre pour mémoriser la valeur limite. Il doit y avoir au moins trois comparateurs/registres, mais le nombre peut monter jusqu’à 256. [[File:High Precision Event Timer.png|centre|vignette|upright=2|High Precision Event Timer]] Il faut noter que les systèmes d'exploitation conçus avant le HPET ne peuvent pas l'utiliser, pour des raisons de compatibilité matérielle. C'est le cas de Windows XP avant le Service Pack 3. C'est la raison pour laquelle les cartes mères émulent RTC et PIT dans leurs circuits. D'ailleurs, pour économiser des circuits, les cartes mères modernes émulent le PIT et la RTC avec le HPET : le premier comparateur fournisse la fréquence de 1024 Hz de la RTC, 3 autres comparateurs remplacent l'Intel 8253. Le HPET gère de nombreux modes de fonctionnement : ses comparateurs peuvent être configuré en mode une fois ou périodique, on peut lui demander d'émuler la RTC et le PIT, etc. Chaque comparateur doit pouvoir fonctionner en mode une fois, et au moins un comparateur doit pouvoir fonctionner en mode périodique. Aussi, il contient aussi 3 registres de configuration. Notons qu'il est aussi possible de lire ou écrire dans le compteur de 64 bits, mais ce n'est pas recommandé. ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les compteurs à rétroaction | nextText=Les compteurs à rétroaction }} </noinclude> qjhotne8nppxk5o2d0pcd1poez0m6la 768108 768106 2026-06-18T19:58:02Z Mewtow 31375 768108 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Un compteur mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux. Les compteurs que nous allons voir encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un débordement d'entier a lieu, à savoir quand le compteur n'a pas assez de bits pour encoder le décompte. Le compteur est alors remis à zéro, dans la plupart des cas. Mais il faut prévenir que le compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers''. Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==L'intérieur d'un compteur== A une exception bien précise qu'on abordera plus bas, les compteurs sont composés d'un registre, qui mémorise le décompte, couplé à un circuit '''incrémenteur'''. Nous avions déjà abordé l'incrémenteur dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique. Le pas du compteur précise de combien on incrémente le compteur par cycle d'horloge.]] L'incrémenteur le plus simple, à propagation de retenue, est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs à partir de compteurs plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs modulo=== La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. Mais d'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les mal-nommés ''compteurs asynchrones''=== Les '''compteurs asynchrones''' n'utilisent pas de circuit incrémenteur. A la place, ils sont fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Précisons cependant qu'ils sont très mal nommés, à savoir que ce sont bien des circuits synchrones. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les ''timers'' : compter des durées, compter des cycles d'horloge== Les '''''timers''''', aussi appelés ''Programmable interval timer'', sont des circuits capables de compter des durées, exprimées en cycles d'horloge. Leur fonctionnement est assez simple : ils émettent un signal quand un certain nombre de cycles est écoulé, ce nombre de cycles étant configurable. On peut ainsi générer un signal qui surviendra après 50 cycles d'horloge, ou après 100 cycles d'horloge, etc. Le signal en question est disponible sur une sortie de 1 bit, et correspond tout simplement au fait que cette sortie est mise à 1, pendant un cycle d'horloge. Les ''timers'' sont composés d'un compteur/décompteur cadencé par un signal d'horloge. Le compteur initialisé à 0, puis est incrémenté à chaque signal d'horloge, jusqu’à atteinte d'une valeur limite où il génère un signal. Pour un décompteur, c'est la même chose, sauf que le décompteur est initialisé à sa valeur limite et est décrémenté à chaque cycle, et envoie un signal quand il atteint 0. Les ''timers'' basés sur des décompteurs sont nettement plus simples que les autres, ce qui fait qu'ils sont plus utilisés Pour que les ''timers'' soient configurables, on doit pouvoir préciser combien de cycles il faut (dé-)compter avant d'émettre un signal. On peut ainsi préciser s'il faut émettre le signal après 32 cycles d'horloge, après les 50 cycles, tous les 129 cycles, etc. Le nombre de cycles en question est envoyé sur une entrée d’initialisation du compteur. Les ''timers'' matériels peuvent compter de deux manières différentes, appelées '''mode une fois''' et '''mode périodique'''. * En mode une fois, le ''timer'' s'arrête une fois qu'il a atteint la limite configurée. On doit le réinitialiser manuellement, par l'intermédiaire du logiciel, pour l'utiliser une nouvelle fois. Cela permet de compter une certaine durée, exprimée en nombre de cycles d'horloge. * En mode périodique, le ''timer'' se réinitialise automatiquement avec la valeur de départ, ce qui fait qu'il reboucle à l'infini. Un ordinateur est rempli de ''timers'' divers. Dans ce qui va suivre, nous allons voir les principaux ''timers'', qui sont actuellement intégrés dans les PC modernes. Ils se trouvent sur la carte mère ou dans le processeur, tout dépend du ''timer''. ===Le ''watchdog timer''=== Le '''''watchdog timer''''' est un ''timer'' spécifique dont le but est de redémarrer automatiquement l'ordinateur si jamais celui-ci ne répond plus ou plante. Beaucoup de PC s'en passent, mais ce ''timer'' est très fréquent dans les architectures embarquées. Le ''watchdog timer'' est un compteur/décompteur qui doit être réinitialisé régulièrement. S'il n'est pas réinitialisé, le ''watchdog timer'' déborde (revient à 0 ou atteint 0) et envoie un signal qui redémarre le système. Le système est conçu pour réinitialiser le ''watchdog timer'' régulièrement, ce qui signifie que le système n'est pas censé redémarrer. Si jamais le système dysfonctionne gravement, le système ne pourra pas réinitialiser le ''watchdog timer'' et le système est redémarré automatiquement ou mis en arrêt. [[File:SimpleWatchdogTimer.gif|centre|vignette|upright=2|Le ''Watchdog Timer'' et l'ordinateur.]] ===Le ''Time Stamp Counter'' des processeurs x86=== Tous les processeurs des PC actuels sont des processeurs dits x86. Nous ne pouvons pas expliquer ce que cela signifie pour le moment, retenez juste ce terme. Sachez que tous les processeurs x86 contiennent un compteur de 64 bits, appelé le '''''Time Stamp Counter''''', qui mémorise le nombre de cycles d'horloge qu'a effectué le processeur depuis son démarrage. Les programmes peuvent accéder à ce registre assez facilement, ce qui est utile pour faire des mesures ou comparer les performances de deux applications. Il permet de compter combien de cycles d'horloge met un morceau de code à s’exécuter, combien de cycles prend une instruction à s’exécuter, etc. Les processeurs non-x86 ont un registre équivalent, que ce soit les processeurs ARM ou d'autres. Malheureusement, ce compteur est tombé en désuétude pour tout un tas de raisons. La principale est que les processeurs actuels font varier leur fréquence suivant les besoins. Ils augmentent leur fréquence quand on leur demande de faire beaucoup de calculs, et se mettent en mode basse(fréquence pour économiser de l'énergie si on ne leur demande pas grand chose. Avec une fréquence variable, le ''Time Stamp Counter'' perd complétement en fiabilité. Intel a tenté de corriger ce défaut en incrémentant ce registre à une fréquence constante, différente de celle du processeur, ce qui est encore le cas sur les processeurs Intel actuels. Le comportement est un peu différent sur les processeurs AMD, qui cadencent ce ''timer'' à la fréquence du processeur mais utilisent des mécanismes de synchronisation assez complexes pour corriger l'effet de la fréquence variable. ===L'horloge temps réel=== L''''horloge temps réel''' est un ''timer'' qui génère une fréquence de 1024 Hz, soit près d'un Kilohertz. Dans ce qui suit, nous la noterons RTC, ce qui est l'acronyme du terme anglais ''Real Time Clock''. La RTC prend en entrée un signal d'horloge de 32KHz, généré par un oscillateur à Quartz, et fournit en sortie un signal de fréquence 32 fois plus faible, c'est à dire de 1 KHz. Pour cela, elle est réglée en mode répétitif et son décompteur interne est initialisé à 32. La RTC génère donc un signal toutes les millisecondes, qui est envoyé au processeur. On peut, en théorie, changer la fréquence de la RTC, mais c'est rarement une bonne idée. En théorie, la RTC permet de compter des durées assez courtes, comme le ''ping'' (le temps de latence d'un réseau, pour simplifier), le temps de rafraichissement de l'écran, ou bien d'autres choses. Mais dans les faits, l'horloge temps réel sa fréquence n'aide pas : 1024 Hz est proche de 1000, mais pas assez pour faire des mesures à la milliseconde près, chose qui est nécessaire pour mesurer le ''ping'' ou d'autres choses utiles. A la place, l'ordinateur l'utilise pour que l'ordinateur soit toujours à l'heure. L'ordinateur sait quelle heure il est avec une précision de l'ordre de la seconde (vous pouvez regarder le bureau de Windows dans le coin inférieur droite de votre écran pour vous en convaincre). ===Le ''Programmable Interval Timer'' : l'Intel 8253=== L'Intel 8253 était un ''timer'' programmable autrefois soudé sur les cartes mères des premiers PC. Il fût suivi par l'Intel 8254, qui en était une légère amélioration. Il était cadencé par une horloge maitre, générée par un oscillateur à Quartz, dont la fréquence est de 32 768 Hertz, soit 2^15 cycles d'horloge par seconde. S'il n'est plus présent dans un boitier sur la carte mère, on trouve toujours un circuit semblable au 8253 à l'intérieur du ''chipset'' de la carte mère, voire à l'intérieur du processeur, pour des raisons de compatibilité. L'intérieur de l'Intel 8253 est illustré ci-dessous. Nous allons expliquer l'ensemble de ce schéma, rassurez-vous, mais les explications seront plus simples à comprendre si vous survolez ce schéma en premier lieu. [[File:Intel 8253 block diagram.svg|centre|vignette|upright=2|Intel 8253, intérieur.]] L'Intel 8253 contient trois compteurs de 16 bits, numérotés 0, 1 et 2. Pour chaque compteur, l'entrée CLOCK est celle de l'horloge de 32 MHz, l'entrée GATE active ou désactive le compteur, la sortie fournit le signal voulu et/ou la fréquence de sortie. Les trois compteurs étaient utilisés pour dériver plusieurs fréquences allant de 18,2 Hz à environ 500 KHz. Par exemple, il était utilisé par défaut pour le rafraichissement de la mémoire (D)RAM, mais il était souvent reprogrammé pour servir à générer des fréquences spécifiques par le BIOS ou la carte graphique. [[File:Intel 8253 and 8254.svg|vignette|Intel 8253 and 8254]] L'Intel 8253 lui-même possède plusieurs entrées et sorties. En premier lieu, on voit un port de 8 bits connecté aux trois compteurs, qui permet à l'Intel 8253 de communiquer avec le reste de l'ordinateur. La communication se fait dans les deux sens : soit de l'ordinateur vers les compteurs, soit des compteurs vers l'ordinateur. Dans le sens ordinateur -> compteurs, cela permet à l'ordinateur de programmer les compteurs, de les initialiser. Dans l'autre sens, cela permet de récupérer le contenu des compteurs, même si ce n'est pas très utilisé. Il y a aussi 5 entrées de configuration : * Deux bits A0 et A1 pour sélectionner le compteur voulu avec son numéro. * Un bit RD à mettre à 0 pour que l'ordinateur récupère le compteur sélectionné sur le port de 8 bits. * Un bit WR à mettre à 0 pour que l'ordinateur modifie le compteur sélectionné, en envoyant le nombre pour l'initialisation sur le port de 8 bits. * Un bit CS qui active ou désactive l'Intel 8253 et permet de l'allumer ou de l’éteindre. L'Intel 8253 intégre un registre de 8 bits, le ''Control Word register'' qui mémorise la configuration de l'Intel 8253. Pour programmer les trois compteurs, il faut écrire un mot de 8 bits dans ce ''Control Word register''. Pour écrire dans le ''Control Word register'', il faut mettre le bit CS à 0 (on active l'Intel 8253), mettre le bit RDà 1 , le bit WR à 0 le bit WR (on indique qu'on fait une écriture), sélectionner le ''Control Word register'' en mettant les deux bits A0 et A1 à 1, puis envoyer la configuration du ''Control Word register'' sur le port de 8 bits. ===Le ''High Precision Event Timer'' (HPET)=== De nos jours, l'horloge temps réel et l'Intel 8253/8254 tendent à être remplacé par un autre ''timer'', le ''High Precision Event Timer'' (HPET). Il s'agit d'un compteur de 64 bits, dont la fréquence est d'au moins 10 MHz. Il s'agit bien d'un compteur et non d'un décompteur. Il gère nativement plusieurs valeurs limites à laquelle générer un signal, qui sont configurables. Pour cela, il est couplé à plusieurs comparateurs, chacun associé à un registre pour mémoriser la valeur limite. Il doit y avoir au moins trois comparateurs/registres, mais le nombre peut monter jusqu’à 256. [[File:High Precision Event Timer.png|centre|vignette|upright=2|High Precision Event Timer]] Il faut noter que les systèmes d'exploitation conçus avant le HPET ne peuvent pas l'utiliser, pour des raisons de compatibilité matérielle. C'est le cas de Windows XP avant le Service Pack 3. C'est la raison pour laquelle les cartes mères émulent RTC et PIT dans leurs circuits. D'ailleurs, pour économiser des circuits, les cartes mères modernes émulent le PIT et la RTC avec le HPET : le premier comparateur fournisse la fréquence de 1024 Hz de la RTC, 3 autres comparateurs remplacent l'Intel 8253. Le HPET gère de nombreux modes de fonctionnement : ses comparateurs peuvent être configuré en mode une fois ou périodique, on peut lui demander d'émuler la RTC et le PIT, etc. Chaque comparateur doit pouvoir fonctionner en mode une fois, et au moins un comparateur doit pouvoir fonctionner en mode périodique. Aussi, il contient aussi 3 registres de configuration. Notons qu'il est aussi possible de lire ou écrire dans le compteur de 64 bits, mais ce n'est pas recommandé. ==Les compteurs en code Gray== Il existe des compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les compteurs à rétroaction | nextText=Les compteurs à rétroaction }} </noinclude> rjsx59ugjv3dgvppocb6jwddmjm2655 768109 768108 2026-06-18T20:00:52Z Mewtow 31375 768109 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Un compteur mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il est mémorisé dans un registre à l'intérieur du compteur. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un débordement d'entier a lieu, à savoir quand le compteur n'a pas assez de bits pour encoder le décompte. Le compteur est alors remis à zéro, dans la plupart des cas. Mais il faut prévenir que le compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers''. Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==L'intérieur d'un compteur== A une exception bien précise qu'on abordera plus bas, les compteurs sont composés d'un registre, qui mémorise le décompte, couplé à un circuit '''incrémenteur'''. Nous avions déjà abordé l'incrémenteur dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique. Le pas du compteur précise de combien on incrémente le compteur par cycle d'horloge.]] L'incrémenteur le plus simple, à propagation de retenue, est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs à partir de compteurs plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs modulo=== La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. Mais d'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les mal-nommés ''compteurs asynchrones''=== Les '''compteurs asynchrones''' n'utilisent pas de circuit incrémenteur. A la place, ils sont fabriqués à partir d'un registre à décalage de type SIPO. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Précisons cependant qu'ils sont très mal nommés, à savoir que ce sont bien des circuits synchrones. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les ''timers'' : compter des durées, compter des cycles d'horloge== Les '''''timers''''', aussi appelés ''Programmable interval timer'', sont des circuits capables de compter des durées, exprimées en cycles d'horloge. Leur fonctionnement est assez simple : ils émettent un signal quand un certain nombre de cycles est écoulé, ce nombre de cycles étant configurable. On peut ainsi générer un signal qui surviendra après 50 cycles d'horloge, ou après 100 cycles d'horloge, etc. Le signal en question est disponible sur une sortie de 1 bit, et correspond tout simplement au fait que cette sortie est mise à 1, pendant un cycle d'horloge. Les ''timers'' sont composés d'un compteur/décompteur cadencé par un signal d'horloge. Le compteur initialisé à 0, puis est incrémenté à chaque signal d'horloge, jusqu’à atteinte d'une valeur limite où il génère un signal. Pour un décompteur, c'est la même chose, sauf que le décompteur est initialisé à sa valeur limite et est décrémenté à chaque cycle, et envoie un signal quand il atteint 0. Les ''timers'' basés sur des décompteurs sont nettement plus simples que les autres, ce qui fait qu'ils sont plus utilisés Pour que les ''timers'' soient configurables, on doit pouvoir préciser combien de cycles il faut (dé-)compter avant d'émettre un signal. On peut ainsi préciser s'il faut émettre le signal après 32 cycles d'horloge, après les 50 cycles, tous les 129 cycles, etc. Le nombre de cycles en question est envoyé sur une entrée d’initialisation du compteur. Les ''timers'' matériels peuvent compter de deux manières différentes, appelées '''mode une fois''' et '''mode périodique'''. * En mode une fois, le ''timer'' s'arrête une fois qu'il a atteint la limite configurée. On doit le réinitialiser manuellement, par l'intermédiaire du logiciel, pour l'utiliser une nouvelle fois. Cela permet de compter une certaine durée, exprimée en nombre de cycles d'horloge. * En mode périodique, le ''timer'' se réinitialise automatiquement avec la valeur de départ, ce qui fait qu'il reboucle à l'infini. Un ordinateur est rempli de ''timers'' divers. Dans ce qui va suivre, nous allons voir les principaux ''timers'', qui sont actuellement intégrés dans les PC modernes. Ils se trouvent sur la carte mère ou dans le processeur, tout dépend du ''timer''. ===Le ''watchdog timer''=== Le '''''watchdog timer''''' est un ''timer'' spécifique dont le but est de redémarrer automatiquement l'ordinateur si jamais celui-ci ne répond plus ou plante. Beaucoup de PC s'en passent, mais ce ''timer'' est très fréquent dans les architectures embarquées. Le ''watchdog timer'' est un compteur/décompteur qui doit être réinitialisé régulièrement. S'il n'est pas réinitialisé, le ''watchdog timer'' déborde (revient à 0 ou atteint 0) et envoie un signal qui redémarre le système. Le système est conçu pour réinitialiser le ''watchdog timer'' régulièrement, ce qui signifie que le système n'est pas censé redémarrer. Si jamais le système dysfonctionne gravement, le système ne pourra pas réinitialiser le ''watchdog timer'' et le système est redémarré automatiquement ou mis en arrêt. [[File:SimpleWatchdogTimer.gif|centre|vignette|upright=2|Le ''Watchdog Timer'' et l'ordinateur.]] ===Le ''Time Stamp Counter'' des processeurs x86=== Tous les processeurs des PC actuels sont des processeurs dits x86. Nous ne pouvons pas expliquer ce que cela signifie pour le moment, retenez juste ce terme. Sachez que tous les processeurs x86 contiennent un compteur de 64 bits, appelé le '''''Time Stamp Counter''''', qui mémorise le nombre de cycles d'horloge qu'a effectué le processeur depuis son démarrage. Les programmes peuvent accéder à ce registre assez facilement, ce qui est utile pour faire des mesures ou comparer les performances de deux applications. Il permet de compter combien de cycles d'horloge met un morceau de code à s’exécuter, combien de cycles prend une instruction à s’exécuter, etc. Les processeurs non-x86 ont un registre équivalent, que ce soit les processeurs ARM ou d'autres. Malheureusement, ce compteur est tombé en désuétude pour tout un tas de raisons. La principale est que les processeurs actuels font varier leur fréquence suivant les besoins. Ils augmentent leur fréquence quand on leur demande de faire beaucoup de calculs, et se mettent en mode basse(fréquence pour économiser de l'énergie si on ne leur demande pas grand chose. Avec une fréquence variable, le ''Time Stamp Counter'' perd complétement en fiabilité. Intel a tenté de corriger ce défaut en incrémentant ce registre à une fréquence constante, différente de celle du processeur, ce qui est encore le cas sur les processeurs Intel actuels. Le comportement est un peu différent sur les processeurs AMD, qui cadencent ce ''timer'' à la fréquence du processeur mais utilisent des mécanismes de synchronisation assez complexes pour corriger l'effet de la fréquence variable. ===L'horloge temps réel=== L''''horloge temps réel''' est un ''timer'' qui génère une fréquence de 1024 Hz, soit près d'un Kilohertz. Dans ce qui suit, nous la noterons RTC, ce qui est l'acronyme du terme anglais ''Real Time Clock''. La RTC prend en entrée un signal d'horloge de 32KHz, généré par un oscillateur à Quartz, et fournit en sortie un signal de fréquence 32 fois plus faible, c'est à dire de 1 KHz. Pour cela, elle est réglée en mode répétitif et son décompteur interne est initialisé à 32. La RTC génère donc un signal toutes les millisecondes, qui est envoyé au processeur. On peut, en théorie, changer la fréquence de la RTC, mais c'est rarement une bonne idée. En théorie, la RTC permet de compter des durées assez courtes, comme le ''ping'' (le temps de latence d'un réseau, pour simplifier), le temps de rafraichissement de l'écran, ou bien d'autres choses. Mais dans les faits, l'horloge temps réel sa fréquence n'aide pas : 1024 Hz est proche de 1000, mais pas assez pour faire des mesures à la milliseconde près, chose qui est nécessaire pour mesurer le ''ping'' ou d'autres choses utiles. A la place, l'ordinateur l'utilise pour que l'ordinateur soit toujours à l'heure. L'ordinateur sait quelle heure il est avec une précision de l'ordre de la seconde (vous pouvez regarder le bureau de Windows dans le coin inférieur droite de votre écran pour vous en convaincre). ===Le ''Programmable Interval Timer'' : l'Intel 8253=== L'Intel 8253 était un ''timer'' programmable autrefois soudé sur les cartes mères des premiers PC. Il fût suivi par l'Intel 8254, qui en était une légère amélioration. Il était cadencé par une horloge maitre, générée par un oscillateur à Quartz, dont la fréquence est de 32 768 Hertz, soit 2^15 cycles d'horloge par seconde. S'il n'est plus présent dans un boitier sur la carte mère, on trouve toujours un circuit semblable au 8253 à l'intérieur du ''chipset'' de la carte mère, voire à l'intérieur du processeur, pour des raisons de compatibilité. L'intérieur de l'Intel 8253 est illustré ci-dessous. Nous allons expliquer l'ensemble de ce schéma, rassurez-vous, mais les explications seront plus simples à comprendre si vous survolez ce schéma en premier lieu. [[File:Intel 8253 block diagram.svg|centre|vignette|upright=2|Intel 8253, intérieur.]] L'Intel 8253 contient trois compteurs de 16 bits, numérotés 0, 1 et 2. Pour chaque compteur, l'entrée CLOCK est celle de l'horloge de 32 MHz, l'entrée GATE active ou désactive le compteur, la sortie fournit le signal voulu et/ou la fréquence de sortie. Les trois compteurs étaient utilisés pour dériver plusieurs fréquences allant de 18,2 Hz à environ 500 KHz. Par exemple, il était utilisé par défaut pour le rafraichissement de la mémoire (D)RAM, mais il était souvent reprogrammé pour servir à générer des fréquences spécifiques par le BIOS ou la carte graphique. [[File:Intel 8253 and 8254.svg|vignette|Intel 8253 and 8254]] L'Intel 8253 lui-même possède plusieurs entrées et sorties. En premier lieu, on voit un port de 8 bits connecté aux trois compteurs, qui permet à l'Intel 8253 de communiquer avec le reste de l'ordinateur. La communication se fait dans les deux sens : soit de l'ordinateur vers les compteurs, soit des compteurs vers l'ordinateur. Dans le sens ordinateur -> compteurs, cela permet à l'ordinateur de programmer les compteurs, de les initialiser. Dans l'autre sens, cela permet de récupérer le contenu des compteurs, même si ce n'est pas très utilisé. Il y a aussi 5 entrées de configuration : * Deux bits A0 et A1 pour sélectionner le compteur voulu avec son numéro. * Un bit RD à mettre à 0 pour que l'ordinateur récupère le compteur sélectionné sur le port de 8 bits. * Un bit WR à mettre à 0 pour que l'ordinateur modifie le compteur sélectionné, en envoyant le nombre pour l'initialisation sur le port de 8 bits. * Un bit CS qui active ou désactive l'Intel 8253 et permet de l'allumer ou de l’éteindre. L'Intel 8253 intégre un registre de 8 bits, le ''Control Word register'' qui mémorise la configuration de l'Intel 8253. Pour programmer les trois compteurs, il faut écrire un mot de 8 bits dans ce ''Control Word register''. Pour écrire dans le ''Control Word register'', il faut mettre le bit CS à 0 (on active l'Intel 8253), mettre le bit RDà 1 , le bit WR à 0 le bit WR (on indique qu'on fait une écriture), sélectionner le ''Control Word register'' en mettant les deux bits A0 et A1 à 1, puis envoyer la configuration du ''Control Word register'' sur le port de 8 bits. ===Le ''High Precision Event Timer'' (HPET)=== De nos jours, l'horloge temps réel et l'Intel 8253/8254 tendent à être remplacé par un autre ''timer'', le ''High Precision Event Timer'' (HPET). Il s'agit d'un compteur de 64 bits, dont la fréquence est d'au moins 10 MHz. Il s'agit bien d'un compteur et non d'un décompteur. Il gère nativement plusieurs valeurs limites à laquelle générer un signal, qui sont configurables. Pour cela, il est couplé à plusieurs comparateurs, chacun associé à un registre pour mémoriser la valeur limite. Il doit y avoir au moins trois comparateurs/registres, mais le nombre peut monter jusqu’à 256. [[File:High Precision Event Timer.png|centre|vignette|upright=2|High Precision Event Timer]] Il faut noter que les systèmes d'exploitation conçus avant le HPET ne peuvent pas l'utiliser, pour des raisons de compatibilité matérielle. C'est le cas de Windows XP avant le Service Pack 3. C'est la raison pour laquelle les cartes mères émulent RTC et PIT dans leurs circuits. D'ailleurs, pour économiser des circuits, les cartes mères modernes émulent le PIT et la RTC avec le HPET : le premier comparateur fournisse la fréquence de 1024 Hz de la RTC, 3 autres comparateurs remplacent l'Intel 8253. Le HPET gère de nombreux modes de fonctionnement : ses comparateurs peuvent être configuré en mode une fois ou périodique, on peut lui demander d'émuler la RTC et le PIT, etc. Chaque comparateur doit pouvoir fonctionner en mode une fois, et au moins un comparateur doit pouvoir fonctionner en mode périodique. Aussi, il contient aussi 3 registres de configuration. Notons qu'il est aussi possible de lire ou écrire dans le compteur de 64 bits, mais ce n'est pas recommandé. ==Les compteurs en code Gray== Les compteurs classiques encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Voyons les compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les compteurs à rétroaction | nextText=Les compteurs à rétroaction }} </noinclude> b2fuho6f632ri9jz6j0hor6mp6ayptp 768111 768109 2026-06-18T20:14:39Z Mewtow 31375 /* Les mal-nommés compteurs asynchrones */ 768111 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Un compteur mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il est mémorisé dans un registre à l'intérieur du compteur. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un débordement d'entier a lieu, à savoir quand le compteur n'a pas assez de bits pour encoder le décompte. Le compteur est alors remis à zéro, dans la plupart des cas. Mais il faut prévenir que le compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers''. Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==L'intérieur d'un compteur== A une exception bien précise qu'on abordera plus bas, les compteurs sont composés d'un registre, qui mémorise le décompte, couplé à un circuit '''incrémenteur'''. Nous avions déjà abordé l'incrémenteur dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique. Le pas du compteur précise de combien on incrémente le compteur par cycle d'horloge.]] L'incrémenteur le plus simple, à propagation de retenue, est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs à partir de compteurs plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs modulo=== La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. Mais d'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les mal-nommés ''compteurs asynchrones''=== Les '''compteurs asynchrones''' n'utilisent pas de circuit incrémenteur. A la place, ils sont fabriqués à partir d'un registre à décalage. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Précisons cependant qu'ils sont très mal nommés, à savoir que ce sont bien des circuits synchrones. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les ''timers'' : compter des durées, compter des cycles d'horloge== Les '''''timers''''', aussi appelés ''Programmable interval timer'', sont des circuits capables de compter des durées, exprimées en cycles d'horloge. Leur fonctionnement est assez simple : ils émettent un signal quand un certain nombre de cycles est écoulé, ce nombre de cycles étant configurable. On peut ainsi générer un signal qui surviendra après 50 cycles d'horloge, ou après 100 cycles d'horloge, etc. Le signal en question est disponible sur une sortie de 1 bit, et correspond tout simplement au fait que cette sortie est mise à 1, pendant un cycle d'horloge. Les ''timers'' sont composés d'un compteur/décompteur cadencé par un signal d'horloge. Le compteur initialisé à 0, puis est incrémenté à chaque signal d'horloge, jusqu’à atteinte d'une valeur limite où il génère un signal. Pour un décompteur, c'est la même chose, sauf que le décompteur est initialisé à sa valeur limite et est décrémenté à chaque cycle, et envoie un signal quand il atteint 0. Les ''timers'' basés sur des décompteurs sont nettement plus simples que les autres, ce qui fait qu'ils sont plus utilisés Pour que les ''timers'' soient configurables, on doit pouvoir préciser combien de cycles il faut (dé-)compter avant d'émettre un signal. On peut ainsi préciser s'il faut émettre le signal après 32 cycles d'horloge, après les 50 cycles, tous les 129 cycles, etc. Le nombre de cycles en question est envoyé sur une entrée d’initialisation du compteur. Les ''timers'' matériels peuvent compter de deux manières différentes, appelées '''mode une fois''' et '''mode périodique'''. * En mode une fois, le ''timer'' s'arrête une fois qu'il a atteint la limite configurée. On doit le réinitialiser manuellement, par l'intermédiaire du logiciel, pour l'utiliser une nouvelle fois. Cela permet de compter une certaine durée, exprimée en nombre de cycles d'horloge. * En mode périodique, le ''timer'' se réinitialise automatiquement avec la valeur de départ, ce qui fait qu'il reboucle à l'infini. Un ordinateur est rempli de ''timers'' divers. Dans ce qui va suivre, nous allons voir les principaux ''timers'', qui sont actuellement intégrés dans les PC modernes. Ils se trouvent sur la carte mère ou dans le processeur, tout dépend du ''timer''. ===Le ''watchdog timer''=== Le '''''watchdog timer''''' est un ''timer'' spécifique dont le but est de redémarrer automatiquement l'ordinateur si jamais celui-ci ne répond plus ou plante. Beaucoup de PC s'en passent, mais ce ''timer'' est très fréquent dans les architectures embarquées. Le ''watchdog timer'' est un compteur/décompteur qui doit être réinitialisé régulièrement. S'il n'est pas réinitialisé, le ''watchdog timer'' déborde (revient à 0 ou atteint 0) et envoie un signal qui redémarre le système. Le système est conçu pour réinitialiser le ''watchdog timer'' régulièrement, ce qui signifie que le système n'est pas censé redémarrer. Si jamais le système dysfonctionne gravement, le système ne pourra pas réinitialiser le ''watchdog timer'' et le système est redémarré automatiquement ou mis en arrêt. [[File:SimpleWatchdogTimer.gif|centre|vignette|upright=2|Le ''Watchdog Timer'' et l'ordinateur.]] ===Le ''Time Stamp Counter'' des processeurs x86=== Tous les processeurs des PC actuels sont des processeurs dits x86. Nous ne pouvons pas expliquer ce que cela signifie pour le moment, retenez juste ce terme. Sachez que tous les processeurs x86 contiennent un compteur de 64 bits, appelé le '''''Time Stamp Counter''''', qui mémorise le nombre de cycles d'horloge qu'a effectué le processeur depuis son démarrage. Les programmes peuvent accéder à ce registre assez facilement, ce qui est utile pour faire des mesures ou comparer les performances de deux applications. Il permet de compter combien de cycles d'horloge met un morceau de code à s’exécuter, combien de cycles prend une instruction à s’exécuter, etc. Les processeurs non-x86 ont un registre équivalent, que ce soit les processeurs ARM ou d'autres. Malheureusement, ce compteur est tombé en désuétude pour tout un tas de raisons. La principale est que les processeurs actuels font varier leur fréquence suivant les besoins. Ils augmentent leur fréquence quand on leur demande de faire beaucoup de calculs, et se mettent en mode basse(fréquence pour économiser de l'énergie si on ne leur demande pas grand chose. Avec une fréquence variable, le ''Time Stamp Counter'' perd complétement en fiabilité. Intel a tenté de corriger ce défaut en incrémentant ce registre à une fréquence constante, différente de celle du processeur, ce qui est encore le cas sur les processeurs Intel actuels. Le comportement est un peu différent sur les processeurs AMD, qui cadencent ce ''timer'' à la fréquence du processeur mais utilisent des mécanismes de synchronisation assez complexes pour corriger l'effet de la fréquence variable. ===L'horloge temps réel=== L''''horloge temps réel''' est un ''timer'' qui génère une fréquence de 1024 Hz, soit près d'un Kilohertz. Dans ce qui suit, nous la noterons RTC, ce qui est l'acronyme du terme anglais ''Real Time Clock''. La RTC prend en entrée un signal d'horloge de 32KHz, généré par un oscillateur à Quartz, et fournit en sortie un signal de fréquence 32 fois plus faible, c'est à dire de 1 KHz. Pour cela, elle est réglée en mode répétitif et son décompteur interne est initialisé à 32. La RTC génère donc un signal toutes les millisecondes, qui est envoyé au processeur. On peut, en théorie, changer la fréquence de la RTC, mais c'est rarement une bonne idée. En théorie, la RTC permet de compter des durées assez courtes, comme le ''ping'' (le temps de latence d'un réseau, pour simplifier), le temps de rafraichissement de l'écran, ou bien d'autres choses. Mais dans les faits, l'horloge temps réel sa fréquence n'aide pas : 1024 Hz est proche de 1000, mais pas assez pour faire des mesures à la milliseconde près, chose qui est nécessaire pour mesurer le ''ping'' ou d'autres choses utiles. A la place, l'ordinateur l'utilise pour que l'ordinateur soit toujours à l'heure. L'ordinateur sait quelle heure il est avec une précision de l'ordre de la seconde (vous pouvez regarder le bureau de Windows dans le coin inférieur droite de votre écran pour vous en convaincre). ===Le ''Programmable Interval Timer'' : l'Intel 8253=== L'Intel 8253 était un ''timer'' programmable autrefois soudé sur les cartes mères des premiers PC. Il fût suivi par l'Intel 8254, qui en était une légère amélioration. Il était cadencé par une horloge maitre, générée par un oscillateur à Quartz, dont la fréquence est de 32 768 Hertz, soit 2^15 cycles d'horloge par seconde. S'il n'est plus présent dans un boitier sur la carte mère, on trouve toujours un circuit semblable au 8253 à l'intérieur du ''chipset'' de la carte mère, voire à l'intérieur du processeur, pour des raisons de compatibilité. L'intérieur de l'Intel 8253 est illustré ci-dessous. Nous allons expliquer l'ensemble de ce schéma, rassurez-vous, mais les explications seront plus simples à comprendre si vous survolez ce schéma en premier lieu. [[File:Intel 8253 block diagram.svg|centre|vignette|upright=2|Intel 8253, intérieur.]] L'Intel 8253 contient trois compteurs de 16 bits, numérotés 0, 1 et 2. Pour chaque compteur, l'entrée CLOCK est celle de l'horloge de 32 MHz, l'entrée GATE active ou désactive le compteur, la sortie fournit le signal voulu et/ou la fréquence de sortie. Les trois compteurs étaient utilisés pour dériver plusieurs fréquences allant de 18,2 Hz à environ 500 KHz. Par exemple, il était utilisé par défaut pour le rafraichissement de la mémoire (D)RAM, mais il était souvent reprogrammé pour servir à générer des fréquences spécifiques par le BIOS ou la carte graphique. [[File:Intel 8253 and 8254.svg|vignette|Intel 8253 and 8254]] L'Intel 8253 lui-même possède plusieurs entrées et sorties. En premier lieu, on voit un port de 8 bits connecté aux trois compteurs, qui permet à l'Intel 8253 de communiquer avec le reste de l'ordinateur. La communication se fait dans les deux sens : soit de l'ordinateur vers les compteurs, soit des compteurs vers l'ordinateur. Dans le sens ordinateur -> compteurs, cela permet à l'ordinateur de programmer les compteurs, de les initialiser. Dans l'autre sens, cela permet de récupérer le contenu des compteurs, même si ce n'est pas très utilisé. Il y a aussi 5 entrées de configuration : * Deux bits A0 et A1 pour sélectionner le compteur voulu avec son numéro. * Un bit RD à mettre à 0 pour que l'ordinateur récupère le compteur sélectionné sur le port de 8 bits. * Un bit WR à mettre à 0 pour que l'ordinateur modifie le compteur sélectionné, en envoyant le nombre pour l'initialisation sur le port de 8 bits. * Un bit CS qui active ou désactive l'Intel 8253 et permet de l'allumer ou de l’éteindre. L'Intel 8253 intégre un registre de 8 bits, le ''Control Word register'' qui mémorise la configuration de l'Intel 8253. Pour programmer les trois compteurs, il faut écrire un mot de 8 bits dans ce ''Control Word register''. Pour écrire dans le ''Control Word register'', il faut mettre le bit CS à 0 (on active l'Intel 8253), mettre le bit RDà 1 , le bit WR à 0 le bit WR (on indique qu'on fait une écriture), sélectionner le ''Control Word register'' en mettant les deux bits A0 et A1 à 1, puis envoyer la configuration du ''Control Word register'' sur le port de 8 bits. ===Le ''High Precision Event Timer'' (HPET)=== De nos jours, l'horloge temps réel et l'Intel 8253/8254 tendent à être remplacé par un autre ''timer'', le ''High Precision Event Timer'' (HPET). Il s'agit d'un compteur de 64 bits, dont la fréquence est d'au moins 10 MHz. Il s'agit bien d'un compteur et non d'un décompteur. Il gère nativement plusieurs valeurs limites à laquelle générer un signal, qui sont configurables. Pour cela, il est couplé à plusieurs comparateurs, chacun associé à un registre pour mémoriser la valeur limite. Il doit y avoir au moins trois comparateurs/registres, mais le nombre peut monter jusqu’à 256. [[File:High Precision Event Timer.png|centre|vignette|upright=2|High Precision Event Timer]] Il faut noter que les systèmes d'exploitation conçus avant le HPET ne peuvent pas l'utiliser, pour des raisons de compatibilité matérielle. C'est le cas de Windows XP avant le Service Pack 3. C'est la raison pour laquelle les cartes mères émulent RTC et PIT dans leurs circuits. D'ailleurs, pour économiser des circuits, les cartes mères modernes émulent le PIT et la RTC avec le HPET : le premier comparateur fournisse la fréquence de 1024 Hz de la RTC, 3 autres comparateurs remplacent l'Intel 8253. Le HPET gère de nombreux modes de fonctionnement : ses comparateurs peuvent être configuré en mode une fois ou périodique, on peut lui demander d'émuler la RTC et le PIT, etc. Chaque comparateur doit pouvoir fonctionner en mode une fois, et au moins un comparateur doit pouvoir fonctionner en mode périodique. Aussi, il contient aussi 3 registres de configuration. Notons qu'il est aussi possible de lire ou écrire dans le compteur de 64 bits, mais ce n'est pas recommandé. ==Les compteurs en code Gray== Les compteurs classiques encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Voyons les compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les compteurs à rétroaction | nextText=Les compteurs à rétroaction }} </noinclude> 4y61wo1sys2bjasrzf80kywnxcf3i8z 768113 768111 2026-06-18T20:21:29Z Mewtow 31375 /* La consommation énergétique du compteur Gray */ 768113 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Un compteur mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il est mémorisé dans un registre à l'intérieur du compteur. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un débordement d'entier a lieu, à savoir quand le compteur n'a pas assez de bits pour encoder le décompte. Le compteur est alors remis à zéro, dans la plupart des cas. Mais il faut prévenir que le compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers''. Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==L'intérieur d'un compteur== A une exception bien précise qu'on abordera plus bas, les compteurs sont composés d'un registre, qui mémorise le décompte, couplé à un circuit '''incrémenteur'''. Nous avions déjà abordé l'incrémenteur dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique. Le pas du compteur précise de combien on incrémente le compteur par cycle d'horloge.]] L'incrémenteur le plus simple, à propagation de retenue, est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs à partir de compteurs plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs modulo=== La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. Mais d'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les mal-nommés ''compteurs asynchrones''=== Les '''compteurs asynchrones''' n'utilisent pas de circuit incrémenteur. A la place, ils sont fabriqués à partir d'un registre à décalage. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Précisons cependant qu'ils sont très mal nommés, à savoir que ce sont bien des circuits synchrones. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les ''timers'' : compter des durées, compter des cycles d'horloge== Les '''''timers''''', aussi appelés ''Programmable interval timer'', sont des circuits capables de compter des durées, exprimées en cycles d'horloge. Leur fonctionnement est assez simple : ils émettent un signal quand un certain nombre de cycles est écoulé, ce nombre de cycles étant configurable. On peut ainsi générer un signal qui surviendra après 50 cycles d'horloge, ou après 100 cycles d'horloge, etc. Le signal en question est disponible sur une sortie de 1 bit, et correspond tout simplement au fait que cette sortie est mise à 1, pendant un cycle d'horloge. Les ''timers'' sont composés d'un compteur/décompteur cadencé par un signal d'horloge. Le compteur initialisé à 0, puis est incrémenté à chaque signal d'horloge, jusqu’à atteinte d'une valeur limite où il génère un signal. Pour un décompteur, c'est la même chose, sauf que le décompteur est initialisé à sa valeur limite et est décrémenté à chaque cycle, et envoie un signal quand il atteint 0. Les ''timers'' basés sur des décompteurs sont nettement plus simples que les autres, ce qui fait qu'ils sont plus utilisés Pour que les ''timers'' soient configurables, on doit pouvoir préciser combien de cycles il faut (dé-)compter avant d'émettre un signal. On peut ainsi préciser s'il faut émettre le signal après 32 cycles d'horloge, après les 50 cycles, tous les 129 cycles, etc. Le nombre de cycles en question est envoyé sur une entrée d’initialisation du compteur. Les ''timers'' matériels peuvent compter de deux manières différentes, appelées '''mode une fois''' et '''mode périodique'''. * En mode une fois, le ''timer'' s'arrête une fois qu'il a atteint la limite configurée. On doit le réinitialiser manuellement, par l'intermédiaire du logiciel, pour l'utiliser une nouvelle fois. Cela permet de compter une certaine durée, exprimée en nombre de cycles d'horloge. * En mode périodique, le ''timer'' se réinitialise automatiquement avec la valeur de départ, ce qui fait qu'il reboucle à l'infini. Un ordinateur est rempli de ''timers'' divers. Dans ce qui va suivre, nous allons voir les principaux ''timers'', qui sont actuellement intégrés dans les PC modernes. Ils se trouvent sur la carte mère ou dans le processeur, tout dépend du ''timer''. ===Le ''watchdog timer''=== Le '''''watchdog timer''''' est un ''timer'' spécifique dont le but est de redémarrer automatiquement l'ordinateur si jamais celui-ci ne répond plus ou plante. Beaucoup de PC s'en passent, mais ce ''timer'' est très fréquent dans les architectures embarquées. Le ''watchdog timer'' est un compteur/décompteur qui doit être réinitialisé régulièrement. S'il n'est pas réinitialisé, le ''watchdog timer'' déborde (revient à 0 ou atteint 0) et envoie un signal qui redémarre le système. Le système est conçu pour réinitialiser le ''watchdog timer'' régulièrement, ce qui signifie que le système n'est pas censé redémarrer. Si jamais le système dysfonctionne gravement, le système ne pourra pas réinitialiser le ''watchdog timer'' et le système est redémarré automatiquement ou mis en arrêt. [[File:SimpleWatchdogTimer.gif|centre|vignette|upright=2|Le ''Watchdog Timer'' et l'ordinateur.]] ===Le ''Time Stamp Counter'' des processeurs x86=== Tous les processeurs des PC actuels sont des processeurs dits x86. Nous ne pouvons pas expliquer ce que cela signifie pour le moment, retenez juste ce terme. Sachez que tous les processeurs x86 contiennent un compteur de 64 bits, appelé le '''''Time Stamp Counter''''', qui mémorise le nombre de cycles d'horloge qu'a effectué le processeur depuis son démarrage. Les programmes peuvent accéder à ce registre assez facilement, ce qui est utile pour faire des mesures ou comparer les performances de deux applications. Il permet de compter combien de cycles d'horloge met un morceau de code à s’exécuter, combien de cycles prend une instruction à s’exécuter, etc. Les processeurs non-x86 ont un registre équivalent, que ce soit les processeurs ARM ou d'autres. Malheureusement, ce compteur est tombé en désuétude pour tout un tas de raisons. La principale est que les processeurs actuels font varier leur fréquence suivant les besoins. Ils augmentent leur fréquence quand on leur demande de faire beaucoup de calculs, et se mettent en mode basse(fréquence pour économiser de l'énergie si on ne leur demande pas grand chose. Avec une fréquence variable, le ''Time Stamp Counter'' perd complétement en fiabilité. Intel a tenté de corriger ce défaut en incrémentant ce registre à une fréquence constante, différente de celle du processeur, ce qui est encore le cas sur les processeurs Intel actuels. Le comportement est un peu différent sur les processeurs AMD, qui cadencent ce ''timer'' à la fréquence du processeur mais utilisent des mécanismes de synchronisation assez complexes pour corriger l'effet de la fréquence variable. ===L'horloge temps réel=== L''''horloge temps réel''' est un ''timer'' qui génère une fréquence de 1024 Hz, soit près d'un Kilohertz. Dans ce qui suit, nous la noterons RTC, ce qui est l'acronyme du terme anglais ''Real Time Clock''. La RTC prend en entrée un signal d'horloge de 32KHz, généré par un oscillateur à Quartz, et fournit en sortie un signal de fréquence 32 fois plus faible, c'est à dire de 1 KHz. Pour cela, elle est réglée en mode répétitif et son décompteur interne est initialisé à 32. La RTC génère donc un signal toutes les millisecondes, qui est envoyé au processeur. On peut, en théorie, changer la fréquence de la RTC, mais c'est rarement une bonne idée. En théorie, la RTC permet de compter des durées assez courtes, comme le ''ping'' (le temps de latence d'un réseau, pour simplifier), le temps de rafraichissement de l'écran, ou bien d'autres choses. Mais dans les faits, l'horloge temps réel sa fréquence n'aide pas : 1024 Hz est proche de 1000, mais pas assez pour faire des mesures à la milliseconde près, chose qui est nécessaire pour mesurer le ''ping'' ou d'autres choses utiles. A la place, l'ordinateur l'utilise pour que l'ordinateur soit toujours à l'heure. L'ordinateur sait quelle heure il est avec une précision de l'ordre de la seconde (vous pouvez regarder le bureau de Windows dans le coin inférieur droite de votre écran pour vous en convaincre). ===Le ''Programmable Interval Timer'' : l'Intel 8253=== L'Intel 8253 était un ''timer'' programmable autrefois soudé sur les cartes mères des premiers PC. Il fût suivi par l'Intel 8254, qui en était une légère amélioration. Il était cadencé par une horloge maitre, générée par un oscillateur à Quartz, dont la fréquence est de 32 768 Hertz, soit 2^15 cycles d'horloge par seconde. S'il n'est plus présent dans un boitier sur la carte mère, on trouve toujours un circuit semblable au 8253 à l'intérieur du ''chipset'' de la carte mère, voire à l'intérieur du processeur, pour des raisons de compatibilité. L'intérieur de l'Intel 8253 est illustré ci-dessous. Nous allons expliquer l'ensemble de ce schéma, rassurez-vous, mais les explications seront plus simples à comprendre si vous survolez ce schéma en premier lieu. [[File:Intel 8253 block diagram.svg|centre|vignette|upright=2|Intel 8253, intérieur.]] L'Intel 8253 contient trois compteurs de 16 bits, numérotés 0, 1 et 2. Pour chaque compteur, l'entrée CLOCK est celle de l'horloge de 32 MHz, l'entrée GATE active ou désactive le compteur, la sortie fournit le signal voulu et/ou la fréquence de sortie. Les trois compteurs étaient utilisés pour dériver plusieurs fréquences allant de 18,2 Hz à environ 500 KHz. Par exemple, il était utilisé par défaut pour le rafraichissement de la mémoire (D)RAM, mais il était souvent reprogrammé pour servir à générer des fréquences spécifiques par le BIOS ou la carte graphique. [[File:Intel 8253 and 8254.svg|vignette|Intel 8253 and 8254]] L'Intel 8253 lui-même possède plusieurs entrées et sorties. En premier lieu, on voit un port de 8 bits connecté aux trois compteurs, qui permet à l'Intel 8253 de communiquer avec le reste de l'ordinateur. La communication se fait dans les deux sens : soit de l'ordinateur vers les compteurs, soit des compteurs vers l'ordinateur. Dans le sens ordinateur -> compteurs, cela permet à l'ordinateur de programmer les compteurs, de les initialiser. Dans l'autre sens, cela permet de récupérer le contenu des compteurs, même si ce n'est pas très utilisé. Il y a aussi 5 entrées de configuration : * Deux bits A0 et A1 pour sélectionner le compteur voulu avec son numéro. * Un bit RD à mettre à 0 pour que l'ordinateur récupère le compteur sélectionné sur le port de 8 bits. * Un bit WR à mettre à 0 pour que l'ordinateur modifie le compteur sélectionné, en envoyant le nombre pour l'initialisation sur le port de 8 bits. * Un bit CS qui active ou désactive l'Intel 8253 et permet de l'allumer ou de l’éteindre. L'Intel 8253 intégre un registre de 8 bits, le ''Control Word register'' qui mémorise la configuration de l'Intel 8253. Pour programmer les trois compteurs, il faut écrire un mot de 8 bits dans ce ''Control Word register''. Pour écrire dans le ''Control Word register'', il faut mettre le bit CS à 0 (on active l'Intel 8253), mettre le bit RDà 1 , le bit WR à 0 le bit WR (on indique qu'on fait une écriture), sélectionner le ''Control Word register'' en mettant les deux bits A0 et A1 à 1, puis envoyer la configuration du ''Control Word register'' sur le port de 8 bits. ===Le ''High Precision Event Timer'' (HPET)=== De nos jours, l'horloge temps réel et l'Intel 8253/8254 tendent à être remplacé par un autre ''timer'', le ''High Precision Event Timer'' (HPET). Il s'agit d'un compteur de 64 bits, dont la fréquence est d'au moins 10 MHz. Il s'agit bien d'un compteur et non d'un décompteur. Il gère nativement plusieurs valeurs limites à laquelle générer un signal, qui sont configurables. Pour cela, il est couplé à plusieurs comparateurs, chacun associé à un registre pour mémoriser la valeur limite. Il doit y avoir au moins trois comparateurs/registres, mais le nombre peut monter jusqu’à 256. [[File:High Precision Event Timer.png|centre|vignette|upright=2|High Precision Event Timer]] Il faut noter que les systèmes d'exploitation conçus avant le HPET ne peuvent pas l'utiliser, pour des raisons de compatibilité matérielle. C'est le cas de Windows XP avant le Service Pack 3. C'est la raison pour laquelle les cartes mères émulent RTC et PIT dans leurs circuits. D'ailleurs, pour économiser des circuits, les cartes mères modernes émulent le PIT et la RTC avec le HPET : le premier comparateur fournisse la fréquence de 1024 Hz de la RTC, 3 autres comparateurs remplacent l'Intel 8253. Le HPET gère de nombreux modes de fonctionnement : ses comparateurs peuvent être configuré en mode une fois ou périodique, on peut lui demander d'émuler la RTC et le PIT, etc. Chaque comparateur doit pouvoir fonctionner en mode une fois, et au moins un comparateur doit pouvoir fonctionner en mode périodique. Aussi, il contient aussi 3 registres de configuration. Notons qu'il est aussi possible de lire ou écrire dans le compteur de 64 bits, mais ce n'est pas recommandé. ==Les compteurs en code Gray== Les compteurs classiques encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Voyons les compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! ==Les compteurs en anneau== Pour finir ce chapitre, nous allons aborder les '''compteurs en anneau'''. Les compteurs en anneau ne comptent pas au sens commun du terme. À la place, ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. De tels compteurs sont basés sur un registre à décalage, dont on boucle la sortie sur son entrée, parfois en insérant un circuit combinatoire entre les deux. C'est ce qui leur a valu le nom de '''compteurs en anneau'''. Ils sont appelés ainsi, car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un ''compteur one-hot''. La seconde possibilité, où le bit sortant est inversé, donne un compteur de Johnson. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ===Les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations, car nous en reparlerons dans la suite du cours. ===Les compteurs de Johnson=== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. [[File:A simple sinusoid generator.jpg|centre|vignette|upright=2.5|Générateur de sinusoïde avec un compteur de Johnson.]] <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les compteurs à rétroaction | nextText=Les compteurs à rétroaction }} </noinclude> 54ebxpp6go21s900v0s2b0beqyyp2g5 768114 768113 2026-06-18T20:22:17Z Mewtow 31375 /* Les compteurs en anneau */ 768114 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Un compteur mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il est mémorisé dans un registre à l'intérieur du compteur. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un débordement d'entier a lieu, à savoir quand le compteur n'a pas assez de bits pour encoder le décompte. Le compteur est alors remis à zéro, dans la plupart des cas. Mais il faut prévenir que le compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers''. Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==L'intérieur d'un compteur== A une exception bien précise qu'on abordera plus bas, les compteurs sont composés d'un registre, qui mémorise le décompte, couplé à un circuit '''incrémenteur'''. Nous avions déjà abordé l'incrémenteur dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique. Le pas du compteur précise de combien on incrémente le compteur par cycle d'horloge.]] L'incrémenteur le plus simple, à propagation de retenue, est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs à partir de compteurs plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs modulo=== La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. Mais d'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les mal-nommés ''compteurs asynchrones''=== Les '''compteurs asynchrones''' n'utilisent pas de circuit incrémenteur. A la place, ils sont fabriqués à partir d'un registre à décalage. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Précisons cependant qu'ils sont très mal nommés, à savoir que ce sont bien des circuits synchrones. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les ''timers'' : compter des durées, compter des cycles d'horloge== Les '''''timers''''', aussi appelés ''Programmable interval timer'', sont des circuits capables de compter des durées, exprimées en cycles d'horloge. Leur fonctionnement est assez simple : ils émettent un signal quand un certain nombre de cycles est écoulé, ce nombre de cycles étant configurable. On peut ainsi générer un signal qui surviendra après 50 cycles d'horloge, ou après 100 cycles d'horloge, etc. Le signal en question est disponible sur une sortie de 1 bit, et correspond tout simplement au fait que cette sortie est mise à 1, pendant un cycle d'horloge. Les ''timers'' sont composés d'un compteur/décompteur cadencé par un signal d'horloge. Le compteur initialisé à 0, puis est incrémenté à chaque signal d'horloge, jusqu’à atteinte d'une valeur limite où il génère un signal. Pour un décompteur, c'est la même chose, sauf que le décompteur est initialisé à sa valeur limite et est décrémenté à chaque cycle, et envoie un signal quand il atteint 0. Les ''timers'' basés sur des décompteurs sont nettement plus simples que les autres, ce qui fait qu'ils sont plus utilisés Pour que les ''timers'' soient configurables, on doit pouvoir préciser combien de cycles il faut (dé-)compter avant d'émettre un signal. On peut ainsi préciser s'il faut émettre le signal après 32 cycles d'horloge, après les 50 cycles, tous les 129 cycles, etc. Le nombre de cycles en question est envoyé sur une entrée d’initialisation du compteur. Les ''timers'' matériels peuvent compter de deux manières différentes, appelées '''mode une fois''' et '''mode périodique'''. * En mode une fois, le ''timer'' s'arrête une fois qu'il a atteint la limite configurée. On doit le réinitialiser manuellement, par l'intermédiaire du logiciel, pour l'utiliser une nouvelle fois. Cela permet de compter une certaine durée, exprimée en nombre de cycles d'horloge. * En mode périodique, le ''timer'' se réinitialise automatiquement avec la valeur de départ, ce qui fait qu'il reboucle à l'infini. Un ordinateur est rempli de ''timers'' divers. Dans ce qui va suivre, nous allons voir les principaux ''timers'', qui sont actuellement intégrés dans les PC modernes. Ils se trouvent sur la carte mère ou dans le processeur, tout dépend du ''timer''. ===Le ''watchdog timer''=== Le '''''watchdog timer''''' est un ''timer'' spécifique dont le but est de redémarrer automatiquement l'ordinateur si jamais celui-ci ne répond plus ou plante. Beaucoup de PC s'en passent, mais ce ''timer'' est très fréquent dans les architectures embarquées. Le ''watchdog timer'' est un compteur/décompteur qui doit être réinitialisé régulièrement. S'il n'est pas réinitialisé, le ''watchdog timer'' déborde (revient à 0 ou atteint 0) et envoie un signal qui redémarre le système. Le système est conçu pour réinitialiser le ''watchdog timer'' régulièrement, ce qui signifie que le système n'est pas censé redémarrer. Si jamais le système dysfonctionne gravement, le système ne pourra pas réinitialiser le ''watchdog timer'' et le système est redémarré automatiquement ou mis en arrêt. [[File:SimpleWatchdogTimer.gif|centre|vignette|upright=2|Le ''Watchdog Timer'' et l'ordinateur.]] ===Le ''Time Stamp Counter'' des processeurs x86=== Tous les processeurs des PC actuels sont des processeurs dits x86. Nous ne pouvons pas expliquer ce que cela signifie pour le moment, retenez juste ce terme. Sachez que tous les processeurs x86 contiennent un compteur de 64 bits, appelé le '''''Time Stamp Counter''''', qui mémorise le nombre de cycles d'horloge qu'a effectué le processeur depuis son démarrage. Les programmes peuvent accéder à ce registre assez facilement, ce qui est utile pour faire des mesures ou comparer les performances de deux applications. Il permet de compter combien de cycles d'horloge met un morceau de code à s’exécuter, combien de cycles prend une instruction à s’exécuter, etc. Les processeurs non-x86 ont un registre équivalent, que ce soit les processeurs ARM ou d'autres. Malheureusement, ce compteur est tombé en désuétude pour tout un tas de raisons. La principale est que les processeurs actuels font varier leur fréquence suivant les besoins. Ils augmentent leur fréquence quand on leur demande de faire beaucoup de calculs, et se mettent en mode basse(fréquence pour économiser de l'énergie si on ne leur demande pas grand chose. Avec une fréquence variable, le ''Time Stamp Counter'' perd complétement en fiabilité. Intel a tenté de corriger ce défaut en incrémentant ce registre à une fréquence constante, différente de celle du processeur, ce qui est encore le cas sur les processeurs Intel actuels. Le comportement est un peu différent sur les processeurs AMD, qui cadencent ce ''timer'' à la fréquence du processeur mais utilisent des mécanismes de synchronisation assez complexes pour corriger l'effet de la fréquence variable. ===L'horloge temps réel=== L''''horloge temps réel''' est un ''timer'' qui génère une fréquence de 1024 Hz, soit près d'un Kilohertz. Dans ce qui suit, nous la noterons RTC, ce qui est l'acronyme du terme anglais ''Real Time Clock''. La RTC prend en entrée un signal d'horloge de 32KHz, généré par un oscillateur à Quartz, et fournit en sortie un signal de fréquence 32 fois plus faible, c'est à dire de 1 KHz. Pour cela, elle est réglée en mode répétitif et son décompteur interne est initialisé à 32. La RTC génère donc un signal toutes les millisecondes, qui est envoyé au processeur. On peut, en théorie, changer la fréquence de la RTC, mais c'est rarement une bonne idée. En théorie, la RTC permet de compter des durées assez courtes, comme le ''ping'' (le temps de latence d'un réseau, pour simplifier), le temps de rafraichissement de l'écran, ou bien d'autres choses. Mais dans les faits, l'horloge temps réel sa fréquence n'aide pas : 1024 Hz est proche de 1000, mais pas assez pour faire des mesures à la milliseconde près, chose qui est nécessaire pour mesurer le ''ping'' ou d'autres choses utiles. A la place, l'ordinateur l'utilise pour que l'ordinateur soit toujours à l'heure. L'ordinateur sait quelle heure il est avec une précision de l'ordre de la seconde (vous pouvez regarder le bureau de Windows dans le coin inférieur droite de votre écran pour vous en convaincre). ===Le ''Programmable Interval Timer'' : l'Intel 8253=== L'Intel 8253 était un ''timer'' programmable autrefois soudé sur les cartes mères des premiers PC. Il fût suivi par l'Intel 8254, qui en était une légère amélioration. Il était cadencé par une horloge maitre, générée par un oscillateur à Quartz, dont la fréquence est de 32 768 Hertz, soit 2^15 cycles d'horloge par seconde. S'il n'est plus présent dans un boitier sur la carte mère, on trouve toujours un circuit semblable au 8253 à l'intérieur du ''chipset'' de la carte mère, voire à l'intérieur du processeur, pour des raisons de compatibilité. L'intérieur de l'Intel 8253 est illustré ci-dessous. Nous allons expliquer l'ensemble de ce schéma, rassurez-vous, mais les explications seront plus simples à comprendre si vous survolez ce schéma en premier lieu. [[File:Intel 8253 block diagram.svg|centre|vignette|upright=2|Intel 8253, intérieur.]] L'Intel 8253 contient trois compteurs de 16 bits, numérotés 0, 1 et 2. Pour chaque compteur, l'entrée CLOCK est celle de l'horloge de 32 MHz, l'entrée GATE active ou désactive le compteur, la sortie fournit le signal voulu et/ou la fréquence de sortie. Les trois compteurs étaient utilisés pour dériver plusieurs fréquences allant de 18,2 Hz à environ 500 KHz. Par exemple, il était utilisé par défaut pour le rafraichissement de la mémoire (D)RAM, mais il était souvent reprogrammé pour servir à générer des fréquences spécifiques par le BIOS ou la carte graphique. [[File:Intel 8253 and 8254.svg|vignette|Intel 8253 and 8254]] L'Intel 8253 lui-même possède plusieurs entrées et sorties. En premier lieu, on voit un port de 8 bits connecté aux trois compteurs, qui permet à l'Intel 8253 de communiquer avec le reste de l'ordinateur. La communication se fait dans les deux sens : soit de l'ordinateur vers les compteurs, soit des compteurs vers l'ordinateur. Dans le sens ordinateur -> compteurs, cela permet à l'ordinateur de programmer les compteurs, de les initialiser. Dans l'autre sens, cela permet de récupérer le contenu des compteurs, même si ce n'est pas très utilisé. Il y a aussi 5 entrées de configuration : * Deux bits A0 et A1 pour sélectionner le compteur voulu avec son numéro. * Un bit RD à mettre à 0 pour que l'ordinateur récupère le compteur sélectionné sur le port de 8 bits. * Un bit WR à mettre à 0 pour que l'ordinateur modifie le compteur sélectionné, en envoyant le nombre pour l'initialisation sur le port de 8 bits. * Un bit CS qui active ou désactive l'Intel 8253 et permet de l'allumer ou de l’éteindre. L'Intel 8253 intégre un registre de 8 bits, le ''Control Word register'' qui mémorise la configuration de l'Intel 8253. Pour programmer les trois compteurs, il faut écrire un mot de 8 bits dans ce ''Control Word register''. Pour écrire dans le ''Control Word register'', il faut mettre le bit CS à 0 (on active l'Intel 8253), mettre le bit RDà 1 , le bit WR à 0 le bit WR (on indique qu'on fait une écriture), sélectionner le ''Control Word register'' en mettant les deux bits A0 et A1 à 1, puis envoyer la configuration du ''Control Word register'' sur le port de 8 bits. ===Le ''High Precision Event Timer'' (HPET)=== De nos jours, l'horloge temps réel et l'Intel 8253/8254 tendent à être remplacé par un autre ''timer'', le ''High Precision Event Timer'' (HPET). Il s'agit d'un compteur de 64 bits, dont la fréquence est d'au moins 10 MHz. Il s'agit bien d'un compteur et non d'un décompteur. Il gère nativement plusieurs valeurs limites à laquelle générer un signal, qui sont configurables. Pour cela, il est couplé à plusieurs comparateurs, chacun associé à un registre pour mémoriser la valeur limite. Il doit y avoir au moins trois comparateurs/registres, mais le nombre peut monter jusqu’à 256. [[File:High Precision Event Timer.png|centre|vignette|upright=2|High Precision Event Timer]] Il faut noter que les systèmes d'exploitation conçus avant le HPET ne peuvent pas l'utiliser, pour des raisons de compatibilité matérielle. C'est le cas de Windows XP avant le Service Pack 3. C'est la raison pour laquelle les cartes mères émulent RTC et PIT dans leurs circuits. D'ailleurs, pour économiser des circuits, les cartes mères modernes émulent le PIT et la RTC avec le HPET : le premier comparateur fournisse la fréquence de 1024 Hz de la RTC, 3 autres comparateurs remplacent l'Intel 8253. Le HPET gère de nombreux modes de fonctionnement : ses comparateurs peuvent être configuré en mode une fois ou périodique, on peut lui demander d'émuler la RTC et le PIT, etc. Chaque comparateur doit pouvoir fonctionner en mode une fois, et au moins un comparateur doit pouvoir fonctionner en mode périodique. Aussi, il contient aussi 3 registres de configuration. Notons qu'il est aussi possible de lire ou écrire dans le compteur de 64 bits, mais ce n'est pas recommandé. ==Les compteurs en code Gray== Les compteurs classiques encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Voyons les compteurs qui comptent en code Gray. Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. ===L'absence d'états transitoires douteux=== Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! ===La consommation énergétique du compteur Gray=== Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! ==Les compteurs en anneau== Pour finir ce chapitre, nous allons aborder les '''compteurs en anneau'''. De tels compteurs sont basés sur un registre à décalage, dont on boucle la sortie sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un ''compteur one-hot''. La seconde possibilité, où le bit sortant est inversé, donne un compteur de Johnson. Les deux sont très différents, et ne fonctionnent pas du tout pareil. Les compteurs en anneau ne comptent pas au sens commun du terme. À la place, ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. ===Les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations, car nous en reparlerons dans la suite du cours. ===Les compteurs de Johnson=== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. [[File:A simple sinusoid generator.jpg|centre|vignette|upright=2.5|Générateur de sinusoïde avec un compteur de Johnson.]] <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les compteurs à rétroaction | nextText=Les compteurs à rétroaction }} </noinclude> 4l9ddk4ta9gz1721mqdw8woykfag04x 768115 768114 2026-06-18T20:24:59Z Mewtow 31375 /* Les compteurs en code Gray */ 768115 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Un compteur mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il est mémorisé dans un registre à l'intérieur du compteur. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un débordement d'entier a lieu, à savoir quand le compteur n'a pas assez de bits pour encoder le décompte. Le compteur est alors remis à zéro, dans la plupart des cas. Mais il faut prévenir que le compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers''. Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==L'intérieur d'un compteur== A une exception bien précise qu'on abordera plus bas, les compteurs sont composés d'un registre, qui mémorise le décompte, couplé à un circuit '''incrémenteur'''. Nous avions déjà abordé l'incrémenteur dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique. Le pas du compteur précise de combien on incrémente le compteur par cycle d'horloge.]] L'incrémenteur le plus simple, à propagation de retenue, est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs à partir de compteurs plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs modulo=== La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. Mais d'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les mal-nommés ''compteurs asynchrones''=== Les '''compteurs asynchrones''' n'utilisent pas de circuit incrémenteur. A la place, ils sont fabriqués à partir d'un registre à décalage. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Précisons cependant qu'ils sont très mal nommés, à savoir que ce sont bien des circuits synchrones. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les ''timers'' : compter des durées, compter des cycles d'horloge== Les '''''timers''''', aussi appelés ''Programmable interval timer'', sont des circuits capables de compter des durées, exprimées en cycles d'horloge. Leur fonctionnement est assez simple : ils émettent un signal quand un certain nombre de cycles est écoulé, ce nombre de cycles étant configurable. On peut ainsi générer un signal qui surviendra après 50 cycles d'horloge, ou après 100 cycles d'horloge, etc. Le signal en question est disponible sur une sortie de 1 bit, et correspond tout simplement au fait que cette sortie est mise à 1, pendant un cycle d'horloge. Les ''timers'' sont composés d'un compteur/décompteur cadencé par un signal d'horloge. Le compteur initialisé à 0, puis est incrémenté à chaque signal d'horloge, jusqu’à atteinte d'une valeur limite où il génère un signal. Pour un décompteur, c'est la même chose, sauf que le décompteur est initialisé à sa valeur limite et est décrémenté à chaque cycle, et envoie un signal quand il atteint 0. Les ''timers'' basés sur des décompteurs sont nettement plus simples que les autres, ce qui fait qu'ils sont plus utilisés Pour que les ''timers'' soient configurables, on doit pouvoir préciser combien de cycles il faut (dé-)compter avant d'émettre un signal. On peut ainsi préciser s'il faut émettre le signal après 32 cycles d'horloge, après les 50 cycles, tous les 129 cycles, etc. Le nombre de cycles en question est envoyé sur une entrée d’initialisation du compteur. Les ''timers'' matériels peuvent compter de deux manières différentes, appelées '''mode une fois''' et '''mode périodique'''. * En mode une fois, le ''timer'' s'arrête une fois qu'il a atteint la limite configurée. On doit le réinitialiser manuellement, par l'intermédiaire du logiciel, pour l'utiliser une nouvelle fois. Cela permet de compter une certaine durée, exprimée en nombre de cycles d'horloge. * En mode périodique, le ''timer'' se réinitialise automatiquement avec la valeur de départ, ce qui fait qu'il reboucle à l'infini. Un ordinateur est rempli de ''timers'' divers. Dans ce qui va suivre, nous allons voir les principaux ''timers'', qui sont actuellement intégrés dans les PC modernes. Ils se trouvent sur la carte mère ou dans le processeur, tout dépend du ''timer''. ===Le ''watchdog timer''=== Le '''''watchdog timer''''' est un ''timer'' spécifique dont le but est de redémarrer automatiquement l'ordinateur si jamais celui-ci ne répond plus ou plante. Beaucoup de PC s'en passent, mais ce ''timer'' est très fréquent dans les architectures embarquées. Le ''watchdog timer'' est un compteur/décompteur qui doit être réinitialisé régulièrement. S'il n'est pas réinitialisé, le ''watchdog timer'' déborde (revient à 0 ou atteint 0) et envoie un signal qui redémarre le système. Le système est conçu pour réinitialiser le ''watchdog timer'' régulièrement, ce qui signifie que le système n'est pas censé redémarrer. Si jamais le système dysfonctionne gravement, le système ne pourra pas réinitialiser le ''watchdog timer'' et le système est redémarré automatiquement ou mis en arrêt. [[File:SimpleWatchdogTimer.gif|centre|vignette|upright=2|Le ''Watchdog Timer'' et l'ordinateur.]] ===Le ''Time Stamp Counter'' des processeurs x86=== Tous les processeurs des PC actuels sont des processeurs dits x86. Nous ne pouvons pas expliquer ce que cela signifie pour le moment, retenez juste ce terme. Sachez que tous les processeurs x86 contiennent un compteur de 64 bits, appelé le '''''Time Stamp Counter''''', qui mémorise le nombre de cycles d'horloge qu'a effectué le processeur depuis son démarrage. Les programmes peuvent accéder à ce registre assez facilement, ce qui est utile pour faire des mesures ou comparer les performances de deux applications. Il permet de compter combien de cycles d'horloge met un morceau de code à s’exécuter, combien de cycles prend une instruction à s’exécuter, etc. Les processeurs non-x86 ont un registre équivalent, que ce soit les processeurs ARM ou d'autres. Malheureusement, ce compteur est tombé en désuétude pour tout un tas de raisons. La principale est que les processeurs actuels font varier leur fréquence suivant les besoins. Ils augmentent leur fréquence quand on leur demande de faire beaucoup de calculs, et se mettent en mode basse(fréquence pour économiser de l'énergie si on ne leur demande pas grand chose. Avec une fréquence variable, le ''Time Stamp Counter'' perd complétement en fiabilité. Intel a tenté de corriger ce défaut en incrémentant ce registre à une fréquence constante, différente de celle du processeur, ce qui est encore le cas sur les processeurs Intel actuels. Le comportement est un peu différent sur les processeurs AMD, qui cadencent ce ''timer'' à la fréquence du processeur mais utilisent des mécanismes de synchronisation assez complexes pour corriger l'effet de la fréquence variable. ===L'horloge temps réel=== L''''horloge temps réel''' est un ''timer'' qui génère une fréquence de 1024 Hz, soit près d'un Kilohertz. Dans ce qui suit, nous la noterons RTC, ce qui est l'acronyme du terme anglais ''Real Time Clock''. La RTC prend en entrée un signal d'horloge de 32KHz, généré par un oscillateur à Quartz, et fournit en sortie un signal de fréquence 32 fois plus faible, c'est à dire de 1 KHz. Pour cela, elle est réglée en mode répétitif et son décompteur interne est initialisé à 32. La RTC génère donc un signal toutes les millisecondes, qui est envoyé au processeur. On peut, en théorie, changer la fréquence de la RTC, mais c'est rarement une bonne idée. En théorie, la RTC permet de compter des durées assez courtes, comme le ''ping'' (le temps de latence d'un réseau, pour simplifier), le temps de rafraichissement de l'écran, ou bien d'autres choses. Mais dans les faits, l'horloge temps réel sa fréquence n'aide pas : 1024 Hz est proche de 1000, mais pas assez pour faire des mesures à la milliseconde près, chose qui est nécessaire pour mesurer le ''ping'' ou d'autres choses utiles. A la place, l'ordinateur l'utilise pour que l'ordinateur soit toujours à l'heure. L'ordinateur sait quelle heure il est avec une précision de l'ordre de la seconde (vous pouvez regarder le bureau de Windows dans le coin inférieur droite de votre écran pour vous en convaincre). ===Le ''Programmable Interval Timer'' : l'Intel 8253=== L'Intel 8253 était un ''timer'' programmable autrefois soudé sur les cartes mères des premiers PC. Il fût suivi par l'Intel 8254, qui en était une légère amélioration. Il était cadencé par une horloge maitre, générée par un oscillateur à Quartz, dont la fréquence est de 32 768 Hertz, soit 2^15 cycles d'horloge par seconde. S'il n'est plus présent dans un boitier sur la carte mère, on trouve toujours un circuit semblable au 8253 à l'intérieur du ''chipset'' de la carte mère, voire à l'intérieur du processeur, pour des raisons de compatibilité. L'intérieur de l'Intel 8253 est illustré ci-dessous. Nous allons expliquer l'ensemble de ce schéma, rassurez-vous, mais les explications seront plus simples à comprendre si vous survolez ce schéma en premier lieu. [[File:Intel 8253 block diagram.svg|centre|vignette|upright=2|Intel 8253, intérieur.]] L'Intel 8253 contient trois compteurs de 16 bits, numérotés 0, 1 et 2. Pour chaque compteur, l'entrée CLOCK est celle de l'horloge de 32 MHz, l'entrée GATE active ou désactive le compteur, la sortie fournit le signal voulu et/ou la fréquence de sortie. Les trois compteurs étaient utilisés pour dériver plusieurs fréquences allant de 18,2 Hz à environ 500 KHz. Par exemple, il était utilisé par défaut pour le rafraichissement de la mémoire (D)RAM, mais il était souvent reprogrammé pour servir à générer des fréquences spécifiques par le BIOS ou la carte graphique. [[File:Intel 8253 and 8254.svg|vignette|Intel 8253 and 8254]] L'Intel 8253 lui-même possède plusieurs entrées et sorties. En premier lieu, on voit un port de 8 bits connecté aux trois compteurs, qui permet à l'Intel 8253 de communiquer avec le reste de l'ordinateur. La communication se fait dans les deux sens : soit de l'ordinateur vers les compteurs, soit des compteurs vers l'ordinateur. Dans le sens ordinateur -> compteurs, cela permet à l'ordinateur de programmer les compteurs, de les initialiser. Dans l'autre sens, cela permet de récupérer le contenu des compteurs, même si ce n'est pas très utilisé. Il y a aussi 5 entrées de configuration : * Deux bits A0 et A1 pour sélectionner le compteur voulu avec son numéro. * Un bit RD à mettre à 0 pour que l'ordinateur récupère le compteur sélectionné sur le port de 8 bits. * Un bit WR à mettre à 0 pour que l'ordinateur modifie le compteur sélectionné, en envoyant le nombre pour l'initialisation sur le port de 8 bits. * Un bit CS qui active ou désactive l'Intel 8253 et permet de l'allumer ou de l’éteindre. L'Intel 8253 intégre un registre de 8 bits, le ''Control Word register'' qui mémorise la configuration de l'Intel 8253. Pour programmer les trois compteurs, il faut écrire un mot de 8 bits dans ce ''Control Word register''. Pour écrire dans le ''Control Word register'', il faut mettre le bit CS à 0 (on active l'Intel 8253), mettre le bit RDà 1 , le bit WR à 0 le bit WR (on indique qu'on fait une écriture), sélectionner le ''Control Word register'' en mettant les deux bits A0 et A1 à 1, puis envoyer la configuration du ''Control Word register'' sur le port de 8 bits. ===Le ''High Precision Event Timer'' (HPET)=== De nos jours, l'horloge temps réel et l'Intel 8253/8254 tendent à être remplacé par un autre ''timer'', le ''High Precision Event Timer'' (HPET). Il s'agit d'un compteur de 64 bits, dont la fréquence est d'au moins 10 MHz. Il s'agit bien d'un compteur et non d'un décompteur. Il gère nativement plusieurs valeurs limites à laquelle générer un signal, qui sont configurables. Pour cela, il est couplé à plusieurs comparateurs, chacun associé à un registre pour mémoriser la valeur limite. Il doit y avoir au moins trois comparateurs/registres, mais le nombre peut monter jusqu’à 256. [[File:High Precision Event Timer.png|centre|vignette|upright=2|High Precision Event Timer]] Il faut noter que les systèmes d'exploitation conçus avant le HPET ne peuvent pas l'utiliser, pour des raisons de compatibilité matérielle. C'est le cas de Windows XP avant le Service Pack 3. C'est la raison pour laquelle les cartes mères émulent RTC et PIT dans leurs circuits. D'ailleurs, pour économiser des circuits, les cartes mères modernes émulent le PIT et la RTC avec le HPET : le premier comparateur fournisse la fréquence de 1024 Hz de la RTC, 3 autres comparateurs remplacent l'Intel 8253. Le HPET gère de nombreux modes de fonctionnement : ses comparateurs peuvent être configuré en mode une fois ou périodique, on peut lui demander d'émuler la RTC et le PIT, etc. Chaque comparateur doit pouvoir fonctionner en mode une fois, et au moins un comparateur doit pouvoir fonctionner en mode périodique. Aussi, il contient aussi 3 registres de configuration. Notons qu'il est aussi possible de lire ou écrire dans le compteur de 64 bits, mais ce n'est pas recommandé. ==Les compteurs en code Gray== Les compteurs classiques encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Nous allons voir dans ce qui suit deux types de compteurs : ceux qui comptent en code Gray, ceux qui comptent en représentation ''one-hot''. ===Les compteurs en code Gray=== Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! ==Les compteurs en anneau== Pour finir ce chapitre, nous allons aborder les '''compteurs en anneau'''. De tels compteurs sont basés sur un registre à décalage, dont on boucle la sortie sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un ''compteur one-hot''. La seconde possibilité, où le bit sortant est inversé, donne un compteur de Johnson. Les deux sont très différents, et ne fonctionnent pas du tout pareil. Les compteurs en anneau ne comptent pas au sens commun du terme. À la place, ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. ===Les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations, car nous en reparlerons dans la suite du cours. ===Les compteurs de Johnson=== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. [[File:A simple sinusoid generator.jpg|centre|vignette|upright=2.5|Générateur de sinusoïde avec un compteur de Johnson.]] <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les compteurs à rétroaction | nextText=Les compteurs à rétroaction }} </noinclude> 0npln8w40tqbz7b3rbjcyg1e10ixkva 768116 768115 2026-06-18T20:26:28Z Mewtow 31375 /* Les compteurs en anneau */ 768116 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Un compteur mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il est mémorisé dans un registre à l'intérieur du compteur. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un débordement d'entier a lieu, à savoir quand le compteur n'a pas assez de bits pour encoder le décompte. Le compteur est alors remis à zéro, dans la plupart des cas. Mais il faut prévenir que le compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers''. Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==L'intérieur d'un compteur== A une exception bien précise qu'on abordera plus bas, les compteurs sont composés d'un registre, qui mémorise le décompte, couplé à un circuit '''incrémenteur'''. Nous avions déjà abordé l'incrémenteur dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique. Le pas du compteur précise de combien on incrémente le compteur par cycle d'horloge.]] L'incrémenteur le plus simple, à propagation de retenue, est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs à partir de compteurs plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs modulo=== La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. Mais d'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les mal-nommés ''compteurs asynchrones''=== Les '''compteurs asynchrones''' n'utilisent pas de circuit incrémenteur. A la place, ils sont fabriqués à partir d'un registre à décalage. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Précisons cependant qu'ils sont très mal nommés, à savoir que ce sont bien des circuits synchrones. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les ''timers'' : compter des durées, compter des cycles d'horloge== Les '''''timers''''', aussi appelés ''Programmable interval timer'', sont des circuits capables de compter des durées, exprimées en cycles d'horloge. Leur fonctionnement est assez simple : ils émettent un signal quand un certain nombre de cycles est écoulé, ce nombre de cycles étant configurable. On peut ainsi générer un signal qui surviendra après 50 cycles d'horloge, ou après 100 cycles d'horloge, etc. Le signal en question est disponible sur une sortie de 1 bit, et correspond tout simplement au fait que cette sortie est mise à 1, pendant un cycle d'horloge. Les ''timers'' sont composés d'un compteur/décompteur cadencé par un signal d'horloge. Le compteur initialisé à 0, puis est incrémenté à chaque signal d'horloge, jusqu’à atteinte d'une valeur limite où il génère un signal. Pour un décompteur, c'est la même chose, sauf que le décompteur est initialisé à sa valeur limite et est décrémenté à chaque cycle, et envoie un signal quand il atteint 0. Les ''timers'' basés sur des décompteurs sont nettement plus simples que les autres, ce qui fait qu'ils sont plus utilisés Pour que les ''timers'' soient configurables, on doit pouvoir préciser combien de cycles il faut (dé-)compter avant d'émettre un signal. On peut ainsi préciser s'il faut émettre le signal après 32 cycles d'horloge, après les 50 cycles, tous les 129 cycles, etc. Le nombre de cycles en question est envoyé sur une entrée d’initialisation du compteur. Les ''timers'' matériels peuvent compter de deux manières différentes, appelées '''mode une fois''' et '''mode périodique'''. * En mode une fois, le ''timer'' s'arrête une fois qu'il a atteint la limite configurée. On doit le réinitialiser manuellement, par l'intermédiaire du logiciel, pour l'utiliser une nouvelle fois. Cela permet de compter une certaine durée, exprimée en nombre de cycles d'horloge. * En mode périodique, le ''timer'' se réinitialise automatiquement avec la valeur de départ, ce qui fait qu'il reboucle à l'infini. Un ordinateur est rempli de ''timers'' divers. Dans ce qui va suivre, nous allons voir les principaux ''timers'', qui sont actuellement intégrés dans les PC modernes. Ils se trouvent sur la carte mère ou dans le processeur, tout dépend du ''timer''. ===Le ''watchdog timer''=== Le '''''watchdog timer''''' est un ''timer'' spécifique dont le but est de redémarrer automatiquement l'ordinateur si jamais celui-ci ne répond plus ou plante. Beaucoup de PC s'en passent, mais ce ''timer'' est très fréquent dans les architectures embarquées. Le ''watchdog timer'' est un compteur/décompteur qui doit être réinitialisé régulièrement. S'il n'est pas réinitialisé, le ''watchdog timer'' déborde (revient à 0 ou atteint 0) et envoie un signal qui redémarre le système. Le système est conçu pour réinitialiser le ''watchdog timer'' régulièrement, ce qui signifie que le système n'est pas censé redémarrer. Si jamais le système dysfonctionne gravement, le système ne pourra pas réinitialiser le ''watchdog timer'' et le système est redémarré automatiquement ou mis en arrêt. [[File:SimpleWatchdogTimer.gif|centre|vignette|upright=2|Le ''Watchdog Timer'' et l'ordinateur.]] ===Le ''Time Stamp Counter'' des processeurs x86=== Tous les processeurs des PC actuels sont des processeurs dits x86. Nous ne pouvons pas expliquer ce que cela signifie pour le moment, retenez juste ce terme. Sachez que tous les processeurs x86 contiennent un compteur de 64 bits, appelé le '''''Time Stamp Counter''''', qui mémorise le nombre de cycles d'horloge qu'a effectué le processeur depuis son démarrage. Les programmes peuvent accéder à ce registre assez facilement, ce qui est utile pour faire des mesures ou comparer les performances de deux applications. Il permet de compter combien de cycles d'horloge met un morceau de code à s’exécuter, combien de cycles prend une instruction à s’exécuter, etc. Les processeurs non-x86 ont un registre équivalent, que ce soit les processeurs ARM ou d'autres. Malheureusement, ce compteur est tombé en désuétude pour tout un tas de raisons. La principale est que les processeurs actuels font varier leur fréquence suivant les besoins. Ils augmentent leur fréquence quand on leur demande de faire beaucoup de calculs, et se mettent en mode basse(fréquence pour économiser de l'énergie si on ne leur demande pas grand chose. Avec une fréquence variable, le ''Time Stamp Counter'' perd complétement en fiabilité. Intel a tenté de corriger ce défaut en incrémentant ce registre à une fréquence constante, différente de celle du processeur, ce qui est encore le cas sur les processeurs Intel actuels. Le comportement est un peu différent sur les processeurs AMD, qui cadencent ce ''timer'' à la fréquence du processeur mais utilisent des mécanismes de synchronisation assez complexes pour corriger l'effet de la fréquence variable. ===L'horloge temps réel=== L''''horloge temps réel''' est un ''timer'' qui génère une fréquence de 1024 Hz, soit près d'un Kilohertz. Dans ce qui suit, nous la noterons RTC, ce qui est l'acronyme du terme anglais ''Real Time Clock''. La RTC prend en entrée un signal d'horloge de 32KHz, généré par un oscillateur à Quartz, et fournit en sortie un signal de fréquence 32 fois plus faible, c'est à dire de 1 KHz. Pour cela, elle est réglée en mode répétitif et son décompteur interne est initialisé à 32. La RTC génère donc un signal toutes les millisecondes, qui est envoyé au processeur. On peut, en théorie, changer la fréquence de la RTC, mais c'est rarement une bonne idée. En théorie, la RTC permet de compter des durées assez courtes, comme le ''ping'' (le temps de latence d'un réseau, pour simplifier), le temps de rafraichissement de l'écran, ou bien d'autres choses. Mais dans les faits, l'horloge temps réel sa fréquence n'aide pas : 1024 Hz est proche de 1000, mais pas assez pour faire des mesures à la milliseconde près, chose qui est nécessaire pour mesurer le ''ping'' ou d'autres choses utiles. A la place, l'ordinateur l'utilise pour que l'ordinateur soit toujours à l'heure. L'ordinateur sait quelle heure il est avec une précision de l'ordre de la seconde (vous pouvez regarder le bureau de Windows dans le coin inférieur droite de votre écran pour vous en convaincre). ===Le ''Programmable Interval Timer'' : l'Intel 8253=== L'Intel 8253 était un ''timer'' programmable autrefois soudé sur les cartes mères des premiers PC. Il fût suivi par l'Intel 8254, qui en était une légère amélioration. Il était cadencé par une horloge maitre, générée par un oscillateur à Quartz, dont la fréquence est de 32 768 Hertz, soit 2^15 cycles d'horloge par seconde. S'il n'est plus présent dans un boitier sur la carte mère, on trouve toujours un circuit semblable au 8253 à l'intérieur du ''chipset'' de la carte mère, voire à l'intérieur du processeur, pour des raisons de compatibilité. L'intérieur de l'Intel 8253 est illustré ci-dessous. Nous allons expliquer l'ensemble de ce schéma, rassurez-vous, mais les explications seront plus simples à comprendre si vous survolez ce schéma en premier lieu. [[File:Intel 8253 block diagram.svg|centre|vignette|upright=2|Intel 8253, intérieur.]] L'Intel 8253 contient trois compteurs de 16 bits, numérotés 0, 1 et 2. Pour chaque compteur, l'entrée CLOCK est celle de l'horloge de 32 MHz, l'entrée GATE active ou désactive le compteur, la sortie fournit le signal voulu et/ou la fréquence de sortie. Les trois compteurs étaient utilisés pour dériver plusieurs fréquences allant de 18,2 Hz à environ 500 KHz. Par exemple, il était utilisé par défaut pour le rafraichissement de la mémoire (D)RAM, mais il était souvent reprogrammé pour servir à générer des fréquences spécifiques par le BIOS ou la carte graphique. [[File:Intel 8253 and 8254.svg|vignette|Intel 8253 and 8254]] L'Intel 8253 lui-même possède plusieurs entrées et sorties. En premier lieu, on voit un port de 8 bits connecté aux trois compteurs, qui permet à l'Intel 8253 de communiquer avec le reste de l'ordinateur. La communication se fait dans les deux sens : soit de l'ordinateur vers les compteurs, soit des compteurs vers l'ordinateur. Dans le sens ordinateur -> compteurs, cela permet à l'ordinateur de programmer les compteurs, de les initialiser. Dans l'autre sens, cela permet de récupérer le contenu des compteurs, même si ce n'est pas très utilisé. Il y a aussi 5 entrées de configuration : * Deux bits A0 et A1 pour sélectionner le compteur voulu avec son numéro. * Un bit RD à mettre à 0 pour que l'ordinateur récupère le compteur sélectionné sur le port de 8 bits. * Un bit WR à mettre à 0 pour que l'ordinateur modifie le compteur sélectionné, en envoyant le nombre pour l'initialisation sur le port de 8 bits. * Un bit CS qui active ou désactive l'Intel 8253 et permet de l'allumer ou de l’éteindre. L'Intel 8253 intégre un registre de 8 bits, le ''Control Word register'' qui mémorise la configuration de l'Intel 8253. Pour programmer les trois compteurs, il faut écrire un mot de 8 bits dans ce ''Control Word register''. Pour écrire dans le ''Control Word register'', il faut mettre le bit CS à 0 (on active l'Intel 8253), mettre le bit RDà 1 , le bit WR à 0 le bit WR (on indique qu'on fait une écriture), sélectionner le ''Control Word register'' en mettant les deux bits A0 et A1 à 1, puis envoyer la configuration du ''Control Word register'' sur le port de 8 bits. ===Le ''High Precision Event Timer'' (HPET)=== De nos jours, l'horloge temps réel et l'Intel 8253/8254 tendent à être remplacé par un autre ''timer'', le ''High Precision Event Timer'' (HPET). Il s'agit d'un compteur de 64 bits, dont la fréquence est d'au moins 10 MHz. Il s'agit bien d'un compteur et non d'un décompteur. Il gère nativement plusieurs valeurs limites à laquelle générer un signal, qui sont configurables. Pour cela, il est couplé à plusieurs comparateurs, chacun associé à un registre pour mémoriser la valeur limite. Il doit y avoir au moins trois comparateurs/registres, mais le nombre peut monter jusqu’à 256. [[File:High Precision Event Timer.png|centre|vignette|upright=2|High Precision Event Timer]] Il faut noter que les systèmes d'exploitation conçus avant le HPET ne peuvent pas l'utiliser, pour des raisons de compatibilité matérielle. C'est le cas de Windows XP avant le Service Pack 3. C'est la raison pour laquelle les cartes mères émulent RTC et PIT dans leurs circuits. D'ailleurs, pour économiser des circuits, les cartes mères modernes émulent le PIT et la RTC avec le HPET : le premier comparateur fournisse la fréquence de 1024 Hz de la RTC, 3 autres comparateurs remplacent l'Intel 8253. Le HPET gère de nombreux modes de fonctionnement : ses comparateurs peuvent être configuré en mode une fois ou périodique, on peut lui demander d'émuler la RTC et le PIT, etc. Chaque comparateur doit pouvoir fonctionner en mode une fois, et au moins un comparateur doit pouvoir fonctionner en mode périodique. Aussi, il contient aussi 3 registres de configuration. Notons qu'il est aussi possible de lire ou écrire dans le compteur de 64 bits, mais ce n'est pas recommandé. ==Les compteurs en code Gray== Les compteurs classiques encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Nous allons voir dans ce qui suit deux types de compteurs : ceux qui comptent en code Gray, ceux qui comptent en représentation ''one-hot''. ===Les compteurs en code Gray=== Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! ===Les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations, car nous en reparlerons dans la suite du cours. Les '''compteurs de Johnson''' sont des cousins des compteurs ''one-hot''. Avec eux, le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Ils n'utilisent pas de représentation des nombres particulière. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les compteurs à rétroaction | nextText=Les compteurs à rétroaction }} </noinclude> jee98mk1urmxesbcs4g5aj472vo2wya 768117 768116 2026-06-18T20:27:02Z Mewtow 31375 /* Les compteurs one-hot */ 768117 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Un compteur mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il est mémorisé dans un registre à l'intérieur du compteur. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un débordement d'entier a lieu, à savoir quand le compteur n'a pas assez de bits pour encoder le décompte. Le compteur est alors remis à zéro, dans la plupart des cas. Mais il faut prévenir que le compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers''. Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==L'intérieur d'un compteur== A une exception bien précise qu'on abordera plus bas, les compteurs sont composés d'un registre, qui mémorise le décompte, couplé à un circuit '''incrémenteur'''. Nous avions déjà abordé l'incrémenteur dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique. Le pas du compteur précise de combien on incrémente le compteur par cycle d'horloge.]] L'incrémenteur le plus simple, à propagation de retenue, est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs à partir de compteurs plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs modulo=== La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. Mais d'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les mal-nommés ''compteurs asynchrones''=== Les '''compteurs asynchrones''' n'utilisent pas de circuit incrémenteur. A la place, ils sont fabriqués à partir d'un registre à décalage. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Précisons cependant qu'ils sont très mal nommés, à savoir que ce sont bien des circuits synchrones. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les ''timers'' : compter des durées, compter des cycles d'horloge== Les '''''timers''''', aussi appelés ''Programmable interval timer'', sont des circuits capables de compter des durées, exprimées en cycles d'horloge. Leur fonctionnement est assez simple : ils émettent un signal quand un certain nombre de cycles est écoulé, ce nombre de cycles étant configurable. On peut ainsi générer un signal qui surviendra après 50 cycles d'horloge, ou après 100 cycles d'horloge, etc. Le signal en question est disponible sur une sortie de 1 bit, et correspond tout simplement au fait que cette sortie est mise à 1, pendant un cycle d'horloge. Les ''timers'' sont composés d'un compteur/décompteur cadencé par un signal d'horloge. Le compteur initialisé à 0, puis est incrémenté à chaque signal d'horloge, jusqu’à atteinte d'une valeur limite où il génère un signal. Pour un décompteur, c'est la même chose, sauf que le décompteur est initialisé à sa valeur limite et est décrémenté à chaque cycle, et envoie un signal quand il atteint 0. Les ''timers'' basés sur des décompteurs sont nettement plus simples que les autres, ce qui fait qu'ils sont plus utilisés Pour que les ''timers'' soient configurables, on doit pouvoir préciser combien de cycles il faut (dé-)compter avant d'émettre un signal. On peut ainsi préciser s'il faut émettre le signal après 32 cycles d'horloge, après les 50 cycles, tous les 129 cycles, etc. Le nombre de cycles en question est envoyé sur une entrée d’initialisation du compteur. Les ''timers'' matériels peuvent compter de deux manières différentes, appelées '''mode une fois''' et '''mode périodique'''. * En mode une fois, le ''timer'' s'arrête une fois qu'il a atteint la limite configurée. On doit le réinitialiser manuellement, par l'intermédiaire du logiciel, pour l'utiliser une nouvelle fois. Cela permet de compter une certaine durée, exprimée en nombre de cycles d'horloge. * En mode périodique, le ''timer'' se réinitialise automatiquement avec la valeur de départ, ce qui fait qu'il reboucle à l'infini. Un ordinateur est rempli de ''timers'' divers. Dans ce qui va suivre, nous allons voir les principaux ''timers'', qui sont actuellement intégrés dans les PC modernes. Ils se trouvent sur la carte mère ou dans le processeur, tout dépend du ''timer''. ===Le ''watchdog timer''=== Le '''''watchdog timer''''' est un ''timer'' spécifique dont le but est de redémarrer automatiquement l'ordinateur si jamais celui-ci ne répond plus ou plante. Beaucoup de PC s'en passent, mais ce ''timer'' est très fréquent dans les architectures embarquées. Le ''watchdog timer'' est un compteur/décompteur qui doit être réinitialisé régulièrement. S'il n'est pas réinitialisé, le ''watchdog timer'' déborde (revient à 0 ou atteint 0) et envoie un signal qui redémarre le système. Le système est conçu pour réinitialiser le ''watchdog timer'' régulièrement, ce qui signifie que le système n'est pas censé redémarrer. Si jamais le système dysfonctionne gravement, le système ne pourra pas réinitialiser le ''watchdog timer'' et le système est redémarré automatiquement ou mis en arrêt. [[File:SimpleWatchdogTimer.gif|centre|vignette|upright=2|Le ''Watchdog Timer'' et l'ordinateur.]] ===Le ''Time Stamp Counter'' des processeurs x86=== Tous les processeurs des PC actuels sont des processeurs dits x86. Nous ne pouvons pas expliquer ce que cela signifie pour le moment, retenez juste ce terme. Sachez que tous les processeurs x86 contiennent un compteur de 64 bits, appelé le '''''Time Stamp Counter''''', qui mémorise le nombre de cycles d'horloge qu'a effectué le processeur depuis son démarrage. Les programmes peuvent accéder à ce registre assez facilement, ce qui est utile pour faire des mesures ou comparer les performances de deux applications. Il permet de compter combien de cycles d'horloge met un morceau de code à s’exécuter, combien de cycles prend une instruction à s’exécuter, etc. Les processeurs non-x86 ont un registre équivalent, que ce soit les processeurs ARM ou d'autres. Malheureusement, ce compteur est tombé en désuétude pour tout un tas de raisons. La principale est que les processeurs actuels font varier leur fréquence suivant les besoins. Ils augmentent leur fréquence quand on leur demande de faire beaucoup de calculs, et se mettent en mode basse(fréquence pour économiser de l'énergie si on ne leur demande pas grand chose. Avec une fréquence variable, le ''Time Stamp Counter'' perd complétement en fiabilité. Intel a tenté de corriger ce défaut en incrémentant ce registre à une fréquence constante, différente de celle du processeur, ce qui est encore le cas sur les processeurs Intel actuels. Le comportement est un peu différent sur les processeurs AMD, qui cadencent ce ''timer'' à la fréquence du processeur mais utilisent des mécanismes de synchronisation assez complexes pour corriger l'effet de la fréquence variable. ===L'horloge temps réel=== L''''horloge temps réel''' est un ''timer'' qui génère une fréquence de 1024 Hz, soit près d'un Kilohertz. Dans ce qui suit, nous la noterons RTC, ce qui est l'acronyme du terme anglais ''Real Time Clock''. La RTC prend en entrée un signal d'horloge de 32KHz, généré par un oscillateur à Quartz, et fournit en sortie un signal de fréquence 32 fois plus faible, c'est à dire de 1 KHz. Pour cela, elle est réglée en mode répétitif et son décompteur interne est initialisé à 32. La RTC génère donc un signal toutes les millisecondes, qui est envoyé au processeur. On peut, en théorie, changer la fréquence de la RTC, mais c'est rarement une bonne idée. En théorie, la RTC permet de compter des durées assez courtes, comme le ''ping'' (le temps de latence d'un réseau, pour simplifier), le temps de rafraichissement de l'écran, ou bien d'autres choses. Mais dans les faits, l'horloge temps réel sa fréquence n'aide pas : 1024 Hz est proche de 1000, mais pas assez pour faire des mesures à la milliseconde près, chose qui est nécessaire pour mesurer le ''ping'' ou d'autres choses utiles. A la place, l'ordinateur l'utilise pour que l'ordinateur soit toujours à l'heure. L'ordinateur sait quelle heure il est avec une précision de l'ordre de la seconde (vous pouvez regarder le bureau de Windows dans le coin inférieur droite de votre écran pour vous en convaincre). ===Le ''Programmable Interval Timer'' : l'Intel 8253=== L'Intel 8253 était un ''timer'' programmable autrefois soudé sur les cartes mères des premiers PC. Il fût suivi par l'Intel 8254, qui en était une légère amélioration. Il était cadencé par une horloge maitre, générée par un oscillateur à Quartz, dont la fréquence est de 32 768 Hertz, soit 2^15 cycles d'horloge par seconde. S'il n'est plus présent dans un boitier sur la carte mère, on trouve toujours un circuit semblable au 8253 à l'intérieur du ''chipset'' de la carte mère, voire à l'intérieur du processeur, pour des raisons de compatibilité. L'intérieur de l'Intel 8253 est illustré ci-dessous. Nous allons expliquer l'ensemble de ce schéma, rassurez-vous, mais les explications seront plus simples à comprendre si vous survolez ce schéma en premier lieu. [[File:Intel 8253 block diagram.svg|centre|vignette|upright=2|Intel 8253, intérieur.]] L'Intel 8253 contient trois compteurs de 16 bits, numérotés 0, 1 et 2. Pour chaque compteur, l'entrée CLOCK est celle de l'horloge de 32 MHz, l'entrée GATE active ou désactive le compteur, la sortie fournit le signal voulu et/ou la fréquence de sortie. Les trois compteurs étaient utilisés pour dériver plusieurs fréquences allant de 18,2 Hz à environ 500 KHz. Par exemple, il était utilisé par défaut pour le rafraichissement de la mémoire (D)RAM, mais il était souvent reprogrammé pour servir à générer des fréquences spécifiques par le BIOS ou la carte graphique. [[File:Intel 8253 and 8254.svg|vignette|Intel 8253 and 8254]] L'Intel 8253 lui-même possède plusieurs entrées et sorties. En premier lieu, on voit un port de 8 bits connecté aux trois compteurs, qui permet à l'Intel 8253 de communiquer avec le reste de l'ordinateur. La communication se fait dans les deux sens : soit de l'ordinateur vers les compteurs, soit des compteurs vers l'ordinateur. Dans le sens ordinateur -> compteurs, cela permet à l'ordinateur de programmer les compteurs, de les initialiser. Dans l'autre sens, cela permet de récupérer le contenu des compteurs, même si ce n'est pas très utilisé. Il y a aussi 5 entrées de configuration : * Deux bits A0 et A1 pour sélectionner le compteur voulu avec son numéro. * Un bit RD à mettre à 0 pour que l'ordinateur récupère le compteur sélectionné sur le port de 8 bits. * Un bit WR à mettre à 0 pour que l'ordinateur modifie le compteur sélectionné, en envoyant le nombre pour l'initialisation sur le port de 8 bits. * Un bit CS qui active ou désactive l'Intel 8253 et permet de l'allumer ou de l’éteindre. L'Intel 8253 intégre un registre de 8 bits, le ''Control Word register'' qui mémorise la configuration de l'Intel 8253. Pour programmer les trois compteurs, il faut écrire un mot de 8 bits dans ce ''Control Word register''. Pour écrire dans le ''Control Word register'', il faut mettre le bit CS à 0 (on active l'Intel 8253), mettre le bit RDà 1 , le bit WR à 0 le bit WR (on indique qu'on fait une écriture), sélectionner le ''Control Word register'' en mettant les deux bits A0 et A1 à 1, puis envoyer la configuration du ''Control Word register'' sur le port de 8 bits. ===Le ''High Precision Event Timer'' (HPET)=== De nos jours, l'horloge temps réel et l'Intel 8253/8254 tendent à être remplacé par un autre ''timer'', le ''High Precision Event Timer'' (HPET). Il s'agit d'un compteur de 64 bits, dont la fréquence est d'au moins 10 MHz. Il s'agit bien d'un compteur et non d'un décompteur. Il gère nativement plusieurs valeurs limites à laquelle générer un signal, qui sont configurables. Pour cela, il est couplé à plusieurs comparateurs, chacun associé à un registre pour mémoriser la valeur limite. Il doit y avoir au moins trois comparateurs/registres, mais le nombre peut monter jusqu’à 256. [[File:High Precision Event Timer.png|centre|vignette|upright=2|High Precision Event Timer]] Il faut noter que les systèmes d'exploitation conçus avant le HPET ne peuvent pas l'utiliser, pour des raisons de compatibilité matérielle. C'est le cas de Windows XP avant le Service Pack 3. C'est la raison pour laquelle les cartes mères émulent RTC et PIT dans leurs circuits. D'ailleurs, pour économiser des circuits, les cartes mères modernes émulent le PIT et la RTC avec le HPET : le premier comparateur fournisse la fréquence de 1024 Hz de la RTC, 3 autres comparateurs remplacent l'Intel 8253. Le HPET gère de nombreux modes de fonctionnement : ses comparateurs peuvent être configuré en mode une fois ou périodique, on peut lui demander d'émuler la RTC et le PIT, etc. Chaque comparateur doit pouvoir fonctionner en mode une fois, et au moins un comparateur doit pouvoir fonctionner en mode périodique. Aussi, il contient aussi 3 registres de configuration. Notons qu'il est aussi possible de lire ou écrire dans le compteur de 64 bits, mais ce n'est pas recommandé. ==Les compteurs en code Gray== Les compteurs classiques encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Nous allons voir dans ce qui suit deux types de compteurs : ceux qui comptent en code Gray, ceux qui comptent en représentation ''one-hot''. ===Les compteurs en code Gray=== Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! ===Les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations, car nous en reparlerons dans la suite du cours. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les compteurs à rétroaction | nextText=Les compteurs à rétroaction }} </noinclude> m2hjbadacj7oqpw6rcb566ytag9yp3o 768119 768117 2026-06-18T20:27:59Z Mewtow 31375 /* Les compteurs one-hot */ 768119 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Un compteur mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il est mémorisé dans un registre à l'intérieur du compteur. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un débordement d'entier a lieu, à savoir quand le compteur n'a pas assez de bits pour encoder le décompte. Le compteur est alors remis à zéro, dans la plupart des cas. Mais il faut prévenir que le compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers''. Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==L'intérieur d'un compteur== A une exception bien précise qu'on abordera plus bas, les compteurs sont composés d'un registre, qui mémorise le décompte, couplé à un circuit '''incrémenteur'''. Nous avions déjà abordé l'incrémenteur dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique. Le pas du compteur précise de combien on incrémente le compteur par cycle d'horloge.]] L'incrémenteur le plus simple, à propagation de retenue, est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs à partir de compteurs plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs modulo=== La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. Mais d'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les mal-nommés ''compteurs asynchrones''=== Les '''compteurs asynchrones''' n'utilisent pas de circuit incrémenteur. A la place, ils sont fabriqués à partir d'un registre à décalage. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Précisons cependant qu'ils sont très mal nommés, à savoir que ce sont bien des circuits synchrones. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les ''timers'' : compter des durées, compter des cycles d'horloge== Les '''''timers''''', aussi appelés ''Programmable interval timer'', sont des circuits capables de compter des durées, exprimées en cycles d'horloge. Leur fonctionnement est assez simple : ils émettent un signal quand un certain nombre de cycles est écoulé, ce nombre de cycles étant configurable. On peut ainsi générer un signal qui surviendra après 50 cycles d'horloge, ou après 100 cycles d'horloge, etc. Le signal en question est disponible sur une sortie de 1 bit, et correspond tout simplement au fait que cette sortie est mise à 1, pendant un cycle d'horloge. Les ''timers'' sont composés d'un compteur/décompteur cadencé par un signal d'horloge. Le compteur initialisé à 0, puis est incrémenté à chaque signal d'horloge, jusqu’à atteinte d'une valeur limite où il génère un signal. Pour un décompteur, c'est la même chose, sauf que le décompteur est initialisé à sa valeur limite et est décrémenté à chaque cycle, et envoie un signal quand il atteint 0. Les ''timers'' basés sur des décompteurs sont nettement plus simples que les autres, ce qui fait qu'ils sont plus utilisés Pour que les ''timers'' soient configurables, on doit pouvoir préciser combien de cycles il faut (dé-)compter avant d'émettre un signal. On peut ainsi préciser s'il faut émettre le signal après 32 cycles d'horloge, après les 50 cycles, tous les 129 cycles, etc. Le nombre de cycles en question est envoyé sur une entrée d’initialisation du compteur. Les ''timers'' matériels peuvent compter de deux manières différentes, appelées '''mode une fois''' et '''mode périodique'''. * En mode une fois, le ''timer'' s'arrête une fois qu'il a atteint la limite configurée. On doit le réinitialiser manuellement, par l'intermédiaire du logiciel, pour l'utiliser une nouvelle fois. Cela permet de compter une certaine durée, exprimée en nombre de cycles d'horloge. * En mode périodique, le ''timer'' se réinitialise automatiquement avec la valeur de départ, ce qui fait qu'il reboucle à l'infini. Un ordinateur est rempli de ''timers'' divers. Dans ce qui va suivre, nous allons voir les principaux ''timers'', qui sont actuellement intégrés dans les PC modernes. Ils se trouvent sur la carte mère ou dans le processeur, tout dépend du ''timer''. ===Le ''watchdog timer''=== Le '''''watchdog timer''''' est un ''timer'' spécifique dont le but est de redémarrer automatiquement l'ordinateur si jamais celui-ci ne répond plus ou plante. Beaucoup de PC s'en passent, mais ce ''timer'' est très fréquent dans les architectures embarquées. Le ''watchdog timer'' est un compteur/décompteur qui doit être réinitialisé régulièrement. S'il n'est pas réinitialisé, le ''watchdog timer'' déborde (revient à 0 ou atteint 0) et envoie un signal qui redémarre le système. Le système est conçu pour réinitialiser le ''watchdog timer'' régulièrement, ce qui signifie que le système n'est pas censé redémarrer. Si jamais le système dysfonctionne gravement, le système ne pourra pas réinitialiser le ''watchdog timer'' et le système est redémarré automatiquement ou mis en arrêt. [[File:SimpleWatchdogTimer.gif|centre|vignette|upright=2|Le ''Watchdog Timer'' et l'ordinateur.]] ===Le ''Time Stamp Counter'' des processeurs x86=== Tous les processeurs des PC actuels sont des processeurs dits x86. Nous ne pouvons pas expliquer ce que cela signifie pour le moment, retenez juste ce terme. Sachez que tous les processeurs x86 contiennent un compteur de 64 bits, appelé le '''''Time Stamp Counter''''', qui mémorise le nombre de cycles d'horloge qu'a effectué le processeur depuis son démarrage. Les programmes peuvent accéder à ce registre assez facilement, ce qui est utile pour faire des mesures ou comparer les performances de deux applications. Il permet de compter combien de cycles d'horloge met un morceau de code à s’exécuter, combien de cycles prend une instruction à s’exécuter, etc. Les processeurs non-x86 ont un registre équivalent, que ce soit les processeurs ARM ou d'autres. Malheureusement, ce compteur est tombé en désuétude pour tout un tas de raisons. La principale est que les processeurs actuels font varier leur fréquence suivant les besoins. Ils augmentent leur fréquence quand on leur demande de faire beaucoup de calculs, et se mettent en mode basse(fréquence pour économiser de l'énergie si on ne leur demande pas grand chose. Avec une fréquence variable, le ''Time Stamp Counter'' perd complétement en fiabilité. Intel a tenté de corriger ce défaut en incrémentant ce registre à une fréquence constante, différente de celle du processeur, ce qui est encore le cas sur les processeurs Intel actuels. Le comportement est un peu différent sur les processeurs AMD, qui cadencent ce ''timer'' à la fréquence du processeur mais utilisent des mécanismes de synchronisation assez complexes pour corriger l'effet de la fréquence variable. ===L'horloge temps réel=== L''''horloge temps réel''' est un ''timer'' qui génère une fréquence de 1024 Hz, soit près d'un Kilohertz. Dans ce qui suit, nous la noterons RTC, ce qui est l'acronyme du terme anglais ''Real Time Clock''. La RTC prend en entrée un signal d'horloge de 32KHz, généré par un oscillateur à Quartz, et fournit en sortie un signal de fréquence 32 fois plus faible, c'est à dire de 1 KHz. Pour cela, elle est réglée en mode répétitif et son décompteur interne est initialisé à 32. La RTC génère donc un signal toutes les millisecondes, qui est envoyé au processeur. On peut, en théorie, changer la fréquence de la RTC, mais c'est rarement une bonne idée. En théorie, la RTC permet de compter des durées assez courtes, comme le ''ping'' (le temps de latence d'un réseau, pour simplifier), le temps de rafraichissement de l'écran, ou bien d'autres choses. Mais dans les faits, l'horloge temps réel sa fréquence n'aide pas : 1024 Hz est proche de 1000, mais pas assez pour faire des mesures à la milliseconde près, chose qui est nécessaire pour mesurer le ''ping'' ou d'autres choses utiles. A la place, l'ordinateur l'utilise pour que l'ordinateur soit toujours à l'heure. L'ordinateur sait quelle heure il est avec une précision de l'ordre de la seconde (vous pouvez regarder le bureau de Windows dans le coin inférieur droite de votre écran pour vous en convaincre). ===Le ''Programmable Interval Timer'' : l'Intel 8253=== L'Intel 8253 était un ''timer'' programmable autrefois soudé sur les cartes mères des premiers PC. Il fût suivi par l'Intel 8254, qui en était une légère amélioration. Il était cadencé par une horloge maitre, générée par un oscillateur à Quartz, dont la fréquence est de 32 768 Hertz, soit 2^15 cycles d'horloge par seconde. S'il n'est plus présent dans un boitier sur la carte mère, on trouve toujours un circuit semblable au 8253 à l'intérieur du ''chipset'' de la carte mère, voire à l'intérieur du processeur, pour des raisons de compatibilité. L'intérieur de l'Intel 8253 est illustré ci-dessous. Nous allons expliquer l'ensemble de ce schéma, rassurez-vous, mais les explications seront plus simples à comprendre si vous survolez ce schéma en premier lieu. [[File:Intel 8253 block diagram.svg|centre|vignette|upright=2|Intel 8253, intérieur.]] L'Intel 8253 contient trois compteurs de 16 bits, numérotés 0, 1 et 2. Pour chaque compteur, l'entrée CLOCK est celle de l'horloge de 32 MHz, l'entrée GATE active ou désactive le compteur, la sortie fournit le signal voulu et/ou la fréquence de sortie. Les trois compteurs étaient utilisés pour dériver plusieurs fréquences allant de 18,2 Hz à environ 500 KHz. Par exemple, il était utilisé par défaut pour le rafraichissement de la mémoire (D)RAM, mais il était souvent reprogrammé pour servir à générer des fréquences spécifiques par le BIOS ou la carte graphique. [[File:Intel 8253 and 8254.svg|vignette|Intel 8253 and 8254]] L'Intel 8253 lui-même possède plusieurs entrées et sorties. En premier lieu, on voit un port de 8 bits connecté aux trois compteurs, qui permet à l'Intel 8253 de communiquer avec le reste de l'ordinateur. La communication se fait dans les deux sens : soit de l'ordinateur vers les compteurs, soit des compteurs vers l'ordinateur. Dans le sens ordinateur -> compteurs, cela permet à l'ordinateur de programmer les compteurs, de les initialiser. Dans l'autre sens, cela permet de récupérer le contenu des compteurs, même si ce n'est pas très utilisé. Il y a aussi 5 entrées de configuration : * Deux bits A0 et A1 pour sélectionner le compteur voulu avec son numéro. * Un bit RD à mettre à 0 pour que l'ordinateur récupère le compteur sélectionné sur le port de 8 bits. * Un bit WR à mettre à 0 pour que l'ordinateur modifie le compteur sélectionné, en envoyant le nombre pour l'initialisation sur le port de 8 bits. * Un bit CS qui active ou désactive l'Intel 8253 et permet de l'allumer ou de l’éteindre. L'Intel 8253 intégre un registre de 8 bits, le ''Control Word register'' qui mémorise la configuration de l'Intel 8253. Pour programmer les trois compteurs, il faut écrire un mot de 8 bits dans ce ''Control Word register''. Pour écrire dans le ''Control Word register'', il faut mettre le bit CS à 0 (on active l'Intel 8253), mettre le bit RDà 1 , le bit WR à 0 le bit WR (on indique qu'on fait une écriture), sélectionner le ''Control Word register'' en mettant les deux bits A0 et A1 à 1, puis envoyer la configuration du ''Control Word register'' sur le port de 8 bits. ===Le ''High Precision Event Timer'' (HPET)=== De nos jours, l'horloge temps réel et l'Intel 8253/8254 tendent à être remplacé par un autre ''timer'', le ''High Precision Event Timer'' (HPET). Il s'agit d'un compteur de 64 bits, dont la fréquence est d'au moins 10 MHz. Il s'agit bien d'un compteur et non d'un décompteur. Il gère nativement plusieurs valeurs limites à laquelle générer un signal, qui sont configurables. Pour cela, il est couplé à plusieurs comparateurs, chacun associé à un registre pour mémoriser la valeur limite. Il doit y avoir au moins trois comparateurs/registres, mais le nombre peut monter jusqu’à 256. [[File:High Precision Event Timer.png|centre|vignette|upright=2|High Precision Event Timer]] Il faut noter que les systèmes d'exploitation conçus avant le HPET ne peuvent pas l'utiliser, pour des raisons de compatibilité matérielle. C'est le cas de Windows XP avant le Service Pack 3. C'est la raison pour laquelle les cartes mères émulent RTC et PIT dans leurs circuits. D'ailleurs, pour économiser des circuits, les cartes mères modernes émulent le PIT et la RTC avec le HPET : le premier comparateur fournisse la fréquence de 1024 Hz de la RTC, 3 autres comparateurs remplacent l'Intel 8253. Le HPET gère de nombreux modes de fonctionnement : ses comparateurs peuvent être configuré en mode une fois ou périodique, on peut lui demander d'émuler la RTC et le PIT, etc. Chaque comparateur doit pouvoir fonctionner en mode une fois, et au moins un comparateur doit pouvoir fonctionner en mode périodique. Aussi, il contient aussi 3 registres de configuration. Notons qu'il est aussi possible de lire ou écrire dans le compteur de 64 bits, mais ce n'est pas recommandé. ==Les compteurs en code Gray== Les compteurs classiques encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Nous allons voir dans ce qui suit deux types de compteurs : ceux qui comptent en code Gray, ceux qui comptent en représentation ''one-hot''. ===Les compteurs en code Gray=== Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! ===Les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Un compteur ''one-hot'' de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. Pour 5 bits, la séquence est illustrée ci-dessous. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations, car nous en reparlerons dans la suite du cours. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les compteurs à rétroaction | nextText=Les compteurs à rétroaction }} </noinclude> rg26fz7nkt0j7alsh470zkkmzp89m7y 768121 768119 2026-06-18T20:31:05Z Mewtow 31375 /* Les compteurs one-hot */ 768121 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Un compteur mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il est mémorisé dans un registre à l'intérieur du compteur. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un débordement d'entier a lieu, à savoir quand le compteur n'a pas assez de bits pour encoder le décompte. Le compteur est alors remis à zéro, dans la plupart des cas. Mais il faut prévenir que le compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers''. Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==L'intérieur d'un compteur== A une exception bien précise qu'on abordera plus bas, les compteurs sont composés d'un registre, qui mémorise le décompte, couplé à un circuit '''incrémenteur'''. Nous avions déjà abordé l'incrémenteur dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique. Le pas du compteur précise de combien on incrémente le compteur par cycle d'horloge.]] L'incrémenteur le plus simple, à propagation de retenue, est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs à partir de compteurs plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs modulo=== La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. Mais d'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les mal-nommés ''compteurs asynchrones''=== Les '''compteurs asynchrones''' n'utilisent pas de circuit incrémenteur. A la place, ils sont fabriqués à partir d'un registre à décalage. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Précisons cependant qu'ils sont très mal nommés, à savoir que ce sont bien des circuits synchrones. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les ''timers'' : compter des durées, compter des cycles d'horloge== Les '''''timers''''', aussi appelés ''Programmable interval timer'', sont des circuits capables de compter des durées, exprimées en cycles d'horloge. Leur fonctionnement est assez simple : ils émettent un signal quand un certain nombre de cycles est écoulé, ce nombre de cycles étant configurable. On peut ainsi générer un signal qui surviendra après 50 cycles d'horloge, ou après 100 cycles d'horloge, etc. Le signal en question est disponible sur une sortie de 1 bit, et correspond tout simplement au fait que cette sortie est mise à 1, pendant un cycle d'horloge. Les ''timers'' sont composés d'un compteur/décompteur cadencé par un signal d'horloge. Le compteur initialisé à 0, puis est incrémenté à chaque signal d'horloge, jusqu’à atteinte d'une valeur limite où il génère un signal. Pour un décompteur, c'est la même chose, sauf que le décompteur est initialisé à sa valeur limite et est décrémenté à chaque cycle, et envoie un signal quand il atteint 0. Les ''timers'' basés sur des décompteurs sont nettement plus simples que les autres, ce qui fait qu'ils sont plus utilisés Pour que les ''timers'' soient configurables, on doit pouvoir préciser combien de cycles il faut (dé-)compter avant d'émettre un signal. On peut ainsi préciser s'il faut émettre le signal après 32 cycles d'horloge, après les 50 cycles, tous les 129 cycles, etc. Le nombre de cycles en question est envoyé sur une entrée d’initialisation du compteur. Les ''timers'' matériels peuvent compter de deux manières différentes, appelées '''mode une fois''' et '''mode périodique'''. * En mode une fois, le ''timer'' s'arrête une fois qu'il a atteint la limite configurée. On doit le réinitialiser manuellement, par l'intermédiaire du logiciel, pour l'utiliser une nouvelle fois. Cela permet de compter une certaine durée, exprimée en nombre de cycles d'horloge. * En mode périodique, le ''timer'' se réinitialise automatiquement avec la valeur de départ, ce qui fait qu'il reboucle à l'infini. Un ordinateur est rempli de ''timers'' divers. Dans ce qui va suivre, nous allons voir les principaux ''timers'', qui sont actuellement intégrés dans les PC modernes. Ils se trouvent sur la carte mère ou dans le processeur, tout dépend du ''timer''. ===Le ''watchdog timer''=== Le '''''watchdog timer''''' est un ''timer'' spécifique dont le but est de redémarrer automatiquement l'ordinateur si jamais celui-ci ne répond plus ou plante. Beaucoup de PC s'en passent, mais ce ''timer'' est très fréquent dans les architectures embarquées. Le ''watchdog timer'' est un compteur/décompteur qui doit être réinitialisé régulièrement. S'il n'est pas réinitialisé, le ''watchdog timer'' déborde (revient à 0 ou atteint 0) et envoie un signal qui redémarre le système. Le système est conçu pour réinitialiser le ''watchdog timer'' régulièrement, ce qui signifie que le système n'est pas censé redémarrer. Si jamais le système dysfonctionne gravement, le système ne pourra pas réinitialiser le ''watchdog timer'' et le système est redémarré automatiquement ou mis en arrêt. [[File:SimpleWatchdogTimer.gif|centre|vignette|upright=2|Le ''Watchdog Timer'' et l'ordinateur.]] ===Le ''Time Stamp Counter'' des processeurs x86=== Tous les processeurs des PC actuels sont des processeurs dits x86. Nous ne pouvons pas expliquer ce que cela signifie pour le moment, retenez juste ce terme. Sachez que tous les processeurs x86 contiennent un compteur de 64 bits, appelé le '''''Time Stamp Counter''''', qui mémorise le nombre de cycles d'horloge qu'a effectué le processeur depuis son démarrage. Les programmes peuvent accéder à ce registre assez facilement, ce qui est utile pour faire des mesures ou comparer les performances de deux applications. Il permet de compter combien de cycles d'horloge met un morceau de code à s’exécuter, combien de cycles prend une instruction à s’exécuter, etc. Les processeurs non-x86 ont un registre équivalent, que ce soit les processeurs ARM ou d'autres. Malheureusement, ce compteur est tombé en désuétude pour tout un tas de raisons. La principale est que les processeurs actuels font varier leur fréquence suivant les besoins. Ils augmentent leur fréquence quand on leur demande de faire beaucoup de calculs, et se mettent en mode basse(fréquence pour économiser de l'énergie si on ne leur demande pas grand chose. Avec une fréquence variable, le ''Time Stamp Counter'' perd complétement en fiabilité. Intel a tenté de corriger ce défaut en incrémentant ce registre à une fréquence constante, différente de celle du processeur, ce qui est encore le cas sur les processeurs Intel actuels. Le comportement est un peu différent sur les processeurs AMD, qui cadencent ce ''timer'' à la fréquence du processeur mais utilisent des mécanismes de synchronisation assez complexes pour corriger l'effet de la fréquence variable. ===L'horloge temps réel=== L''''horloge temps réel''' est un ''timer'' qui génère une fréquence de 1024 Hz, soit près d'un Kilohertz. Dans ce qui suit, nous la noterons RTC, ce qui est l'acronyme du terme anglais ''Real Time Clock''. La RTC prend en entrée un signal d'horloge de 32KHz, généré par un oscillateur à Quartz, et fournit en sortie un signal de fréquence 32 fois plus faible, c'est à dire de 1 KHz. Pour cela, elle est réglée en mode répétitif et son décompteur interne est initialisé à 32. La RTC génère donc un signal toutes les millisecondes, qui est envoyé au processeur. On peut, en théorie, changer la fréquence de la RTC, mais c'est rarement une bonne idée. En théorie, la RTC permet de compter des durées assez courtes, comme le ''ping'' (le temps de latence d'un réseau, pour simplifier), le temps de rafraichissement de l'écran, ou bien d'autres choses. Mais dans les faits, l'horloge temps réel sa fréquence n'aide pas : 1024 Hz est proche de 1000, mais pas assez pour faire des mesures à la milliseconde près, chose qui est nécessaire pour mesurer le ''ping'' ou d'autres choses utiles. A la place, l'ordinateur l'utilise pour que l'ordinateur soit toujours à l'heure. L'ordinateur sait quelle heure il est avec une précision de l'ordre de la seconde (vous pouvez regarder le bureau de Windows dans le coin inférieur droite de votre écran pour vous en convaincre). ===Le ''Programmable Interval Timer'' : l'Intel 8253=== L'Intel 8253 était un ''timer'' programmable autrefois soudé sur les cartes mères des premiers PC. Il fût suivi par l'Intel 8254, qui en était une légère amélioration. Il était cadencé par une horloge maitre, générée par un oscillateur à Quartz, dont la fréquence est de 32 768 Hertz, soit 2^15 cycles d'horloge par seconde. S'il n'est plus présent dans un boitier sur la carte mère, on trouve toujours un circuit semblable au 8253 à l'intérieur du ''chipset'' de la carte mère, voire à l'intérieur du processeur, pour des raisons de compatibilité. L'intérieur de l'Intel 8253 est illustré ci-dessous. Nous allons expliquer l'ensemble de ce schéma, rassurez-vous, mais les explications seront plus simples à comprendre si vous survolez ce schéma en premier lieu. [[File:Intel 8253 block diagram.svg|centre|vignette|upright=2|Intel 8253, intérieur.]] L'Intel 8253 contient trois compteurs de 16 bits, numérotés 0, 1 et 2. Pour chaque compteur, l'entrée CLOCK est celle de l'horloge de 32 MHz, l'entrée GATE active ou désactive le compteur, la sortie fournit le signal voulu et/ou la fréquence de sortie. Les trois compteurs étaient utilisés pour dériver plusieurs fréquences allant de 18,2 Hz à environ 500 KHz. Par exemple, il était utilisé par défaut pour le rafraichissement de la mémoire (D)RAM, mais il était souvent reprogrammé pour servir à générer des fréquences spécifiques par le BIOS ou la carte graphique. [[File:Intel 8253 and 8254.svg|vignette|Intel 8253 and 8254]] L'Intel 8253 lui-même possède plusieurs entrées et sorties. En premier lieu, on voit un port de 8 bits connecté aux trois compteurs, qui permet à l'Intel 8253 de communiquer avec le reste de l'ordinateur. La communication se fait dans les deux sens : soit de l'ordinateur vers les compteurs, soit des compteurs vers l'ordinateur. Dans le sens ordinateur -> compteurs, cela permet à l'ordinateur de programmer les compteurs, de les initialiser. Dans l'autre sens, cela permet de récupérer le contenu des compteurs, même si ce n'est pas très utilisé. Il y a aussi 5 entrées de configuration : * Deux bits A0 et A1 pour sélectionner le compteur voulu avec son numéro. * Un bit RD à mettre à 0 pour que l'ordinateur récupère le compteur sélectionné sur le port de 8 bits. * Un bit WR à mettre à 0 pour que l'ordinateur modifie le compteur sélectionné, en envoyant le nombre pour l'initialisation sur le port de 8 bits. * Un bit CS qui active ou désactive l'Intel 8253 et permet de l'allumer ou de l’éteindre. L'Intel 8253 intégre un registre de 8 bits, le ''Control Word register'' qui mémorise la configuration de l'Intel 8253. Pour programmer les trois compteurs, il faut écrire un mot de 8 bits dans ce ''Control Word register''. Pour écrire dans le ''Control Word register'', il faut mettre le bit CS à 0 (on active l'Intel 8253), mettre le bit RDà 1 , le bit WR à 0 le bit WR (on indique qu'on fait une écriture), sélectionner le ''Control Word register'' en mettant les deux bits A0 et A1 à 1, puis envoyer la configuration du ''Control Word register'' sur le port de 8 bits. ===Le ''High Precision Event Timer'' (HPET)=== De nos jours, l'horloge temps réel et l'Intel 8253/8254 tendent à être remplacé par un autre ''timer'', le ''High Precision Event Timer'' (HPET). Il s'agit d'un compteur de 64 bits, dont la fréquence est d'au moins 10 MHz. Il s'agit bien d'un compteur et non d'un décompteur. Il gère nativement plusieurs valeurs limites à laquelle générer un signal, qui sont configurables. Pour cela, il est couplé à plusieurs comparateurs, chacun associé à un registre pour mémoriser la valeur limite. Il doit y avoir au moins trois comparateurs/registres, mais le nombre peut monter jusqu’à 256. [[File:High Precision Event Timer.png|centre|vignette|upright=2|High Precision Event Timer]] Il faut noter que les systèmes d'exploitation conçus avant le HPET ne peuvent pas l'utiliser, pour des raisons de compatibilité matérielle. C'est le cas de Windows XP avant le Service Pack 3. C'est la raison pour laquelle les cartes mères émulent RTC et PIT dans leurs circuits. D'ailleurs, pour économiser des circuits, les cartes mères modernes émulent le PIT et la RTC avec le HPET : le premier comparateur fournisse la fréquence de 1024 Hz de la RTC, 3 autres comparateurs remplacent l'Intel 8253. Le HPET gère de nombreux modes de fonctionnement : ses comparateurs peuvent être configuré en mode une fois ou périodique, on peut lui demander d'émuler la RTC et le PIT, etc. Chaque comparateur doit pouvoir fonctionner en mode une fois, et au moins un comparateur doit pouvoir fonctionner en mode périodique. Aussi, il contient aussi 3 registres de configuration. Notons qu'il est aussi possible de lire ou écrire dans le compteur de 64 bits, mais ce n'est pas recommandé. ==Les compteurs en code Gray== Les compteurs classiques encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Nous allons voir dans ce qui suit deux types de compteurs : ceux qui comptent en code Gray, ceux qui comptent en représentation ''one-hot''. ===Les compteurs en code Gray=== Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! ===Les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Un compteur ''one-hot'' de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. Pour 5 bits, la séquence est illustrée ci-dessous. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations, car nous en reparlerons dans la suite du cours. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les compteurs à rétroaction | nextText=Les compteurs à rétroaction }} </noinclude> 0q3dbpm9nnoogzflvkd236h4n4szufz 768122 768121 2026-06-19T01:05:32Z Mewtow 31375 Mewtow a déplacé la page [[Fonctionnement d'un ordinateur/Les circuits compteurs et décompteurs]] vers [[Fonctionnement d'un ordinateur/Les compteurs et timers]] 768121 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Un compteur mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il est mémorisé dans un registre à l'intérieur du compteur. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un débordement d'entier a lieu, à savoir quand le compteur n'a pas assez de bits pour encoder le décompte. Le compteur est alors remis à zéro, dans la plupart des cas. Mais il faut prévenir que le compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers''. Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==L'intérieur d'un compteur== A une exception bien précise qu'on abordera plus bas, les compteurs sont composés d'un registre, qui mémorise le décompte, couplé à un circuit '''incrémenteur'''. Nous avions déjà abordé l'incrémenteur dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique. Le pas du compteur précise de combien on incrémente le compteur par cycle d'horloge.]] L'incrémenteur le plus simple, à propagation de retenue, est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs à partir de compteurs plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs modulo=== La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. Mais d'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les mal-nommés ''compteurs asynchrones''=== Les '''compteurs asynchrones''' n'utilisent pas de circuit incrémenteur. A la place, ils sont fabriqués à partir d'un registre à décalage. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Précisons cependant qu'ils sont très mal nommés, à savoir que ce sont bien des circuits synchrones. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les ''timers'' : compter des durées, compter des cycles d'horloge== Les '''''timers''''', aussi appelés ''Programmable interval timer'', sont des circuits capables de compter des durées, exprimées en cycles d'horloge. Leur fonctionnement est assez simple : ils émettent un signal quand un certain nombre de cycles est écoulé, ce nombre de cycles étant configurable. On peut ainsi générer un signal qui surviendra après 50 cycles d'horloge, ou après 100 cycles d'horloge, etc. Le signal en question est disponible sur une sortie de 1 bit, et correspond tout simplement au fait que cette sortie est mise à 1, pendant un cycle d'horloge. Les ''timers'' sont composés d'un compteur/décompteur cadencé par un signal d'horloge. Le compteur initialisé à 0, puis est incrémenté à chaque signal d'horloge, jusqu’à atteinte d'une valeur limite où il génère un signal. Pour un décompteur, c'est la même chose, sauf que le décompteur est initialisé à sa valeur limite et est décrémenté à chaque cycle, et envoie un signal quand il atteint 0. Les ''timers'' basés sur des décompteurs sont nettement plus simples que les autres, ce qui fait qu'ils sont plus utilisés Pour que les ''timers'' soient configurables, on doit pouvoir préciser combien de cycles il faut (dé-)compter avant d'émettre un signal. On peut ainsi préciser s'il faut émettre le signal après 32 cycles d'horloge, après les 50 cycles, tous les 129 cycles, etc. Le nombre de cycles en question est envoyé sur une entrée d’initialisation du compteur. Les ''timers'' matériels peuvent compter de deux manières différentes, appelées '''mode une fois''' et '''mode périodique'''. * En mode une fois, le ''timer'' s'arrête une fois qu'il a atteint la limite configurée. On doit le réinitialiser manuellement, par l'intermédiaire du logiciel, pour l'utiliser une nouvelle fois. Cela permet de compter une certaine durée, exprimée en nombre de cycles d'horloge. * En mode périodique, le ''timer'' se réinitialise automatiquement avec la valeur de départ, ce qui fait qu'il reboucle à l'infini. Un ordinateur est rempli de ''timers'' divers. Dans ce qui va suivre, nous allons voir les principaux ''timers'', qui sont actuellement intégrés dans les PC modernes. Ils se trouvent sur la carte mère ou dans le processeur, tout dépend du ''timer''. ===Le ''watchdog timer''=== Le '''''watchdog timer''''' est un ''timer'' spécifique dont le but est de redémarrer automatiquement l'ordinateur si jamais celui-ci ne répond plus ou plante. Beaucoup de PC s'en passent, mais ce ''timer'' est très fréquent dans les architectures embarquées. Le ''watchdog timer'' est un compteur/décompteur qui doit être réinitialisé régulièrement. S'il n'est pas réinitialisé, le ''watchdog timer'' déborde (revient à 0 ou atteint 0) et envoie un signal qui redémarre le système. Le système est conçu pour réinitialiser le ''watchdog timer'' régulièrement, ce qui signifie que le système n'est pas censé redémarrer. Si jamais le système dysfonctionne gravement, le système ne pourra pas réinitialiser le ''watchdog timer'' et le système est redémarré automatiquement ou mis en arrêt. [[File:SimpleWatchdogTimer.gif|centre|vignette|upright=2|Le ''Watchdog Timer'' et l'ordinateur.]] ===Le ''Time Stamp Counter'' des processeurs x86=== Tous les processeurs des PC actuels sont des processeurs dits x86. Nous ne pouvons pas expliquer ce que cela signifie pour le moment, retenez juste ce terme. Sachez que tous les processeurs x86 contiennent un compteur de 64 bits, appelé le '''''Time Stamp Counter''''', qui mémorise le nombre de cycles d'horloge qu'a effectué le processeur depuis son démarrage. Les programmes peuvent accéder à ce registre assez facilement, ce qui est utile pour faire des mesures ou comparer les performances de deux applications. Il permet de compter combien de cycles d'horloge met un morceau de code à s’exécuter, combien de cycles prend une instruction à s’exécuter, etc. Les processeurs non-x86 ont un registre équivalent, que ce soit les processeurs ARM ou d'autres. Malheureusement, ce compteur est tombé en désuétude pour tout un tas de raisons. La principale est que les processeurs actuels font varier leur fréquence suivant les besoins. Ils augmentent leur fréquence quand on leur demande de faire beaucoup de calculs, et se mettent en mode basse(fréquence pour économiser de l'énergie si on ne leur demande pas grand chose. Avec une fréquence variable, le ''Time Stamp Counter'' perd complétement en fiabilité. Intel a tenté de corriger ce défaut en incrémentant ce registre à une fréquence constante, différente de celle du processeur, ce qui est encore le cas sur les processeurs Intel actuels. Le comportement est un peu différent sur les processeurs AMD, qui cadencent ce ''timer'' à la fréquence du processeur mais utilisent des mécanismes de synchronisation assez complexes pour corriger l'effet de la fréquence variable. ===L'horloge temps réel=== L''''horloge temps réel''' est un ''timer'' qui génère une fréquence de 1024 Hz, soit près d'un Kilohertz. Dans ce qui suit, nous la noterons RTC, ce qui est l'acronyme du terme anglais ''Real Time Clock''. La RTC prend en entrée un signal d'horloge de 32KHz, généré par un oscillateur à Quartz, et fournit en sortie un signal de fréquence 32 fois plus faible, c'est à dire de 1 KHz. Pour cela, elle est réglée en mode répétitif et son décompteur interne est initialisé à 32. La RTC génère donc un signal toutes les millisecondes, qui est envoyé au processeur. On peut, en théorie, changer la fréquence de la RTC, mais c'est rarement une bonne idée. En théorie, la RTC permet de compter des durées assez courtes, comme le ''ping'' (le temps de latence d'un réseau, pour simplifier), le temps de rafraichissement de l'écran, ou bien d'autres choses. Mais dans les faits, l'horloge temps réel sa fréquence n'aide pas : 1024 Hz est proche de 1000, mais pas assez pour faire des mesures à la milliseconde près, chose qui est nécessaire pour mesurer le ''ping'' ou d'autres choses utiles. A la place, l'ordinateur l'utilise pour que l'ordinateur soit toujours à l'heure. L'ordinateur sait quelle heure il est avec une précision de l'ordre de la seconde (vous pouvez regarder le bureau de Windows dans le coin inférieur droite de votre écran pour vous en convaincre). ===Le ''Programmable Interval Timer'' : l'Intel 8253=== L'Intel 8253 était un ''timer'' programmable autrefois soudé sur les cartes mères des premiers PC. Il fût suivi par l'Intel 8254, qui en était une légère amélioration. Il était cadencé par une horloge maitre, générée par un oscillateur à Quartz, dont la fréquence est de 32 768 Hertz, soit 2^15 cycles d'horloge par seconde. S'il n'est plus présent dans un boitier sur la carte mère, on trouve toujours un circuit semblable au 8253 à l'intérieur du ''chipset'' de la carte mère, voire à l'intérieur du processeur, pour des raisons de compatibilité. L'intérieur de l'Intel 8253 est illustré ci-dessous. Nous allons expliquer l'ensemble de ce schéma, rassurez-vous, mais les explications seront plus simples à comprendre si vous survolez ce schéma en premier lieu. [[File:Intel 8253 block diagram.svg|centre|vignette|upright=2|Intel 8253, intérieur.]] L'Intel 8253 contient trois compteurs de 16 bits, numérotés 0, 1 et 2. Pour chaque compteur, l'entrée CLOCK est celle de l'horloge de 32 MHz, l'entrée GATE active ou désactive le compteur, la sortie fournit le signal voulu et/ou la fréquence de sortie. Les trois compteurs étaient utilisés pour dériver plusieurs fréquences allant de 18,2 Hz à environ 500 KHz. Par exemple, il était utilisé par défaut pour le rafraichissement de la mémoire (D)RAM, mais il était souvent reprogrammé pour servir à générer des fréquences spécifiques par le BIOS ou la carte graphique. [[File:Intel 8253 and 8254.svg|vignette|Intel 8253 and 8254]] L'Intel 8253 lui-même possède plusieurs entrées et sorties. En premier lieu, on voit un port de 8 bits connecté aux trois compteurs, qui permet à l'Intel 8253 de communiquer avec le reste de l'ordinateur. La communication se fait dans les deux sens : soit de l'ordinateur vers les compteurs, soit des compteurs vers l'ordinateur. Dans le sens ordinateur -> compteurs, cela permet à l'ordinateur de programmer les compteurs, de les initialiser. Dans l'autre sens, cela permet de récupérer le contenu des compteurs, même si ce n'est pas très utilisé. Il y a aussi 5 entrées de configuration : * Deux bits A0 et A1 pour sélectionner le compteur voulu avec son numéro. * Un bit RD à mettre à 0 pour que l'ordinateur récupère le compteur sélectionné sur le port de 8 bits. * Un bit WR à mettre à 0 pour que l'ordinateur modifie le compteur sélectionné, en envoyant le nombre pour l'initialisation sur le port de 8 bits. * Un bit CS qui active ou désactive l'Intel 8253 et permet de l'allumer ou de l’éteindre. L'Intel 8253 intégre un registre de 8 bits, le ''Control Word register'' qui mémorise la configuration de l'Intel 8253. Pour programmer les trois compteurs, il faut écrire un mot de 8 bits dans ce ''Control Word register''. Pour écrire dans le ''Control Word register'', il faut mettre le bit CS à 0 (on active l'Intel 8253), mettre le bit RDà 1 , le bit WR à 0 le bit WR (on indique qu'on fait une écriture), sélectionner le ''Control Word register'' en mettant les deux bits A0 et A1 à 1, puis envoyer la configuration du ''Control Word register'' sur le port de 8 bits. ===Le ''High Precision Event Timer'' (HPET)=== De nos jours, l'horloge temps réel et l'Intel 8253/8254 tendent à être remplacé par un autre ''timer'', le ''High Precision Event Timer'' (HPET). Il s'agit d'un compteur de 64 bits, dont la fréquence est d'au moins 10 MHz. Il s'agit bien d'un compteur et non d'un décompteur. Il gère nativement plusieurs valeurs limites à laquelle générer un signal, qui sont configurables. Pour cela, il est couplé à plusieurs comparateurs, chacun associé à un registre pour mémoriser la valeur limite. Il doit y avoir au moins trois comparateurs/registres, mais le nombre peut monter jusqu’à 256. [[File:High Precision Event Timer.png|centre|vignette|upright=2|High Precision Event Timer]] Il faut noter que les systèmes d'exploitation conçus avant le HPET ne peuvent pas l'utiliser, pour des raisons de compatibilité matérielle. C'est le cas de Windows XP avant le Service Pack 3. C'est la raison pour laquelle les cartes mères émulent RTC et PIT dans leurs circuits. D'ailleurs, pour économiser des circuits, les cartes mères modernes émulent le PIT et la RTC avec le HPET : le premier comparateur fournisse la fréquence de 1024 Hz de la RTC, 3 autres comparateurs remplacent l'Intel 8253. Le HPET gère de nombreux modes de fonctionnement : ses comparateurs peuvent être configuré en mode une fois ou périodique, on peut lui demander d'émuler la RTC et le PIT, etc. Chaque comparateur doit pouvoir fonctionner en mode une fois, et au moins un comparateur doit pouvoir fonctionner en mode périodique. Aussi, il contient aussi 3 registres de configuration. Notons qu'il est aussi possible de lire ou écrire dans le compteur de 64 bits, mais ce n'est pas recommandé. ==Les compteurs en code Gray== Les compteurs classiques encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Nous allons voir dans ce qui suit deux types de compteurs : ceux qui comptent en code Gray, ceux qui comptent en représentation ''one-hot''. ===Les compteurs en code Gray=== Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! ===Les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Un compteur ''one-hot'' de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. Pour 5 bits, la séquence est illustrée ci-dessous. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations, car nous en reparlerons dans la suite du cours. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les compteurs à rétroaction | nextText=Les compteurs à rétroaction }} </noinclude> 0q3dbpm9nnoogzflvkd236h4n4szufz 768129 768122 2026-06-19T01:06:37Z Mewtow 31375 /* Les compteurs one-hot */ 768129 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Un compteur mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il est mémorisé dans un registre à l'intérieur du compteur. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un débordement d'entier a lieu, à savoir quand le compteur n'a pas assez de bits pour encoder le décompte. Le compteur est alors remis à zéro, dans la plupart des cas. Mais il faut prévenir que le compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers''. Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==L'intérieur d'un compteur== A une exception bien précise qu'on abordera plus bas, les compteurs sont composés d'un registre, qui mémorise le décompte, couplé à un circuit '''incrémenteur'''. Nous avions déjà abordé l'incrémenteur dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique. Le pas du compteur précise de combien on incrémente le compteur par cycle d'horloge.]] L'incrémenteur le plus simple, à propagation de retenue, est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs à partir de compteurs plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs modulo=== La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. Mais d'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les mal-nommés ''compteurs asynchrones''=== Les '''compteurs asynchrones''' n'utilisent pas de circuit incrémenteur. A la place, ils sont fabriqués à partir d'un registre à décalage. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Précisons cependant qu'ils sont très mal nommés, à savoir que ce sont bien des circuits synchrones. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les ''timers'' : compter des durées, compter des cycles d'horloge== Les '''''timers''''', aussi appelés ''Programmable interval timer'', sont des circuits capables de compter des durées, exprimées en cycles d'horloge. Leur fonctionnement est assez simple : ils émettent un signal quand un certain nombre de cycles est écoulé, ce nombre de cycles étant configurable. On peut ainsi générer un signal qui surviendra après 50 cycles d'horloge, ou après 100 cycles d'horloge, etc. Le signal en question est disponible sur une sortie de 1 bit, et correspond tout simplement au fait que cette sortie est mise à 1, pendant un cycle d'horloge. Les ''timers'' sont composés d'un compteur/décompteur cadencé par un signal d'horloge. Le compteur initialisé à 0, puis est incrémenté à chaque signal d'horloge, jusqu’à atteinte d'une valeur limite où il génère un signal. Pour un décompteur, c'est la même chose, sauf que le décompteur est initialisé à sa valeur limite et est décrémenté à chaque cycle, et envoie un signal quand il atteint 0. Les ''timers'' basés sur des décompteurs sont nettement plus simples que les autres, ce qui fait qu'ils sont plus utilisés Pour que les ''timers'' soient configurables, on doit pouvoir préciser combien de cycles il faut (dé-)compter avant d'émettre un signal. On peut ainsi préciser s'il faut émettre le signal après 32 cycles d'horloge, après les 50 cycles, tous les 129 cycles, etc. Le nombre de cycles en question est envoyé sur une entrée d’initialisation du compteur. Les ''timers'' matériels peuvent compter de deux manières différentes, appelées '''mode une fois''' et '''mode périodique'''. * En mode une fois, le ''timer'' s'arrête une fois qu'il a atteint la limite configurée. On doit le réinitialiser manuellement, par l'intermédiaire du logiciel, pour l'utiliser une nouvelle fois. Cela permet de compter une certaine durée, exprimée en nombre de cycles d'horloge. * En mode périodique, le ''timer'' se réinitialise automatiquement avec la valeur de départ, ce qui fait qu'il reboucle à l'infini. Un ordinateur est rempli de ''timers'' divers. Dans ce qui va suivre, nous allons voir les principaux ''timers'', qui sont actuellement intégrés dans les PC modernes. Ils se trouvent sur la carte mère ou dans le processeur, tout dépend du ''timer''. ===Le ''watchdog timer''=== Le '''''watchdog timer''''' est un ''timer'' spécifique dont le but est de redémarrer automatiquement l'ordinateur si jamais celui-ci ne répond plus ou plante. Beaucoup de PC s'en passent, mais ce ''timer'' est très fréquent dans les architectures embarquées. Le ''watchdog timer'' est un compteur/décompteur qui doit être réinitialisé régulièrement. S'il n'est pas réinitialisé, le ''watchdog timer'' déborde (revient à 0 ou atteint 0) et envoie un signal qui redémarre le système. Le système est conçu pour réinitialiser le ''watchdog timer'' régulièrement, ce qui signifie que le système n'est pas censé redémarrer. Si jamais le système dysfonctionne gravement, le système ne pourra pas réinitialiser le ''watchdog timer'' et le système est redémarré automatiquement ou mis en arrêt. [[File:SimpleWatchdogTimer.gif|centre|vignette|upright=2|Le ''Watchdog Timer'' et l'ordinateur.]] ===Le ''Time Stamp Counter'' des processeurs x86=== Tous les processeurs des PC actuels sont des processeurs dits x86. Nous ne pouvons pas expliquer ce que cela signifie pour le moment, retenez juste ce terme. Sachez que tous les processeurs x86 contiennent un compteur de 64 bits, appelé le '''''Time Stamp Counter''''', qui mémorise le nombre de cycles d'horloge qu'a effectué le processeur depuis son démarrage. Les programmes peuvent accéder à ce registre assez facilement, ce qui est utile pour faire des mesures ou comparer les performances de deux applications. Il permet de compter combien de cycles d'horloge met un morceau de code à s’exécuter, combien de cycles prend une instruction à s’exécuter, etc. Les processeurs non-x86 ont un registre équivalent, que ce soit les processeurs ARM ou d'autres. Malheureusement, ce compteur est tombé en désuétude pour tout un tas de raisons. La principale est que les processeurs actuels font varier leur fréquence suivant les besoins. Ils augmentent leur fréquence quand on leur demande de faire beaucoup de calculs, et se mettent en mode basse(fréquence pour économiser de l'énergie si on ne leur demande pas grand chose. Avec une fréquence variable, le ''Time Stamp Counter'' perd complétement en fiabilité. Intel a tenté de corriger ce défaut en incrémentant ce registre à une fréquence constante, différente de celle du processeur, ce qui est encore le cas sur les processeurs Intel actuels. Le comportement est un peu différent sur les processeurs AMD, qui cadencent ce ''timer'' à la fréquence du processeur mais utilisent des mécanismes de synchronisation assez complexes pour corriger l'effet de la fréquence variable. ===L'horloge temps réel=== L''''horloge temps réel''' est un ''timer'' qui génère une fréquence de 1024 Hz, soit près d'un Kilohertz. Dans ce qui suit, nous la noterons RTC, ce qui est l'acronyme du terme anglais ''Real Time Clock''. La RTC prend en entrée un signal d'horloge de 32KHz, généré par un oscillateur à Quartz, et fournit en sortie un signal de fréquence 32 fois plus faible, c'est à dire de 1 KHz. Pour cela, elle est réglée en mode répétitif et son décompteur interne est initialisé à 32. La RTC génère donc un signal toutes les millisecondes, qui est envoyé au processeur. On peut, en théorie, changer la fréquence de la RTC, mais c'est rarement une bonne idée. En théorie, la RTC permet de compter des durées assez courtes, comme le ''ping'' (le temps de latence d'un réseau, pour simplifier), le temps de rafraichissement de l'écran, ou bien d'autres choses. Mais dans les faits, l'horloge temps réel sa fréquence n'aide pas : 1024 Hz est proche de 1000, mais pas assez pour faire des mesures à la milliseconde près, chose qui est nécessaire pour mesurer le ''ping'' ou d'autres choses utiles. A la place, l'ordinateur l'utilise pour que l'ordinateur soit toujours à l'heure. L'ordinateur sait quelle heure il est avec une précision de l'ordre de la seconde (vous pouvez regarder le bureau de Windows dans le coin inférieur droite de votre écran pour vous en convaincre). ===Le ''Programmable Interval Timer'' : l'Intel 8253=== L'Intel 8253 était un ''timer'' programmable autrefois soudé sur les cartes mères des premiers PC. Il fût suivi par l'Intel 8254, qui en était une légère amélioration. Il était cadencé par une horloge maitre, générée par un oscillateur à Quartz, dont la fréquence est de 32 768 Hertz, soit 2^15 cycles d'horloge par seconde. S'il n'est plus présent dans un boitier sur la carte mère, on trouve toujours un circuit semblable au 8253 à l'intérieur du ''chipset'' de la carte mère, voire à l'intérieur du processeur, pour des raisons de compatibilité. L'intérieur de l'Intel 8253 est illustré ci-dessous. Nous allons expliquer l'ensemble de ce schéma, rassurez-vous, mais les explications seront plus simples à comprendre si vous survolez ce schéma en premier lieu. [[File:Intel 8253 block diagram.svg|centre|vignette|upright=2|Intel 8253, intérieur.]] L'Intel 8253 contient trois compteurs de 16 bits, numérotés 0, 1 et 2. Pour chaque compteur, l'entrée CLOCK est celle de l'horloge de 32 MHz, l'entrée GATE active ou désactive le compteur, la sortie fournit le signal voulu et/ou la fréquence de sortie. Les trois compteurs étaient utilisés pour dériver plusieurs fréquences allant de 18,2 Hz à environ 500 KHz. Par exemple, il était utilisé par défaut pour le rafraichissement de la mémoire (D)RAM, mais il était souvent reprogrammé pour servir à générer des fréquences spécifiques par le BIOS ou la carte graphique. [[File:Intel 8253 and 8254.svg|vignette|Intel 8253 and 8254]] L'Intel 8253 lui-même possède plusieurs entrées et sorties. En premier lieu, on voit un port de 8 bits connecté aux trois compteurs, qui permet à l'Intel 8253 de communiquer avec le reste de l'ordinateur. La communication se fait dans les deux sens : soit de l'ordinateur vers les compteurs, soit des compteurs vers l'ordinateur. Dans le sens ordinateur -> compteurs, cela permet à l'ordinateur de programmer les compteurs, de les initialiser. Dans l'autre sens, cela permet de récupérer le contenu des compteurs, même si ce n'est pas très utilisé. Il y a aussi 5 entrées de configuration : * Deux bits A0 et A1 pour sélectionner le compteur voulu avec son numéro. * Un bit RD à mettre à 0 pour que l'ordinateur récupère le compteur sélectionné sur le port de 8 bits. * Un bit WR à mettre à 0 pour que l'ordinateur modifie le compteur sélectionné, en envoyant le nombre pour l'initialisation sur le port de 8 bits. * Un bit CS qui active ou désactive l'Intel 8253 et permet de l'allumer ou de l’éteindre. L'Intel 8253 intégre un registre de 8 bits, le ''Control Word register'' qui mémorise la configuration de l'Intel 8253. Pour programmer les trois compteurs, il faut écrire un mot de 8 bits dans ce ''Control Word register''. Pour écrire dans le ''Control Word register'', il faut mettre le bit CS à 0 (on active l'Intel 8253), mettre le bit RDà 1 , le bit WR à 0 le bit WR (on indique qu'on fait une écriture), sélectionner le ''Control Word register'' en mettant les deux bits A0 et A1 à 1, puis envoyer la configuration du ''Control Word register'' sur le port de 8 bits. ===Le ''High Precision Event Timer'' (HPET)=== De nos jours, l'horloge temps réel et l'Intel 8253/8254 tendent à être remplacé par un autre ''timer'', le ''High Precision Event Timer'' (HPET). Il s'agit d'un compteur de 64 bits, dont la fréquence est d'au moins 10 MHz. Il s'agit bien d'un compteur et non d'un décompteur. Il gère nativement plusieurs valeurs limites à laquelle générer un signal, qui sont configurables. Pour cela, il est couplé à plusieurs comparateurs, chacun associé à un registre pour mémoriser la valeur limite. Il doit y avoir au moins trois comparateurs/registres, mais le nombre peut monter jusqu’à 256. [[File:High Precision Event Timer.png|centre|vignette|upright=2|High Precision Event Timer]] Il faut noter que les systèmes d'exploitation conçus avant le HPET ne peuvent pas l'utiliser, pour des raisons de compatibilité matérielle. C'est le cas de Windows XP avant le Service Pack 3. C'est la raison pour laquelle les cartes mères émulent RTC et PIT dans leurs circuits. D'ailleurs, pour économiser des circuits, les cartes mères modernes émulent le PIT et la RTC avec le HPET : le premier comparateur fournisse la fréquence de 1024 Hz de la RTC, 3 autres comparateurs remplacent l'Intel 8253. Le HPET gère de nombreux modes de fonctionnement : ses comparateurs peuvent être configuré en mode une fois ou périodique, on peut lui demander d'émuler la RTC et le PIT, etc. Chaque comparateur doit pouvoir fonctionner en mode une fois, et au moins un comparateur doit pouvoir fonctionner en mode périodique. Aussi, il contient aussi 3 registres de configuration. Notons qu'il est aussi possible de lire ou écrire dans le compteur de 64 bits, mais ce n'est pas recommandé. ==Les compteurs en code Gray== Les compteurs classiques encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Nous allons voir dans ce qui suit deux types de compteurs : ceux qui comptent en code Gray, ceux qui comptent en représentation ''one-hot''. ===Les compteurs en code Gray=== Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Ils ont beaucoup d'avantages, qui sont tous liés à cette propriété. Le premier l'absence d'état transitoires douteux. En binaire normal, lorsqu'on passe d'un nombre au suivant, plusieurs bits changent. La moyenne est d'environ deux bits, avec beaucoup de transitions de 1 bit, mais aussi quelques-unes qui en changent beaucoup plus. Le problème est que tous les bits modifiés ne le sont pas en même temps. Typiquement, les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où certains bits ont été modifiés mais pas les autres. Et c'est parfois un problème si le contenu de ce compteur est relié à des circuits assez rapides, qui peuvent, mais ne doivent pas voir cet état transitoire sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. Mais il faut échanger des informations entre ces deux portions, et divers problèmes surviennent alors. Un domaine d'horloge sera plus rapide que l'autre, et il pourra voir les états transitoires invisible pour le circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, et cela fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! Un autre point est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Un compteur ne fait pas exception. Et la majeure partie de cette consommation sert à changer l'état des portes logiques. Faire passer un bit de 0 à 1 ou de 1 à 0 consomme beaucoup plus d'énergie que de laisser un bit inchangé. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. Et les conséquences de cela sont nombreuses. Premièrement, plus on change de bits, plus la consommation est forte. Or, comme on l'a dit plus haut, la moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray. Un compteur Gray consomme donc deux fois moins d'énergie. En soi, cela n'est pas grand-chose, un compteur consomme généralement peu. Mais l'avantage est que cela va avoir des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié justement au point précédent, sur les transitions d'état douteux. Les circuits connectés au compteur vont voir ces transitions d'état douteux : ils vont réagir à ces entrées de transition et modifier leur état interne en réaction. Bien sur, l'état final correct fera de même, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspondra à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! ===Les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Un compteur ''one-hot'' de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. Pour 5 bits, la séquence est illustrée ci-dessous. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations, car nous en reparlerons dans la suite du cours. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les registres à décalage à rétroaction linéaire | nextText=Les registres à décalage à rétroaction linéaire }} </noinclude> 9zprsxkkm38doy2ptdqh7r9lntfw9j7 768137 768129 2026-06-19T01:24:04Z Mewtow 31375 /* Les compteurs en code Gray */ 768137 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Un compteur mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il est mémorisé dans un registre à l'intérieur du compteur. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un débordement d'entier a lieu, à savoir quand le compteur n'a pas assez de bits pour encoder le décompte. Le compteur est alors remis à zéro, dans la plupart des cas. Mais il faut prévenir que le compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers''. Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==L'intérieur d'un compteur== A une exception bien précise qu'on abordera plus bas, les compteurs sont composés d'un registre, qui mémorise le décompte, couplé à un circuit '''incrémenteur'''. Nous avions déjà abordé l'incrémenteur dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique. Le pas du compteur précise de combien on incrémente le compteur par cycle d'horloge.]] L'incrémenteur le plus simple, à propagation de retenue, est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs à partir de compteurs plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs modulo=== La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. Mais d'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les mal-nommés ''compteurs asynchrones''=== Les '''compteurs asynchrones''' n'utilisent pas de circuit incrémenteur. A la place, ils sont fabriqués à partir d'un registre à décalage. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Précisons cependant qu'ils sont très mal nommés, à savoir que ce sont bien des circuits synchrones. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les ''timers'' : compter des durées, compter des cycles d'horloge== Les '''''timers''''', aussi appelés ''Programmable interval timer'', sont des circuits capables de compter des durées, exprimées en cycles d'horloge. Leur fonctionnement est assez simple : ils émettent un signal quand un certain nombre de cycles est écoulé, ce nombre de cycles étant configurable. On peut ainsi générer un signal qui surviendra après 50 cycles d'horloge, ou après 100 cycles d'horloge, etc. Le signal en question est disponible sur une sortie de 1 bit, et correspond tout simplement au fait que cette sortie est mise à 1, pendant un cycle d'horloge. Les ''timers'' sont composés d'un compteur/décompteur cadencé par un signal d'horloge. Le compteur initialisé à 0, puis est incrémenté à chaque signal d'horloge, jusqu’à atteinte d'une valeur limite où il génère un signal. Pour un décompteur, c'est la même chose, sauf que le décompteur est initialisé à sa valeur limite et est décrémenté à chaque cycle, et envoie un signal quand il atteint 0. Les ''timers'' basés sur des décompteurs sont nettement plus simples que les autres, ce qui fait qu'ils sont plus utilisés Pour que les ''timers'' soient configurables, on doit pouvoir préciser combien de cycles il faut (dé-)compter avant d'émettre un signal. On peut ainsi préciser s'il faut émettre le signal après 32 cycles d'horloge, après les 50 cycles, tous les 129 cycles, etc. Le nombre de cycles en question est envoyé sur une entrée d’initialisation du compteur. Les ''timers'' matériels peuvent compter de deux manières différentes, appelées '''mode une fois''' et '''mode périodique'''. * En mode une fois, le ''timer'' s'arrête une fois qu'il a atteint la limite configurée. On doit le réinitialiser manuellement, par l'intermédiaire du logiciel, pour l'utiliser une nouvelle fois. Cela permet de compter une certaine durée, exprimée en nombre de cycles d'horloge. * En mode périodique, le ''timer'' se réinitialise automatiquement avec la valeur de départ, ce qui fait qu'il reboucle à l'infini. Un ordinateur est rempli de ''timers'' divers. Dans ce qui va suivre, nous allons voir les principaux ''timers'', qui sont actuellement intégrés dans les PC modernes. Ils se trouvent sur la carte mère ou dans le processeur, tout dépend du ''timer''. ===Le ''watchdog timer''=== Le '''''watchdog timer''''' est un ''timer'' spécifique dont le but est de redémarrer automatiquement l'ordinateur si jamais celui-ci ne répond plus ou plante. Beaucoup de PC s'en passent, mais ce ''timer'' est très fréquent dans les architectures embarquées. Le ''watchdog timer'' est un compteur/décompteur qui doit être réinitialisé régulièrement. S'il n'est pas réinitialisé, le ''watchdog timer'' déborde (revient à 0 ou atteint 0) et envoie un signal qui redémarre le système. Le système est conçu pour réinitialiser le ''watchdog timer'' régulièrement, ce qui signifie que le système n'est pas censé redémarrer. Si jamais le système dysfonctionne gravement, le système ne pourra pas réinitialiser le ''watchdog timer'' et le système est redémarré automatiquement ou mis en arrêt. [[File:SimpleWatchdogTimer.gif|centre|vignette|upright=2|Le ''Watchdog Timer'' et l'ordinateur.]] ===Le ''Time Stamp Counter'' des processeurs x86=== Tous les processeurs des PC actuels sont des processeurs dits x86. Nous ne pouvons pas expliquer ce que cela signifie pour le moment, retenez juste ce terme. Sachez que tous les processeurs x86 contiennent un compteur de 64 bits, appelé le '''''Time Stamp Counter''''', qui mémorise le nombre de cycles d'horloge qu'a effectué le processeur depuis son démarrage. Les programmes peuvent accéder à ce registre assez facilement, ce qui est utile pour faire des mesures ou comparer les performances de deux applications. Il permet de compter combien de cycles d'horloge met un morceau de code à s’exécuter, combien de cycles prend une instruction à s’exécuter, etc. Les processeurs non-x86 ont un registre équivalent, que ce soit les processeurs ARM ou d'autres. Malheureusement, ce compteur est tombé en désuétude pour tout un tas de raisons. La principale est que les processeurs actuels font varier leur fréquence suivant les besoins. Ils augmentent leur fréquence quand on leur demande de faire beaucoup de calculs, et se mettent en mode basse(fréquence pour économiser de l'énergie si on ne leur demande pas grand chose. Avec une fréquence variable, le ''Time Stamp Counter'' perd complétement en fiabilité. Intel a tenté de corriger ce défaut en incrémentant ce registre à une fréquence constante, différente de celle du processeur, ce qui est encore le cas sur les processeurs Intel actuels. Le comportement est un peu différent sur les processeurs AMD, qui cadencent ce ''timer'' à la fréquence du processeur mais utilisent des mécanismes de synchronisation assez complexes pour corriger l'effet de la fréquence variable. ===L'horloge temps réel=== L''''horloge temps réel''' est un ''timer'' qui génère une fréquence de 1024 Hz, soit près d'un Kilohertz. Dans ce qui suit, nous la noterons RTC, ce qui est l'acronyme du terme anglais ''Real Time Clock''. La RTC prend en entrée un signal d'horloge de 32KHz, généré par un oscillateur à Quartz, et fournit en sortie un signal de fréquence 32 fois plus faible, c'est à dire de 1 KHz. Pour cela, elle est réglée en mode répétitif et son décompteur interne est initialisé à 32. La RTC génère donc un signal toutes les millisecondes, qui est envoyé au processeur. On peut, en théorie, changer la fréquence de la RTC, mais c'est rarement une bonne idée. En théorie, la RTC permet de compter des durées assez courtes, comme le ''ping'' (le temps de latence d'un réseau, pour simplifier), le temps de rafraichissement de l'écran, ou bien d'autres choses. Mais dans les faits, l'horloge temps réel sa fréquence n'aide pas : 1024 Hz est proche de 1000, mais pas assez pour faire des mesures à la milliseconde près, chose qui est nécessaire pour mesurer le ''ping'' ou d'autres choses utiles. A la place, l'ordinateur l'utilise pour que l'ordinateur soit toujours à l'heure. L'ordinateur sait quelle heure il est avec une précision de l'ordre de la seconde (vous pouvez regarder le bureau de Windows dans le coin inférieur droite de votre écran pour vous en convaincre). ===Le ''Programmable Interval Timer'' : l'Intel 8253=== L'Intel 8253 était un ''timer'' programmable autrefois soudé sur les cartes mères des premiers PC. Il fût suivi par l'Intel 8254, qui en était une légère amélioration. Il était cadencé par une horloge maitre, générée par un oscillateur à Quartz, dont la fréquence est de 32 768 Hertz, soit 2^15 cycles d'horloge par seconde. S'il n'est plus présent dans un boitier sur la carte mère, on trouve toujours un circuit semblable au 8253 à l'intérieur du ''chipset'' de la carte mère, voire à l'intérieur du processeur, pour des raisons de compatibilité. L'intérieur de l'Intel 8253 est illustré ci-dessous. Nous allons expliquer l'ensemble de ce schéma, rassurez-vous, mais les explications seront plus simples à comprendre si vous survolez ce schéma en premier lieu. [[File:Intel 8253 block diagram.svg|centre|vignette|upright=2|Intel 8253, intérieur.]] L'Intel 8253 contient trois compteurs de 16 bits, numérotés 0, 1 et 2. Pour chaque compteur, l'entrée CLOCK est celle de l'horloge de 32 MHz, l'entrée GATE active ou désactive le compteur, la sortie fournit le signal voulu et/ou la fréquence de sortie. Les trois compteurs étaient utilisés pour dériver plusieurs fréquences allant de 18,2 Hz à environ 500 KHz. Par exemple, il était utilisé par défaut pour le rafraichissement de la mémoire (D)RAM, mais il était souvent reprogrammé pour servir à générer des fréquences spécifiques par le BIOS ou la carte graphique. [[File:Intel 8253 and 8254.svg|vignette|Intel 8253 and 8254]] L'Intel 8253 lui-même possède plusieurs entrées et sorties. En premier lieu, on voit un port de 8 bits connecté aux trois compteurs, qui permet à l'Intel 8253 de communiquer avec le reste de l'ordinateur. La communication se fait dans les deux sens : soit de l'ordinateur vers les compteurs, soit des compteurs vers l'ordinateur. Dans le sens ordinateur -> compteurs, cela permet à l'ordinateur de programmer les compteurs, de les initialiser. Dans l'autre sens, cela permet de récupérer le contenu des compteurs, même si ce n'est pas très utilisé. Il y a aussi 5 entrées de configuration : * Deux bits A0 et A1 pour sélectionner le compteur voulu avec son numéro. * Un bit RD à mettre à 0 pour que l'ordinateur récupère le compteur sélectionné sur le port de 8 bits. * Un bit WR à mettre à 0 pour que l'ordinateur modifie le compteur sélectionné, en envoyant le nombre pour l'initialisation sur le port de 8 bits. * Un bit CS qui active ou désactive l'Intel 8253 et permet de l'allumer ou de l’éteindre. L'Intel 8253 intégre un registre de 8 bits, le ''Control Word register'' qui mémorise la configuration de l'Intel 8253. Pour programmer les trois compteurs, il faut écrire un mot de 8 bits dans ce ''Control Word register''. Pour écrire dans le ''Control Word register'', il faut mettre le bit CS à 0 (on active l'Intel 8253), mettre le bit RDà 1 , le bit WR à 0 le bit WR (on indique qu'on fait une écriture), sélectionner le ''Control Word register'' en mettant les deux bits A0 et A1 à 1, puis envoyer la configuration du ''Control Word register'' sur le port de 8 bits. ===Le ''High Precision Event Timer'' (HPET)=== De nos jours, l'horloge temps réel et l'Intel 8253/8254 tendent à être remplacé par un autre ''timer'', le ''High Precision Event Timer'' (HPET). Il s'agit d'un compteur de 64 bits, dont la fréquence est d'au moins 10 MHz. Il s'agit bien d'un compteur et non d'un décompteur. Il gère nativement plusieurs valeurs limites à laquelle générer un signal, qui sont configurables. Pour cela, il est couplé à plusieurs comparateurs, chacun associé à un registre pour mémoriser la valeur limite. Il doit y avoir au moins trois comparateurs/registres, mais le nombre peut monter jusqu’à 256. [[File:High Precision Event Timer.png|centre|vignette|upright=2|High Precision Event Timer]] Il faut noter que les systèmes d'exploitation conçus avant le HPET ne peuvent pas l'utiliser, pour des raisons de compatibilité matérielle. C'est le cas de Windows XP avant le Service Pack 3. C'est la raison pour laquelle les cartes mères émulent RTC et PIT dans leurs circuits. D'ailleurs, pour économiser des circuits, les cartes mères modernes émulent le PIT et la RTC avec le HPET : le premier comparateur fournisse la fréquence de 1024 Hz de la RTC, 3 autres comparateurs remplacent l'Intel 8253. Le HPET gère de nombreux modes de fonctionnement : ses comparateurs peuvent être configuré en mode une fois ou périodique, on peut lui demander d'émuler la RTC et le PIT, etc. Chaque comparateur doit pouvoir fonctionner en mode une fois, et au moins un comparateur doit pouvoir fonctionner en mode périodique. Aussi, il contient aussi 3 registres de configuration. Notons qu'il est aussi possible de lire ou écrire dans le compteur de 64 bits, mais ce n'est pas recommandé. ==Les compteurs en code Gray== Les compteurs classiques encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Nous allons voir dans ce qui suit deux types de compteurs : ceux qui comptent en code Gray, ceux qui comptent en représentation ''one-hot''. ===Les compteurs en code Gray=== Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Pour comparer, en binaire normal, lorsqu'on passe incrémente un nombre, il peut y avoir plusieurs bits qui changent. La moyenne est d'environ deux bits par incrémentation. Les compteurs en code Gray ont beaucoup d'avantages, qui sont tous liés à cette propriété. Le premier l'absence d'état transitoires douteux. Le problème est que les bits modifiés par une incrémentation ne le sont pas en même temps. Les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où seuls les bits de poids faibles ont été modifiés. C'est un problème si le contenu de ce compteur est relié à des circuits rapides, qui peuvent voir cet état transitoire, mais ne le doivent pas sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. S'il faut échanger des informations entre ces deux domaines d'horloge, divers problèmes surviennent. Un domaine d'horloge sera plus rapide que l'autre, et pourra voir les états transitoires invisible de l'autre circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, ce qui fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! Un autre avantage mineurs est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Et la majeure partie de cette consommation sert à faire passer un bit de 0 à 1 ou de 1 à 0. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. La moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray, on devine que ces derniers consomment deux fois moins d'énergie par incrémentation. Et cet avantage a des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié auxs transitions d'état douteuses. Les circuits connectés au compteur vont voir ces transitions d'état douteuses et modifier leur état interne en réaction. Bien sur, l'état final correct sera atteint une fois que le compteur sera stabilisé, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspond à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! ===Les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Un compteur ''one-hot'' de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. Pour 5 bits, la séquence est illustrée ci-dessous. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations, car nous en reparlerons dans la suite du cours. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les registres à décalage à rétroaction linéaire | nextText=Les registres à décalage à rétroaction linéaire }} </noinclude> rj7hbjeenw9poqzvsla6s50jnk3xqly 768142 768137 2026-06-19T01:29:56Z Mewtow 31375 /* Les compteurs en code Gray */ 768142 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Un compteur mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il est mémorisé dans un registre à l'intérieur du compteur. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un débordement d'entier a lieu, à savoir quand le compteur n'a pas assez de bits pour encoder le décompte. Le compteur est alors remis à zéro, dans la plupart des cas. Mais il faut prévenir que le compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers''. Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==L'intérieur d'un compteur== A une exception bien précise qu'on abordera plus bas, les compteurs sont composés d'un registre, qui mémorise le décompte, couplé à un circuit '''incrémenteur'''. Nous avions déjà abordé l'incrémenteur dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique. Le pas du compteur précise de combien on incrémente le compteur par cycle d'horloge.]] L'incrémenteur le plus simple, à propagation de retenue, est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs à partir de compteurs plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs modulo=== La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. Mais d'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les mal-nommés ''compteurs asynchrones''=== Les '''compteurs asynchrones''' n'utilisent pas de circuit incrémenteur. A la place, ils sont fabriqués à partir d'un registre à décalage. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Précisons cependant qu'ils sont très mal nommés, à savoir que ce sont bien des circuits synchrones. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les ''timers'' : compter des durées, compter des cycles d'horloge== Les '''''timers''''', aussi appelés ''Programmable interval timer'', sont des circuits capables de compter des durées, exprimées en cycles d'horloge. Leur fonctionnement est assez simple : ils émettent un signal quand un certain nombre de cycles est écoulé, ce nombre de cycles étant configurable. On peut ainsi générer un signal qui surviendra après 50 cycles d'horloge, ou après 100 cycles d'horloge, etc. Le signal en question est disponible sur une sortie de 1 bit, et correspond tout simplement au fait que cette sortie est mise à 1, pendant un cycle d'horloge. Les ''timers'' sont composés d'un compteur/décompteur cadencé par un signal d'horloge. Le compteur initialisé à 0, puis est incrémenté à chaque signal d'horloge, jusqu’à atteinte d'une valeur limite où il génère un signal. Pour un décompteur, c'est la même chose, sauf que le décompteur est initialisé à sa valeur limite et est décrémenté à chaque cycle, et envoie un signal quand il atteint 0. Les ''timers'' basés sur des décompteurs sont nettement plus simples que les autres, ce qui fait qu'ils sont plus utilisés Pour que les ''timers'' soient configurables, on doit pouvoir préciser combien de cycles il faut (dé-)compter avant d'émettre un signal. On peut ainsi préciser s'il faut émettre le signal après 32 cycles d'horloge, après les 50 cycles, tous les 129 cycles, etc. Le nombre de cycles en question est envoyé sur une entrée d’initialisation du compteur. Les ''timers'' matériels peuvent compter de deux manières différentes, appelées '''mode une fois''' et '''mode périodique'''. * En mode une fois, le ''timer'' s'arrête une fois qu'il a atteint la limite configurée. On doit le réinitialiser manuellement, par l'intermédiaire du logiciel, pour l'utiliser une nouvelle fois. Cela permet de compter une certaine durée, exprimée en nombre de cycles d'horloge. * En mode périodique, le ''timer'' se réinitialise automatiquement avec la valeur de départ, ce qui fait qu'il reboucle à l'infini. Un ordinateur est rempli de ''timers'' divers. Dans ce qui va suivre, nous allons voir les principaux ''timers'', qui sont actuellement intégrés dans les PC modernes. Ils se trouvent sur la carte mère ou dans le processeur, tout dépend du ''timer''. ===Le ''watchdog timer''=== Le '''''watchdog timer''''' est un ''timer'' spécifique dont le but est de redémarrer automatiquement l'ordinateur si jamais celui-ci ne répond plus ou plante. Beaucoup de PC s'en passent, mais ce ''timer'' est très fréquent dans les architectures embarquées. Le ''watchdog timer'' est un compteur/décompteur qui doit être réinitialisé régulièrement. S'il n'est pas réinitialisé, le ''watchdog timer'' déborde (revient à 0 ou atteint 0) et envoie un signal qui redémarre le système. Le système est conçu pour réinitialiser le ''watchdog timer'' régulièrement, ce qui signifie que le système n'est pas censé redémarrer. Si jamais le système dysfonctionne gravement, le système ne pourra pas réinitialiser le ''watchdog timer'' et le système est redémarré automatiquement ou mis en arrêt. [[File:SimpleWatchdogTimer.gif|centre|vignette|upright=2|Le ''Watchdog Timer'' et l'ordinateur.]] ===Le ''Time Stamp Counter'' des processeurs x86=== Tous les processeurs des PC actuels sont des processeurs dits x86. Nous ne pouvons pas expliquer ce que cela signifie pour le moment, retenez juste ce terme. Sachez que tous les processeurs x86 contiennent un compteur de 64 bits, appelé le '''''Time Stamp Counter''''', qui mémorise le nombre de cycles d'horloge qu'a effectué le processeur depuis son démarrage. Les programmes peuvent accéder à ce registre assez facilement, ce qui est utile pour faire des mesures ou comparer les performances de deux applications. Il permet de compter combien de cycles d'horloge met un morceau de code à s’exécuter, combien de cycles prend une instruction à s’exécuter, etc. Les processeurs non-x86 ont un registre équivalent, que ce soit les processeurs ARM ou d'autres. Malheureusement, ce compteur est tombé en désuétude pour tout un tas de raisons. La principale est que les processeurs actuels font varier leur fréquence suivant les besoins. Ils augmentent leur fréquence quand on leur demande de faire beaucoup de calculs, et se mettent en mode basse(fréquence pour économiser de l'énergie si on ne leur demande pas grand chose. Avec une fréquence variable, le ''Time Stamp Counter'' perd complétement en fiabilité. Intel a tenté de corriger ce défaut en incrémentant ce registre à une fréquence constante, différente de celle du processeur, ce qui est encore le cas sur les processeurs Intel actuels. Le comportement est un peu différent sur les processeurs AMD, qui cadencent ce ''timer'' à la fréquence du processeur mais utilisent des mécanismes de synchronisation assez complexes pour corriger l'effet de la fréquence variable. ===L'horloge temps réel=== L''''horloge temps réel''' est un ''timer'' qui génère une fréquence de 1024 Hz, soit près d'un Kilohertz. Dans ce qui suit, nous la noterons RTC, ce qui est l'acronyme du terme anglais ''Real Time Clock''. La RTC prend en entrée un signal d'horloge de 32KHz, généré par un oscillateur à Quartz, et fournit en sortie un signal de fréquence 32 fois plus faible, c'est à dire de 1 KHz. Pour cela, elle est réglée en mode répétitif et son décompteur interne est initialisé à 32. La RTC génère donc un signal toutes les millisecondes, qui est envoyé au processeur. On peut, en théorie, changer la fréquence de la RTC, mais c'est rarement une bonne idée. En théorie, la RTC permet de compter des durées assez courtes, comme le ''ping'' (le temps de latence d'un réseau, pour simplifier), le temps de rafraichissement de l'écran, ou bien d'autres choses. Mais dans les faits, l'horloge temps réel sa fréquence n'aide pas : 1024 Hz est proche de 1000, mais pas assez pour faire des mesures à la milliseconde près, chose qui est nécessaire pour mesurer le ''ping'' ou d'autres choses utiles. A la place, l'ordinateur l'utilise pour que l'ordinateur soit toujours à l'heure. L'ordinateur sait quelle heure il est avec une précision de l'ordre de la seconde (vous pouvez regarder le bureau de Windows dans le coin inférieur droite de votre écran pour vous en convaincre). ===Le ''Programmable Interval Timer'' : l'Intel 8253=== L'Intel 8253 était un ''timer'' programmable autrefois soudé sur les cartes mères des premiers PC. Il fût suivi par l'Intel 8254, qui en était une légère amélioration. Il était cadencé par une horloge maitre, générée par un oscillateur à Quartz, dont la fréquence est de 32 768 Hertz, soit 2^15 cycles d'horloge par seconde. S'il n'est plus présent dans un boitier sur la carte mère, on trouve toujours un circuit semblable au 8253 à l'intérieur du ''chipset'' de la carte mère, voire à l'intérieur du processeur, pour des raisons de compatibilité. L'intérieur de l'Intel 8253 est illustré ci-dessous. Nous allons expliquer l'ensemble de ce schéma, rassurez-vous, mais les explications seront plus simples à comprendre si vous survolez ce schéma en premier lieu. [[File:Intel 8253 block diagram.svg|centre|vignette|upright=2|Intel 8253, intérieur.]] L'Intel 8253 contient trois compteurs de 16 bits, numérotés 0, 1 et 2. Pour chaque compteur, l'entrée CLOCK est celle de l'horloge de 32 MHz, l'entrée GATE active ou désactive le compteur, la sortie fournit le signal voulu et/ou la fréquence de sortie. Les trois compteurs étaient utilisés pour dériver plusieurs fréquences allant de 18,2 Hz à environ 500 KHz. Par exemple, il était utilisé par défaut pour le rafraichissement de la mémoire (D)RAM, mais il était souvent reprogrammé pour servir à générer des fréquences spécifiques par le BIOS ou la carte graphique. [[File:Intel 8253 and 8254.svg|vignette|Intel 8253 and 8254]] L'Intel 8253 lui-même possède plusieurs entrées et sorties. En premier lieu, on voit un port de 8 bits connecté aux trois compteurs, qui permet à l'Intel 8253 de communiquer avec le reste de l'ordinateur. La communication se fait dans les deux sens : soit de l'ordinateur vers les compteurs, soit des compteurs vers l'ordinateur. Dans le sens ordinateur -> compteurs, cela permet à l'ordinateur de programmer les compteurs, de les initialiser. Dans l'autre sens, cela permet de récupérer le contenu des compteurs, même si ce n'est pas très utilisé. Il y a aussi 5 entrées de configuration : * Deux bits A0 et A1 pour sélectionner le compteur voulu avec son numéro. * Un bit RD à mettre à 0 pour que l'ordinateur récupère le compteur sélectionné sur le port de 8 bits. * Un bit WR à mettre à 0 pour que l'ordinateur modifie le compteur sélectionné, en envoyant le nombre pour l'initialisation sur le port de 8 bits. * Un bit CS qui active ou désactive l'Intel 8253 et permet de l'allumer ou de l’éteindre. L'Intel 8253 intégre un registre de 8 bits, le ''Control Word register'' qui mémorise la configuration de l'Intel 8253. Pour programmer les trois compteurs, il faut écrire un mot de 8 bits dans ce ''Control Word register''. Pour écrire dans le ''Control Word register'', il faut mettre le bit CS à 0 (on active l'Intel 8253), mettre le bit RDà 1 , le bit WR à 0 le bit WR (on indique qu'on fait une écriture), sélectionner le ''Control Word register'' en mettant les deux bits A0 et A1 à 1, puis envoyer la configuration du ''Control Word register'' sur le port de 8 bits. ===Le ''High Precision Event Timer'' (HPET)=== De nos jours, l'horloge temps réel et l'Intel 8253/8254 tendent à être remplacé par un autre ''timer'', le ''High Precision Event Timer'' (HPET). Il s'agit d'un compteur de 64 bits, dont la fréquence est d'au moins 10 MHz. Il s'agit bien d'un compteur et non d'un décompteur. Il gère nativement plusieurs valeurs limites à laquelle générer un signal, qui sont configurables. Pour cela, il est couplé à plusieurs comparateurs, chacun associé à un registre pour mémoriser la valeur limite. Il doit y avoir au moins trois comparateurs/registres, mais le nombre peut monter jusqu’à 256. [[File:High Precision Event Timer.png|centre|vignette|upright=2|High Precision Event Timer]] Il faut noter que les systèmes d'exploitation conçus avant le HPET ne peuvent pas l'utiliser, pour des raisons de compatibilité matérielle. C'est le cas de Windows XP avant le Service Pack 3. C'est la raison pour laquelle les cartes mères émulent RTC et PIT dans leurs circuits. D'ailleurs, pour économiser des circuits, les cartes mères modernes émulent le PIT et la RTC avec le HPET : le premier comparateur fournisse la fréquence de 1024 Hz de la RTC, 3 autres comparateurs remplacent l'Intel 8253. Le HPET gère de nombreux modes de fonctionnement : ses comparateurs peuvent être configuré en mode une fois ou périodique, on peut lui demander d'émuler la RTC et le PIT, etc. Chaque comparateur doit pouvoir fonctionner en mode une fois, et au moins un comparateur doit pouvoir fonctionner en mode périodique. Aussi, il contient aussi 3 registres de configuration. Notons qu'il est aussi possible de lire ou écrire dans le compteur de 64 bits, mais ce n'est pas recommandé. ==Les compteurs utilisant des représentations non-classiques== Les compteurs classiques encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Nous allons voir dans ce qui suit deux types de compteurs : ceux qui comptent en code Gray, ceux qui comptent en représentation ''one-hot''. ===Les compteurs en code Gray=== Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Pour comparer, en binaire normal, lorsqu'on passe incrémente un nombre, il peut y avoir plusieurs bits qui changent. La moyenne est d'environ deux bits par incrémentation. Les compteurs en code Gray ont beaucoup d'avantages, qui sont tous liés à cette propriété. Le premier l'absence d'état transitoires douteux. Le problème est que les bits modifiés par une incrémentation ne le sont pas en même temps. Les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où seuls les bits de poids faibles ont été modifiés. C'est un problème si le contenu de ce compteur est relié à des circuits rapides, qui peuvent voir cet état transitoire, mais ne le doivent pas sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. S'il faut échanger des informations entre ces deux domaines d'horloge, divers problèmes surviennent. Un domaine d'horloge sera plus rapide que l'autre, et pourra voir les états transitoires invisible de l'autre circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, ce qui fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! Un autre avantage mineurs est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Et la majeure partie de cette consommation sert à faire passer un bit de 0 à 1 ou de 1 à 0. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. La moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray, on devine que ces derniers consomment deux fois moins d'énergie par incrémentation. Et cet avantage a des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié auxs transitions d'état douteuses. Les circuits connectés au compteur vont voir ces transitions d'état douteuses et modifier leur état interne en réaction. Bien sur, l'état final correct sera atteint une fois que le compteur sera stabilisé, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspond à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! ===Les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Un compteur ''one-hot'' de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. Pour 5 bits, la séquence est illustrée ci-dessous. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations, car nous en reparlerons dans la suite du cours. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les registres à décalage à rétroaction linéaire | nextText=Les registres à décalage à rétroaction linéaire }} </noinclude> 31d404a7qs2cbcnggp86uh0e2qlvnwb 768143 768142 2026-06-19T01:30:03Z Mewtow 31375 /* Les compteurs utilisant des représentations non-classiques */ 768143 wikitext text/x-wiki Les '''compteurs/décompteurs''' sont des circuits électroniques qui mémorisent un nombre et l'incrémentent à la demande. En clair, ce sont des registres améliorés afin de supporter l'incrémentation et la décrémentation. Pour donner un exemple d'utilisation, imaginez un circuit qui compte le nombre de voitures dans un parking dans la journée. Pour cela, vous allez prendre deux circuits qui détectent respectivement l'entrée ou la sortie d'une voiture, et un compteur. Le compteur est initialisé à 0 quand le parking est vide, puis est incrémenté à chaque entrée de voiture, décrémenté à chaque sortie. Les exemples de ce type sont suffisamment nombreux pour qu'on dédie un chapitre aux compteurs. [[File:Binary counter.gif|vignette|Illustration du fonctionnement d'un compteur modulaire binaire de 4 bits, avec un pas de compteur de 1 (le contenu est augmenté de 1 à chaque mise à jour).]] Un compteur mémorise un nombre qui est incrémenté ou décrémenté au besoin. Le nombre mémorisé sera appelé le '''décompte''' dans ce qui suit. Il est mémorisé dans un registre à l'intérieur du compteur. Au passage, le nombre de bits <math>n</math> du compteur est appelé la '''taille du compteur''', par analogie avec les registres. Il faut cependant faire la différence entre les ''compteurs'' d'un côté et les ''décompteurs'' de l'autre. Les compteurs incrémentent le décompte, les décompteurs le décrémentent, les compteurs-décompteurs peuvent faire les deux. ==L'interface d'un compteur/décompteur== Les compteurs et décompteurs sont des circuits synchrones et ont donc une entrée d'horloge. Les compteurs les plus simples incrémentent leur contenu à chaque cycle d'horloge, mais les plus fréquents n'incrémentent le décompte que sur demande. Pour cela, ils disposent d'une entrée '''''Count Enable''''', similaire à l'entrée ''Enable'' des registres, séparée de l'entrée d'horloge. Le décompte est incrémenté/décrémenté seulement si l'entrée Enable est à 1, lors d'un front adéquat sur le signal d'horloge. Les compteurs ont aussi une entrée '''''Reset''''' qui permet de les remettre à zéro. Il y a parfois une entrée qui permet d'initialiser le compteur à une valeur par défaut, non-nulle. Par exemple, on peut initialiser le décompte à la valeur 5, ou une autre. Pour cela, le compteur dispose de deux entrées : une entrée sur laquelle envoyer le décompte initial, une entrée pour autoriser la réinitialisation. Les entrées en question sont appelées '''''Preload Data''''' et '''''Preload Enable'''''. La seconde entrée est parfois distincte de l'entrée de réinitialisation, pour permettre de réinitialiser le compteur soit à zéro, soit à la valeur voulue. Il peut être utile de prévenir quand un débordement d'entier a lieu, à savoir quand le compteur n'a pas assez de bits pour encoder le décompte. Le compteur est alors remis à zéro, dans la plupart des cas. Mais il faut prévenir que le compteur a débordé, ce qui est utile pour fabriquer des circuits diviseurs de fréquence et des ''timers''. Pour cela, on ajoute une '''sortie de débordement''' au compteur, qui est mise à 1 quand le compteur déborde. Sur les compteurs/décompteurs, il y a une entrée '''''Count Direction''''' qui décide s'il faut compter ou décompter. Typiquement, elle est à 1 s'il faut compter et 0 s'il faut décompter. [[File:Digital counter signals.jpg|centre|vignette|upright=2|Interface d'un compteur-décompteur.]] Dans les schémas qui vont suivre, les entrées Enable ne sont pas représentées. Il est sous-entendu qu'il y a une entrée ''Enable'' pour tous les compteurs qui vont suivre. Il existe deux méthodes pour créer de tels compteurs : la première donne ce qu'on appelle des compteurs asynchrones, et l'autre des compteurs synchrones. ==L'intérieur d'un compteur== A une exception bien précise qu'on abordera plus bas, les compteurs sont composés d'un registre, qui mémorise le décompte, couplé à un circuit '''incrémenteur'''. Nous avions déjà abordé l'incrémenteur dans un chapitre précédent, aussi je ne vais pas ré-expliquer comment il est conçu. Tout ce qu'il faut retenir est qu'il y en a plusieurs types, le plus simple étant celui à propagation de retenue. [[File:Fonctionnement d'un compteur (décompteur), schématique.jpg|centre|vignette|upright=2|Fonctionnement d'un compteur (décompteur), schématique. Le pas du compteur précise de combien on incrémente le compteur par cycle d'horloge.]] L'incrémenteur le plus simple, à propagation de retenue, est fabriqué en enchainant des ''demi-additionneurs'' les uns à la suite des autres. Pour rappel, un demi-additionneur additionne deux bits. Ici, il additionne un bit de l'opérande, la retenue des colonnes précédentes. Pour le bit de poids faible, la retenue est forcé à 1. Si on combine un incrémenteur à propagation de retenue avec un registre, on obtient ce compteur : [[File:Compteur synchrone à incrémenteur.jpg|centre|vignette|upright=2|Compteur synchrone avec des bascules D.]] Il est possible d'optimiser le circuit avec les optimisations vues dans le chapitre sur les incrémenteurs. La première est le ''carry skip'' qui fait l'incrémentation non pas bit par bit, mais par paquets de deux bits. La seconde est l'anticipation de retenue. Et ces deux optimisations se marient bien avec ce qui va suivre. ===Les compteurs en cascade=== Il est possible de concevoir des compteurs à partir de compteurs plus petits, mis en cascade. Par exemple, en créant un compteur 16 bits à partir de compteurs 4 bits, enchainés l'un à la suite de l'autre. Les compteurs mis en cascade ont les mêmes entrées et sorties que les compteurs normaux, avec cependant un détail très important : ils ont une entrée pour la retenue entrante, et une sortie pour la retenue sortante. L'entrée pour la retenue entrante précise ce qui doit être additionné au bit de poids faible. Si elle vaut zéro, l'incrémenteur n'incrémente pas l'opérande. Si elle vaut 1, le compteur est incrémenté. L'entrée de retenue fait office d'entrée ''Count Enable'', qui active ou désactive l'incrémentation. Le compteur a aussi une sortie de débordement, qui indique que le compteur déborde. Il se trouve que cette sortie fournit la retenue pour le compteur suivant. La retenue est calculée en faisant un ET logique entre tous les bits du décompte. [[File:Cascadable binary up-counter.jpg|centre|vignette|upright=2|Cascadable binary up-counter]] Les compteurs sont mis en cascade de la manière suivante : leur sortie de débordement est connectée sur l'entrée ''Enable'' du compteur suivant, celle qui déclenche l'incrémentation du compteur. La sortie de débordement est notée RCO dans les schéma qui suivent, nous verrons pourquoi dans le prochaine paragraphe. [[File:Cascaded binary counters.jpg|centre|vignette|upright=2.5|Cascaded binary counters]] ===Les compteurs modulo=== La plupart des compteurs comptent de 0 à <math>2^n - 1</math>, avec <math>n</math> la taille du compteur. Mais d'autres compteurs ne comptent pas jusque-là : leur limite est plus basse que <math>2^n - 1</math>. Par exemple, certains compteurs ne comptent que jusqu'à 10, 150, etc. Ils sont appelés des '''compteurs ''modulo'''''. Prenons un compteur modulo 6, par exemple : il compte de 0 à 5, et est remis immédiatement à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Les compteurs ''modulo'' sont construits à partir d'un compteur normal, couplé à un circuit comparateur qui remet à zéro le registre quand il atteint la valeur maximale. Par exemple, on peut imaginer un compteur modulo 6, ce qui veut dire qu'il compte de 0 à 5. Il est construit à partir d'un compteur 4 bits qui compte de 0 à 15 (donc un compteur modulo 16), mais qui est remis à zéro quand il atteint 6. Il compte donc comme suit : 0, 1, 2, 3, 4, 5, 0, 1, 2, ... Le circuit comparateur vérifie si la valeur maximale 6 est atteinte et met à 1 l'entrée ''Reset'' si c'est le cas. Le comparateur est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Td4bfig4.png|centre|vignette|upright=2|Compteur modulo N.]] La valeur maximale d'un compteur ''modulo'' peut être configurable. Pour cela, le compteur est associé à un ''registre de configuration'' qui mémorise la valeur maximale souhaitée. A chaque cycle d'horloge, la valeur dans le compteur est comparée au registre de configuration. Si elles sont identiques, le compteur est remis à zéro. Le compteur est associé au registre de configuration et à un comparateur qui vérifie que les deux sont égaux. Pour le moment, nous ne savons pas faire de circuits comparateurs, ce qui fait qu'on ne peut pas expliquer ce circuit plus en détail. [[File:4 Bit Counter Prog 1.svg|centre|vignette|upright=2|Compteur 4 bits à valeur maximale programmable.]] Les compteurs ont tous une sortie de débordement, qui indique quand le compteur déborde. Pour les compteurs modulo, la sortie n'est autre que la sortie du comparateur. Pour les compteurs non-modulo, la sortie de débordement est une sortie du circuit combinatoire qui incrémente le compteur. ===Les mal-nommés ''compteurs asynchrones''=== Les '''compteurs asynchrones''' n'utilisent pas de circuit incrémenteur. A la place, ils sont fabriqués à partir d'un registre à décalage. Ils utilisent moins de portes logiques que les compteurs synchrones. Et ils ne sont pas forcément plus difficiles à comprendre. Précisons cependant qu'ils sont très mal nommés, à savoir que ce sont bien des circuits synchrones. Pour comprendre comment fonctionne un compteur asynchrone, il faut regarder la séquence des premiers entiers : * 000 ; * 001 ; * 010 ; * 011 ; * 100 ; * 101 ; * 110 ; * 111. Il faut remarquer que le bit de poids faible s'inverse à chaque cycle d'horloge. Pour les colonnes suivantes, le bit s'inverse quand le bit de la colonne précédente passe de 1 à 0, lors d'un front descendant sur la colonne précédente. Maintenant que l'on sait cela, on peut créer un compteur avec des bascules T (elles inversent leur contenu à chaque cycle d'horloge). La première colonne inverse son contenu à chaque cycle, elle correspond donc à une bascule T reliée directement à l'horloge. Les autres colonnes utilisent des bascules T activées sur front descendant. : Attention, la bascule la plus à gauche stocke le bit de poids faible, pas celui de poids fort. Cela sera pareil dans tous les schémas qui suivront. [[File:AsyncCounter Alternativ 2.svg|centre|vignette|upright=2|Compteur asynchrone de 4 bits.]] Le compteur précédent ne peut pas être réinitialisé, ce qui pose des problèmes pour implémenter des compteurs modulo. Pour cela, il faut que les bascules du compteur aient une entrée de réinitialisation ''Reset'', qui les force à se remettre à zéro. Il suffit alors de connecter ensemble les entrées ''Reset'' des bascules à l'entrée ''Reset'' du compteur. [[File:AsyncCounter mod 8 with RST .svg|centre|vignette|upright=2|Compteur réinitialisable.]] Implémenter un compteur modulo demande d'ajouter un comparateur qui détecte quand la valeur maximale est atteinte, afin de commander l'entrée de réinitialisation. Un tel circuit est juste un comparateur avec une constante, que vous savez déjà fabriquer à cet endroit du cours. [[File:Modulo-5-Zähler.svg|centre|vignette|upright=2|Compteur modulo 10.]] Il est aussi possible d'utiliser des bascules D à la place des bascules T simplifiées. En effet, une bascule T simplifiée est identique à une bascule D dont on boucle la sortie /Q sur l'entrée de données. Cette implémentation permet d'ailleurs de réinitialiser le compteur à une valeur non-nulle. Pour cela, l'entrée de chaque bascule D est précédée d'un multiplexeur, qui choisit entre le bit calculé par le compteur et celui présenté sur l'entrée de ré-initialisation. Quand l'entrée ''Reset'' est activée, les multiplexeurs connectent les bascules aux bits sur l'entrée de ré-initialisation. Dans le cas contraire, le compteur fonctionne normalement, les multiplexeurs connectant l'entrée de chaque bascule à sa sortie. [[File:Compteur asynchrone, avec initialisation.jpg|centre|vignette|upright=2|Compteur asynchrone, avec initialisation.]] Pour finir, la sortie de débordement n'est autre que la sortie de la dernière bascule, celle qui contient le bit de poids fort. ==Les ''timers'' : compter des durées, compter des cycles d'horloge== Les '''''timers''''', aussi appelés ''Programmable interval timer'', sont des circuits capables de compter des durées, exprimées en cycles d'horloge. Leur fonctionnement est assez simple : ils émettent un signal quand un certain nombre de cycles est écoulé, ce nombre de cycles étant configurable. On peut ainsi générer un signal qui surviendra après 50 cycles d'horloge, ou après 100 cycles d'horloge, etc. Le signal en question est disponible sur une sortie de 1 bit, et correspond tout simplement au fait que cette sortie est mise à 1, pendant un cycle d'horloge. Les ''timers'' sont composés d'un compteur/décompteur cadencé par un signal d'horloge. Le compteur initialisé à 0, puis est incrémenté à chaque signal d'horloge, jusqu’à atteinte d'une valeur limite où il génère un signal. Pour un décompteur, c'est la même chose, sauf que le décompteur est initialisé à sa valeur limite et est décrémenté à chaque cycle, et envoie un signal quand il atteint 0. Les ''timers'' basés sur des décompteurs sont nettement plus simples que les autres, ce qui fait qu'ils sont plus utilisés Pour que les ''timers'' soient configurables, on doit pouvoir préciser combien de cycles il faut (dé-)compter avant d'émettre un signal. On peut ainsi préciser s'il faut émettre le signal après 32 cycles d'horloge, après les 50 cycles, tous les 129 cycles, etc. Le nombre de cycles en question est envoyé sur une entrée d’initialisation du compteur. Les ''timers'' matériels peuvent compter de deux manières différentes, appelées '''mode une fois''' et '''mode périodique'''. * En mode une fois, le ''timer'' s'arrête une fois qu'il a atteint la limite configurée. On doit le réinitialiser manuellement, par l'intermédiaire du logiciel, pour l'utiliser une nouvelle fois. Cela permet de compter une certaine durée, exprimée en nombre de cycles d'horloge. * En mode périodique, le ''timer'' se réinitialise automatiquement avec la valeur de départ, ce qui fait qu'il reboucle à l'infini. Un ordinateur est rempli de ''timers'' divers. Dans ce qui va suivre, nous allons voir les principaux ''timers'', qui sont actuellement intégrés dans les PC modernes. Ils se trouvent sur la carte mère ou dans le processeur, tout dépend du ''timer''. ===Le ''watchdog timer''=== Le '''''watchdog timer''''' est un ''timer'' spécifique dont le but est de redémarrer automatiquement l'ordinateur si jamais celui-ci ne répond plus ou plante. Beaucoup de PC s'en passent, mais ce ''timer'' est très fréquent dans les architectures embarquées. Le ''watchdog timer'' est un compteur/décompteur qui doit être réinitialisé régulièrement. S'il n'est pas réinitialisé, le ''watchdog timer'' déborde (revient à 0 ou atteint 0) et envoie un signal qui redémarre le système. Le système est conçu pour réinitialiser le ''watchdog timer'' régulièrement, ce qui signifie que le système n'est pas censé redémarrer. Si jamais le système dysfonctionne gravement, le système ne pourra pas réinitialiser le ''watchdog timer'' et le système est redémarré automatiquement ou mis en arrêt. [[File:SimpleWatchdogTimer.gif|centre|vignette|upright=2|Le ''Watchdog Timer'' et l'ordinateur.]] ===Le ''Time Stamp Counter'' des processeurs x86=== Tous les processeurs des PC actuels sont des processeurs dits x86. Nous ne pouvons pas expliquer ce que cela signifie pour le moment, retenez juste ce terme. Sachez que tous les processeurs x86 contiennent un compteur de 64 bits, appelé le '''''Time Stamp Counter''''', qui mémorise le nombre de cycles d'horloge qu'a effectué le processeur depuis son démarrage. Les programmes peuvent accéder à ce registre assez facilement, ce qui est utile pour faire des mesures ou comparer les performances de deux applications. Il permet de compter combien de cycles d'horloge met un morceau de code à s’exécuter, combien de cycles prend une instruction à s’exécuter, etc. Les processeurs non-x86 ont un registre équivalent, que ce soit les processeurs ARM ou d'autres. Malheureusement, ce compteur est tombé en désuétude pour tout un tas de raisons. La principale est que les processeurs actuels font varier leur fréquence suivant les besoins. Ils augmentent leur fréquence quand on leur demande de faire beaucoup de calculs, et se mettent en mode basse(fréquence pour économiser de l'énergie si on ne leur demande pas grand chose. Avec une fréquence variable, le ''Time Stamp Counter'' perd complétement en fiabilité. Intel a tenté de corriger ce défaut en incrémentant ce registre à une fréquence constante, différente de celle du processeur, ce qui est encore le cas sur les processeurs Intel actuels. Le comportement est un peu différent sur les processeurs AMD, qui cadencent ce ''timer'' à la fréquence du processeur mais utilisent des mécanismes de synchronisation assez complexes pour corriger l'effet de la fréquence variable. ===L'horloge temps réel=== L''''horloge temps réel''' est un ''timer'' qui génère une fréquence de 1024 Hz, soit près d'un Kilohertz. Dans ce qui suit, nous la noterons RTC, ce qui est l'acronyme du terme anglais ''Real Time Clock''. La RTC prend en entrée un signal d'horloge de 32KHz, généré par un oscillateur à Quartz, et fournit en sortie un signal de fréquence 32 fois plus faible, c'est à dire de 1 KHz. Pour cela, elle est réglée en mode répétitif et son décompteur interne est initialisé à 32. La RTC génère donc un signal toutes les millisecondes, qui est envoyé au processeur. On peut, en théorie, changer la fréquence de la RTC, mais c'est rarement une bonne idée. En théorie, la RTC permet de compter des durées assez courtes, comme le ''ping'' (le temps de latence d'un réseau, pour simplifier), le temps de rafraichissement de l'écran, ou bien d'autres choses. Mais dans les faits, l'horloge temps réel sa fréquence n'aide pas : 1024 Hz est proche de 1000, mais pas assez pour faire des mesures à la milliseconde près, chose qui est nécessaire pour mesurer le ''ping'' ou d'autres choses utiles. A la place, l'ordinateur l'utilise pour que l'ordinateur soit toujours à l'heure. L'ordinateur sait quelle heure il est avec une précision de l'ordre de la seconde (vous pouvez regarder le bureau de Windows dans le coin inférieur droite de votre écran pour vous en convaincre). ===Le ''Programmable Interval Timer'' : l'Intel 8253=== L'Intel 8253 était un ''timer'' programmable autrefois soudé sur les cartes mères des premiers PC. Il fût suivi par l'Intel 8254, qui en était une légère amélioration. Il était cadencé par une horloge maitre, générée par un oscillateur à Quartz, dont la fréquence est de 32 768 Hertz, soit 2^15 cycles d'horloge par seconde. S'il n'est plus présent dans un boitier sur la carte mère, on trouve toujours un circuit semblable au 8253 à l'intérieur du ''chipset'' de la carte mère, voire à l'intérieur du processeur, pour des raisons de compatibilité. L'intérieur de l'Intel 8253 est illustré ci-dessous. Nous allons expliquer l'ensemble de ce schéma, rassurez-vous, mais les explications seront plus simples à comprendre si vous survolez ce schéma en premier lieu. [[File:Intel 8253 block diagram.svg|centre|vignette|upright=2|Intel 8253, intérieur.]] L'Intel 8253 contient trois compteurs de 16 bits, numérotés 0, 1 et 2. Pour chaque compteur, l'entrée CLOCK est celle de l'horloge de 32 MHz, l'entrée GATE active ou désactive le compteur, la sortie fournit le signal voulu et/ou la fréquence de sortie. Les trois compteurs étaient utilisés pour dériver plusieurs fréquences allant de 18,2 Hz à environ 500 KHz. Par exemple, il était utilisé par défaut pour le rafraichissement de la mémoire (D)RAM, mais il était souvent reprogrammé pour servir à générer des fréquences spécifiques par le BIOS ou la carte graphique. [[File:Intel 8253 and 8254.svg|vignette|Intel 8253 and 8254]] L'Intel 8253 lui-même possède plusieurs entrées et sorties. En premier lieu, on voit un port de 8 bits connecté aux trois compteurs, qui permet à l'Intel 8253 de communiquer avec le reste de l'ordinateur. La communication se fait dans les deux sens : soit de l'ordinateur vers les compteurs, soit des compteurs vers l'ordinateur. Dans le sens ordinateur -> compteurs, cela permet à l'ordinateur de programmer les compteurs, de les initialiser. Dans l'autre sens, cela permet de récupérer le contenu des compteurs, même si ce n'est pas très utilisé. Il y a aussi 5 entrées de configuration : * Deux bits A0 et A1 pour sélectionner le compteur voulu avec son numéro. * Un bit RD à mettre à 0 pour que l'ordinateur récupère le compteur sélectionné sur le port de 8 bits. * Un bit WR à mettre à 0 pour que l'ordinateur modifie le compteur sélectionné, en envoyant le nombre pour l'initialisation sur le port de 8 bits. * Un bit CS qui active ou désactive l'Intel 8253 et permet de l'allumer ou de l’éteindre. L'Intel 8253 intégre un registre de 8 bits, le ''Control Word register'' qui mémorise la configuration de l'Intel 8253. Pour programmer les trois compteurs, il faut écrire un mot de 8 bits dans ce ''Control Word register''. Pour écrire dans le ''Control Word register'', il faut mettre le bit CS à 0 (on active l'Intel 8253), mettre le bit RDà 1 , le bit WR à 0 le bit WR (on indique qu'on fait une écriture), sélectionner le ''Control Word register'' en mettant les deux bits A0 et A1 à 1, puis envoyer la configuration du ''Control Word register'' sur le port de 8 bits. ===Le ''High Precision Event Timer'' (HPET)=== De nos jours, l'horloge temps réel et l'Intel 8253/8254 tendent à être remplacé par un autre ''timer'', le ''High Precision Event Timer'' (HPET). Il s'agit d'un compteur de 64 bits, dont la fréquence est d'au moins 10 MHz. Il s'agit bien d'un compteur et non d'un décompteur. Il gère nativement plusieurs valeurs limites à laquelle générer un signal, qui sont configurables. Pour cela, il est couplé à plusieurs comparateurs, chacun associé à un registre pour mémoriser la valeur limite. Il doit y avoir au moins trois comparateurs/registres, mais le nombre peut monter jusqu’à 256. [[File:High Precision Event Timer.png|centre|vignette|upright=2|High Precision Event Timer]] Il faut noter que les systèmes d'exploitation conçus avant le HPET ne peuvent pas l'utiliser, pour des raisons de compatibilité matérielle. C'est le cas de Windows XP avant le Service Pack 3. C'est la raison pour laquelle les cartes mères émulent RTC et PIT dans leurs circuits. D'ailleurs, pour économiser des circuits, les cartes mères modernes émulent le PIT et la RTC avec le HPET : le premier comparateur fournisse la fréquence de 1024 Hz de la RTC, 3 autres comparateurs remplacent l'Intel 8253. Le HPET gère de nombreux modes de fonctionnement : ses comparateurs peuvent être configuré en mode une fois ou périodique, on peut lui demander d'émuler la RTC et le PIT, etc. Chaque comparateur doit pouvoir fonctionner en mode une fois, et au moins un comparateur doit pouvoir fonctionner en mode périodique. Aussi, il contient aussi 3 registres de configuration. Notons qu'il est aussi possible de lire ou écrire dans le compteur de 64 bits, mais ce n'est pas recommandé. ==Les compteurs utilisant des représentations binaires non-classiques== Les compteurs classiques encodent leur décompte en binaire normal sur <math>n</math> bits, mais il faut savoir que d'autres compteurs utilisent le BCD, d'autre le code Gray, etc. Nous allons voir dans ce qui suit deux types de compteurs : ceux qui comptent en code Gray, ceux qui comptent en représentation ''one-hot''. ===Les compteurs en code Gray=== Pour rappel, le code Gray permet de coder des nombres d'une manière un peu différente du binaire normal. Son avantage principal est que lorsqu'on incrémente ou décrémente un nombre, seul un bit change ! Pour comparer, en binaire normal, lorsqu'on passe incrémente un nombre, il peut y avoir plusieurs bits qui changent. La moyenne est d'environ deux bits par incrémentation. Les compteurs en code Gray ont beaucoup d'avantages, qui sont tous liés à cette propriété. Le premier l'absence d'état transitoires douteux. Le problème est que les bits modifiés par une incrémentation ne le sont pas en même temps. Les bits de poids faibles sont modifiés avant les autres. Évidemment, à la fin du calcul, on obtient le résultat final, correct. Mais pendant le temps de calcul, le compteur peut se retrouver dans un état transitoire, où seuls les bits de poids faibles ont été modifiés. C'est un problème si le contenu de ce compteur est relié à des circuits rapides, qui peuvent voir cet état transitoire, mais ne le doivent pas sous peine de dysfonctionner. L'usage de compteurs en code Gray permet d'éviter ce problème : vu que seul un bit est modifié lors d'une incrémentation/décrémentation, les états transitoires n'existent tout simplement pas. Un exemple typique, évoqué dans les chapitres précédents, est l'échange d'informations entre deux domaines d'horloge. Pour rappel, il arrive que deux portions d'un circuit imprimé aillent à des fréquences différences : on dit que le circuit à plusieurs domaines d'horloge. S'il faut échanger des informations entre ces deux domaines d'horloge, divers problèmes surviennent. Un domaine d'horloge sera plus rapide que l'autre, et pourra voir les états transitoires invisible de l'autre circuit. Et par voir, on veut dire qu'il les prendra pour des états valides, ce qui fera dysfonctionner le circuit. Pour éviter cela, diverses techniques de croisement de domaines d'horloge existent. Et les compteurs Gray en font partie : si un domaine d'horloge utilise la valeur d'un compteur de l'autre, mieux vaut que ce compteur soit un compteur Gray. Et cette situation est assez fréquente ! Un autre avantage mineurs est que la consommation d'énergie de ces compteurs est bien plus réduite qu'avec un compteur normal. Rappelons que pour fonctionner, les circuits électroniques consomment un peu d'électricité. Et la majeure partie de cette consommation sert à faire passer un bit de 0 à 1 ou de 1 à 0. Ce qui fait que quand un compteur est incrémenté ou décrémenté, cela consomme un peu d'énergie électrique. La moyenne pour un compteur binaire normal est de 2 bits changés par incrémentation/décrémentation, contre un seul pour un compteur Gray, on devine que ces derniers consomment deux fois moins d'énergie par incrémentation. Et cet avantage a des effets en cascade sur les circuits qui suivent ce compteur. Si l'entrée de ces circuits ne change que d'un seul bit, alors leur état changera moins que si c'était deux bits. Les circuits qui suivent vont donc moins consommer. Un autre avantage en matière de consommation énergétique est lié auxs transitions d'état douteuses. Les circuits connectés au compteur vont voir ces transitions d'état douteuses et modifier leur état interne en réaction. Bien sur, l'état final correct sera atteint une fois que le compteur sera stabilisé, ce qui effacera ces états transitoires intermédiaires. Mais chaque état intermédiaire transitoire correspond à un changement d'état, donc à une consommation d'énergie. En supprimant ces états transitoires, on réduit fortement la consommation d'énergie du circuit. Cela vaut pour le compteur Gray lui-même, mais aussi sur tous les circuits qui ont ce compteur comme entrée ! ===Les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Un compteur ''one-hot'' de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. Pour 5 bits, la séquence est illustrée ci-dessous. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations, car nous en reparlerons dans la suite du cours. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres et mémoires adressables | prevText=Les registres et mémoires adressables | next=Les registres à décalage à rétroaction linéaire | nextText=Les registres à décalage à rétroaction linéaire }} </noinclude> ntmkoh8yc941flwc4o3i9yhptbxdutt Fonctionnement d'un ordinateur/Les registres et mémoires adressables 0 78078 768125 762515 2026-06-19T01:06:01Z Mewtow 31375 /* L'implémentation des mémoires ROM */ 768125 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu comment mémoriser un bit, dans une bascule. Mais les bascules en elles-mêmes sont rarement utiles seules, car les données à mémoriser font généralement plusieurs bits, pas un seul. Stocker plusieurs bits est la raison d'être des '''registres''', des composants qui mémorisent des plusieurs bits, que l'on peut modifier et/ou récupérer plus tard. Il existe plusieurs types de registres, et nous allons faire la distinction entre les registres simples et les registres à décalage. Les registres simples sont capables de mémoriser un nombre, de taille fixe, rien de plus. Les registres à décalage sont des registres simples améliorés, capables de faire quelques petites opérations sur leur contenu. ==Les registres simples== Les '''registres simples''' sont capables de mémoriser un nombre, codé sur une quantité fixe de bits. On peut à tout moment récupérer le nombre mémorisé dans le registre : on dit alors qu'on effectue une lecture. On peut aussi mettre à jour le nombre mémorisé dans le registre, le remplacer par un autre : on dit qu'on effectue une écriture. Les seules opérations possibles sur ces registres sont la lecture (récupérer le nombre mémorisé dans le registre) et l'écriture (mettre à jour le nombre mémorisé dans le registre, le remplacer par un autre). ===L'interface d'un registre simple=== [[File:4 Bit Data Register.svg|vignette|Registre de 4 Bits. On voit que celui-ci contient 4 entrées (à gauche), et 4 sorties (à droite). On peut aussi remarquer une entrée CLK, qui joue le rôle d'entrée d'autorisation.]] Niveau entrées et sorties, les registres possèdent des entrées-sorties pour les données mémorisées, mais aussi des entrées-sorties de commande. Les entrées-sorties pour les données permettent de lire le contenu du registre ou d'y écrire. Les entrées de commande permettent de configurer le registre pour lui ordonner de faire une écriture, pour le remettre à zéro, ou toute autre opération. Les entrées de données sont utilisées pour l'écriture, alors que les sorties de données servent pour la lecture. Le nombre mémorisé dans le registre est disponible sur les sorties du registre. Pour utiliser les entrées d'écriture, on envoie le nombre à mémoriser (celui qui remplacera le contenu du registre) sur les entrées d'écriture et on configure les entrées de commande adéquates. Les entrées de commande varient suivant le registre, mais on trouve au moins une entrée Enable, qui a le même rôle que pour une bascule, à savoir autoriser une écriture. Si l'entrée Enable est à 1, le registre mémorise ce qu'il y a sur l'entrée de donnée. Mais si l'entrée Enable est à 0, le registre n'est pas mis à jour : on peut mettre n'importe quelle valeur sur les entrées, le registre n'en tiendra pas compte et ne remplacera pas son contenu par ce qu'il y a sur l'entrée. Pour résumer, l'entrée Enable sert donc à indiquer au registre si son contenu doit être mis à jour, quand une écriture a lieu. D'autres entrées de commandes sont parfois présentes, la plus commune étant une entrée permettant de remettre à zéro le registre. La présence d'un 1 sur cette entrée remet à zéro le contenu du registre, à savoir que celui-ci contient la valeur zéro. Enfin, il faut distinguer les registres synchrones des registres asynchrones. Les '''registres synchrones''' sont reliés au signal d’horloge. Pour cela, ils disposent d'une entrée d'horloge sur laquelle on envoie le signal d'horloge. Ils ne sont mis à jour que si on présente un front montant sur l'entrée d'horloge. Les '''registres asynchrones''' ne sont pas reliés au signal d'horloge et sont mis à jour quand on envoie ce qu'il faut sur leur entré Enable, rien de plus. ===L'intérieur d'un registre simple=== Un registre est composé de plusieurs bascules D qui sont toutes mises à jour en même temps. Cela vaut aussi bien pour les registres asynchrones que les registres synchrones. Pour cela, toutes les entrées E des bascules sont reliées à l'entrée de commande Enable. De plus, les registre synchrones envoient le signal d'horloge sur toutes les bascules. Avec un registre synchrone, toutes les bascules sont des bascules synchrones, qui ont toutes une entrée d'horloge, relié au signal d'horloge. [[File:Register.svg|centre|vignette|upright=3|Registre.]] ==Les registres à décalage== Les '''registres à décalage''' sont des registres dont le contenu est décalé d'un cran vers la gauche ou la droite sur commande. Nous aurons à les réutiliser plus tard dans ce cours, notamment dans la section sur les circuits de génération de nombres aléatoires, ou dans certains circuits liés au cache. Les registres à décalage sont presque tous synchrones et ce chapitre ne parlera que ce ces derniers. L'animation suivante illustre le fonctionnement d'un registre à décalage qui décale son contenu d'un cran vers la droite à chaque cycle d'horloge. [[File:4-Bit PISO Shift Register Seq.gif|centre|vignette|upright=2|Registre à décalage.]] ===La classification des registres=== On peut classer les registres selon le caractère de l'entrée et de la sortie, qui peut être parallèle (entrée de plusieurs bits) ou série (entrée d'un seul bit). * Sur les registres simples, les entrées et sorties pour les données sont toujours parallèles. Pour un registre de N bits, il y a une entrée d'écriture de N bits et une sortie de N bits. C'est la raison pour laquelle ils sont appelés des '''registres à entrées et sorties parallèles'''. * Sur les registres à '''entrée et sortie série''', on peut mettre à jour un bit à la fois, de même qu'on ne peut en récupérer qu'un à la fois. Ces registres servent essentiellement à mettre en attente des bits tout en gardant leur ordre : un bit envoyé en entrée ressortira sur la sortie après plusieurs commandes de mise à jour sur l'entrée Enable. * Les registres à décalage à '''entrée série et sortie parallèle''' sont similaires aux précédents : on peut ajouter un nouveau bit en commandant l'entrée Enable et les anciens bits sont alors décalés d'un cran. Par contre, on peut récupérer (lire) tous les bits en une seule fois. Ils permettent notamment de reconstituer un nombre qui est envoyé bit par bit sur un fil (un bus série). * Enfin, il reste les registres à '''entrée parallèle et sortie série'''. Ces registres sont utiles quand on veut transmettre un nombre sur un fil : on peut ainsi envoyer les bits un par un. [[File:Td5bfig1.png|centre|vignette|upright=2|Classification des registres à décalage.]] Pour résumer, on distingue quatre types de registres (à décalage ou non), qui portent les noms de PIPO, PISO, SIPO et SISO. Les noms peuvent sembler barbares, mais il y a une logique derrière ces termes.La lettre P est pour parallèle, la lettre S est pour série. La lettre I signifie ''Input'', ce qui veut dire entrée en anglais, la lettre O est pour ''Output'', la sortie en anglais. {|class="wikitable" |+ Classification des registres |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | PIPO (registre simple) | SIPO |- ! Sortie série | PISO | SISO |} ===L'intérieur d'un registre à décalage=== Tous les registres sont conçus en plaçant plusieurs bascules les unes à la suite des autres, que ce soit pour les registres simples ou les registres à décalage. La seule différence tient dans la manière dont les bascules sont reliées. Toutes les bascules sont reliées à l'entrée d'horloge, l'entrée Enable, l'entrée Reset, ou aux autres entrées de commandes. Mais c'est une autre paire de manche pour les entrées/sorties de données. Dans un registre simple, les bascules sont indépendantes et ne sont pas reliées entre elles. [[File:Register.svg|centre|vignette|upright=3|Registre simple.]] À l'inverse, dans les registres à décalage, il existe des connexions entre bascules. Plus précisément, les bascules sont reliées les unes à la suite des autres, elles forment une chaîne de bascules reliées deux à deux. Et les connexions entre bascules sont les mêmes que l'on parle d'un registre à décalage de type SIPO, PISO ou SISO. [[File:Shift-Register.svg|centre|vignette|upright=3|Exemple de registre à décalage]] Outre le fait que les bascules sont reliées de la même manière, les autres connexions sont les mêmes dans tous les registres. L'entrée d'horloge (non-représentée dans les schémas qui vont suivre) est envoyée à toutes les bascules. Même chose pour l'entrée Enable, qui est reliée aux entrées E de toutes les bascules. La différence entre ces registres tient dans les endroits où se trouvent les entrées et les sorties du registre. {| |+ Implémentation des registres avec des bascules. |- |[[File:Registre à entrée parallèle et sortie série.png|vignette|upright=2|Registre à entrée et sortie série.]] |[[File:Registre à lecture et écriture parallèle.png|vignette|upright=2|Registre à entrée et sortie parallèle.]] |- |[[File:Registre à entrée et sortie série.png|vignette|upright=2|Registre à entrée série et sortie parallèle.]] |[[File:Registre à entrée série et sortie parallèle.png|vignette|upright=2|Registre à entrée parallèle et sortie série.]] |} ==Une utilisation des registres : les bancs de registre== Maintenant que nous avons les registres, il est temps d'en montrer une utilisation assez intéressante. Nous allons combiner les registres avec des multiplexeurs/démultiplexeurs pour former une '''mémoire adressable'''. Plus précisément, nous allons voir les '''bancs de registre''', qui peuvent être vu comme un rassemblement de plusieurs registres. Mais ces registres ne sont pas assemblés pour obtenir un registre plus gros : par exemple, on peut fabriquer un registre de 32 bits à partir de 2 registres de 16 bits, ou de 4 registres de 8 bits. Ce n'est pas ce qui est fait sur les mémoires adressables, où les registres sont regroupés de manière à ce qu'il soit possible de sélectionner le registre qu'on veut consulter ou modifier. Pour préciser le registre à sélectionner, chacun d'entre eux se voit attribuer un nombre : l''''adresse'''. On peut comparer une adresse à un numéro de téléphone (ou à une adresse d'appartement) : chacun de vos correspondants a un numéro de téléphone et vous savez que pour appeler telle personne, vous devez composer tel numéro. Les adresses mémoires en sont l'équivalent pour les registres d'une mémoire adressable. Il existe des mémoires qui ne fonctionnent pas sur ce principe, mais passons : ce sera pour la suite. [[File:Adressage mémoire.png|centre|vignette|upright=2|Exemple : on demande à la mémoire de sélectionner le byte d'adresse 1002 et on récupère son contenu (ici, 17).]] ===L'intérieur d'un banc de registre=== Un banc de registre peut se fabriquer assez simplement : il suffit d'un ou de plusieurs multiplexeurs et de registres. Quand on présente l'adresse sur l'entrée de sélection du multiplexeur, celui-ci va connecter le registre demandé à la sortie (ou à l'entrée). [[File:Intérieur d'une mémoire RAM.png|centre|vignette|upright=2|Intérieur d'une RAM fabriquée avec des registres et des multiplexeurs.]] Voici ce que cela donne avec une RAM reliée à un bus de 1 bit, à savoir que chaque case mémoire ne contient que 1 bit, il y a un bit par adresse. Il s'agit d'un exemple bien trop simple pour avoir la moindre application pratique, mais c'est un exemple clairement pédagogique. L'entrée d'écriture est reliée à toutes les bascules, mais seule celle sélectionnée est écrite. Lors d'une lecture, l'adresse est envoyée au multiplexeur et la donnée lue sur sa sortie. Lors d'une écriture, c'est le démultiplexeur/décodeur qui est utilisé. Le décodeur active la bascule voulue, via son entrée d'horloge ou Enable. Le bit R/W précise qu'il faut effectuer une écriture. L'entrée d'écriture est alors recopiée dans la bascule sélectionnée. [[File:MemWrite.png|centre|vignette|upright=2|Intérieur d'une RAM de 4 bits, reliée à un bus de 1 bit, fabriquée avec des registres et des multiplexeurs.]] ===L'interface d'un banc de registre=== [[File:RAM 8x4 symbol.svg|vignette|Interface d'une SRAM.]] Niveau entrées et sorties, un banc de registre contient des entrées-sorties dédiées aux transferts de données et plusieurs entrées de commande. Les entrées de commande permettent de configurer la mémoire pour effectuer une lecture ou écriture, la mettre en veille, ou autre. Parmi les entrées de commande, on trouve une entrée de plusieurs bits, sur laquelle on peut envoyer l'adresse, appelée l'entrée d'adressage. On trouve aussi une entrée R/W d'un bit, qui permet de préciser si on veut faire une lecture ou une écriture. On trouve aussi parfois une entrée ''Enable'' Ou ''Chip Select'', qui indique si la RAM est activée ou mise en veille, qui ressemble à l'entrée ''Enable'' des bascules. Pour les données, tout dépend du banc de registre considéré. Sur certains bancs de registre, on trouve une sortie sur laquelle on peut récupérer le registre sélectionné (on dit qu'on lit le registre) et une entrée sur laquelle on peut envoyer une donnée destinée à être écrite dans le registre sélectionné (on dit qu'on écrit le registre). On a donc une sortie pour la lecture et une entrée pour l'écriture. Mais sur d'autres bancs de registre, l'entrée et la sortie sont fusionnées en une seule entrée-sortie. Et d'autres bancs de registre ont au contraire plusieurs sorties de lecture. Rien de bien compliqué à cela : il suffit d'ajouter plusieurs multiplexeurs, au lieu d'un seul. Il suffit d'un multiplexeur par sortie de lecture. ==Les mémoire mortes et mémoires vives== Les bancs de registres sont un sous-type de '''mémoire SRAM'''. Formellement, les mémoires SRAM sont des mémoires similaires aux bancs de registre, la différence étant que les bascules ne sont pas fabriquées avec des portes logiques, mais avec des transistors. Mais pour le reste, la conception reste sensiblement la même. Les SRAM sont composées de bascules de 1 bit, assemblées en "pseudo-registres", elles mêmes reliées à des multiplexeurs/démultiplexeurs. Elles sont très utilisées, surtout dans les processeurs. Les mémoires sont très diverses et les mémoires SRAM ne sont qu'un type de mémoires parmi tant d'autres. Les mémoires SRAM font elles-mêmes partie de la catégorie des mémoires vives, aussi appelées '''mémoires RAM''' (bien que ce soit un abus de langage, comme on le verra dans plusieurs chapitres). De telles mémoires sont des mémoires électroniques, qui sont adressables, dans lesquelles on peut lire et écrire. Nous verrons les différents types de RAM dans les chapitres sur les mémoires, aussi nous allons mettre cela de côté pour le moment. Outre les mémoires RAM, il existe des mémoires qui sont elles aussi électroniques, adressables, mais dans lesquelles on ne peut pas écrire : ce sont les '''mémoires ROM'''. En général, les mémoires ROM conservent leur contenu quand on coupe l’alimentation électrique. Si on éteint l'ordinateur, le contenu de la ROM n'est pas perdu, il reste le même. C'est l'exact inverse de ce qu'on a avec les registres, mémoires SRAM, bascules et autres : tout est effacé quand on coupe le courant. Les mémoires RAM sont dites volatiles, alors que les mémoires ROM sont dites non-volatiles. ===Les mémoires ROM=== Il existe deux types de mémoires ROM : les ROM non-programmables et les ROM programmables. La différence est que les premières sont fournies telles quelle et qu'on ne peut pas changer leur contenu, alors que ce n'est pas le cas pour les secondes. Les ROM programmables sont des ROM dans lesquelles on ne peut évidemment pas écrire, mais qui permettent cependant de réécrire intégralement leur contenu : on dit qu'on reprogramme la ROM. Insistons sur la différence entre reprogrammation et écriture : l'écriture permet de modifier un byte sélectionné/adressé, alors que la reprogrammation efface toute la mémoire et la réécrit en totalité. Ce terme de programmation vient du fait que les mémoires ROM sont souvent utilisées pour stocker des programmes sur certains ordinateurs assez simples. Les mémoires non-programmables sont aussi appelées des '''''mask'' ROM'''. Elles sont utilisées dans quelques applications particulières, pour lesquelles on n'a pas besoin de changer leur contenu. Par exemple, elles étaient utilisées sur les vieilles consoles de jeux, pour stocker le jeu vidéo dans les cartouches. Elles servent aussi pour les ''firmware'' divers et variés, comme le ''firmware'' d'une imprimante ou d'une clé USB. De telles mémoires seront utiles dans les chapitres qui vont suivre. La raison en est que tout circuit combinatoire peut être remplacé par une mémoire adressable ! Imaginons que l'on souhaite créer un circuit combinatoire qui pour toute entrée A fournisse la sortie B. Celui-ci est équivalent à une ROM dont la lecture de l'adresse A renvoie B sur la sortie. Cette logique est notamment utilisée dans certains circuits programmables, les FPGA, comme on le verra plus tard. ===L'implémentation des mémoires ROM=== Les mémoires ROM sont conçues, sur le même principe que les mémoires SRAM : on combine des registres avec des multiplexeurs. Il y a cependant des différences importantes, liées au fait que les écritures sont interdites. Et il y a une grosse différence suivant que la mémoire soit reprogrammable ou non. Si la mémoire est reprogrammable, la différence principale est que les registres sont conçus de manière à ne pas être effacés quand on coupe le courant. Ils ne sont pas fabriqués avec des bascules, mais avec d'autres circuits plus complexes, à base de transistors à grille flottante. Les bascules sont remplacés par un équivalent qui se comporte de la même manière, sauf qu'on ne peut pas changer leur contenu facilement (interdiction des écritures), et que leur contenu ne s'efface pas quand on coupe le courant. Il peut y avoir d'autres différences, mais nous verrons cela dans le chapitre dédié aux mémoires ROM. Quant aux ''mask'' ROM, leur implémentation est beaucoup plus simple. Ils sont conçus sur le même principe que les SRAM. Sauf que vu que l'écriture et la reprogrammation sont interdites, on peut retirer les démultiplexeurs utilisés pour les écritures (et la reprogrammation). Quand aux registres, ils sont remplacés en connectant directement la tension d'alimentation ou la masse sur les entrées des multiplexeurs de lecture. Là où on veut mettre un 0, on connecte la masse. Là où on veut mettre un 1, on connecte la tension d'alimentation. Le circuit obtenu se simplifie alors et peut se remplacer par un circuit composé d'un décodeur connecté à un paquet de portes OU. [[File:Rom simpel.png|centre|vignette|upright=2|Mémoire ROM simple.]] L'implémentation d'une ''mask'' ROM est en réalité plus complexe sur certains points, notamment l'implémentation des portes OU, qui sont en réalité des OU câblés comme vu dans le chapitre sur les circuits imprimés. Mais nous reverrons cela dans quelques chapitres. L'important est que vous reteniez ce qu'est une mémoire ROM, qui n'est qu'un cas particulier de circuit combinatoire. Nous aurons à utiliser des mémoires ROM dans les chapitres suivants, à quelques endroits bien précis. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits synchrones et asynchrones | prevText=Les circuits synchrones et asynchrones | next=Les compteurs et timers | nextText=Les compteurs et timers }} </noinclude> 86jfabjjpj8yrf4xx2go7s2d46m7iqw Fonctionnement d'un ordinateur/Les registres à décalage à rétroaction linéaire 0 79341 768064 748934 2026-06-18T16:51:17Z Mewtow 31375 768064 wikitext text/x-wiki Dans le chapitre précédent, nous avons abordé les compteurs, des circuits qui mémorisent un nombre et l'incrémentent au besoin. Dans ce chapitre, nous allons voir d'autres circuits compteurs, bien différents de ceux du chapitre précédent. Ils ne comptent pas au sens commun du terme. A la place, ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle. Pour l'anecdote, le processeur Intel 8008, le tout premier microprocesseur 8 bits commercialisé, a utilisé ce genre de compteurs pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. : Pour les connaisseurs qui veulent en savoir plus, voici un article de blog sur le sujet : [https://www.righto.com/2017/03/analyzing-vintage-8008-processor-from.html#fnref:shift Analyzing the vintage 8008 processor from die photos: its unusual counters]. De tels compteurs sont souvent basés sur un registre à décalage. Aussi, avant de poursuivre, je préfére faire un rappel sur les types de registre à décalage. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | PIPO || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. À l'exception de certains compteurs one-hot qui seront vu juste après, ces compteurs sont des compteurs à rétroaction. Un terme bien barbare pour dire que l'on boucle leur sortie sur leur entrée, parfois en insérant un circuit combinatoire entre les deux. Ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. En conséquence, on peut les réinitialiser, mais pas insérer une valeur dans le compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. ==Les compteurs en anneau et de Johnson (SISO)== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un ''compteur one-hot''. La seconde possibilité, où le bit sortant est inversé, donne un compteur de Johnson. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ===Les compteurs en anneau : les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ===Les compteurs de Johnson : les compteurs unaires=== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. [[File:A simple sinusoid generator.jpg|centre|vignette|upright=2.5|Générateur de sinusoïde avec un compteur de Johnson.]] ===Les registres à décalage à rétroaction=== Les '''compteurs à rétroaction''' sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur=== Un compteur est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==La génération de nombres pseudo-aléatoires== Les compteurs peuvent aussi être utilisés pour générer des nombres "aléatoires". Je dis aléatoires entre guillemets car ils ne sont pas vraiment aléatoires, mais s'en rapprochent suffisamment pour être considérés comme tels. Pour mettre en avant cela, on parle aussi de nombres "pseudo-aléatoires". De nombreuses situations demandent de générer des nombres pseudo-aléatoire de manière matérielle. Cela peut servir pour sélectionner une ligne de cache à remplacer lors d'un défaut de cache, pour implémenter des circuits cryptographiques, pour calculer la durée d'émission sur un bus Ethernet à la suite d'une collision, et j'en passe. Les méthodes que nous allons voir produisent un nombre pseudo-aléatoire un bit à la fois, à quelques exceptions près. Les circuits que nous allons voir fournissent un bit sur leur sortie et ce bit varie de manière assez aléatoire. Les bits en sortie du circuit sont accumulés dans un registre à décalage normal, pour former un nombre aléatoire. Nous appellerons ce registre : l'accumulateur. ===L'usage de registres à décalage à rétroaction=== [[File:Nonlinear-combo-generator.png|thumb|Nonlinear-combo-generator]] La première solution utilise des ''registres à décalages à rétroaction'', les fameux LSFR du chapitre précédent. Un LSFR seul ne fournit pas un aléatoire digne de ce nom, mais il est possible de combiner plusieurs LSFR pour obtenir une meilleure approximation de l'aléatoire. Avec cette technique, plusieurs registres à décalages à rétroaction sont reliés à un circuit combinatoire non-linéaire. Ce circuit prendra en entrée un (ou plusieurs) bit de chaque registre à décalage à rétroaction, et combinera ces bits pour fournir un bit de sortie. [[File:A5-1 GSM cipher.svg|centre|thumb|upright=2|Exemple avec trois LSFR différents, de taille différentes : le bit envoyé à l'accumulateur est un XOR du bit sortant des trois LSFR.]] Pour rendre le tout encore plus aléatoire, il est possible de cadencer les LSFR à des fréquences différentes. Cette technique est utilisée dans les générateurs ''stop-and-go'', ''alternative step'', et à ''shrinking''. * Le générateur ''alternative step'' utilise trois LSFR. Le premier commande un multiplexeur qui choisit la sortie parmi les deux restants. * Le générateur ''stop-and-go'' utilise deux LSFR. Le premier est relié à l'entrée d'horloge du second et le bit de sortie du second est utilisé comme résultat. Une technique similaire était utilisée dans les processeurs VIA C3, pour l'implémentation de leurs instructions cryptographiques. * Le ''shrinking generator'' utilise deux LSFR cadencés à des vitesses différentes. Si le bit de sortie du premier vaut 1, alors le bit de sortie du second est utilisé comme résultat. Par contre, si le bit de sortie du premier vaut 0, aucun bit n'est fourni en sortie, le bit de sortie du second registre est oublié. ===L'aléatoire généré par des ''timers'' ou des compteurs d'horloge=== Au-delà des LSFR, il est possible d'utiliser des compteurs pour générer du pseudo-aléatoire. Par exemple, une technique très simple utilise un simple ''timer''. Si on a besoin d'un nombre pseudo-aléatoire, il suffit de lire le ''timer'' et d'utiliser le nombre lu comme nombre pseudo-aléatoire. Si le délai entre deux demandes est irrégulier, le résultat semblera aléatoire. Mais il s'agit là d'une technique assez peu fiable dans le monde réel et seules quelques applications bien spécifiques se satisfont de cette méthode. Une solution un peu plus fiable utilise ce qu'on appelle la '''dérive de l'horloge'''. Il faut savoir qu'un signal d'horloge n'est jamais vraiment très précis. Une horloge censée tourner à 1 Ghz ne tournera pas en permanence à 1Ghz exactement, mais verra sa fréquence varier de quelques Hz ou Khz de manière irrégulière. Ces variations peuvent venir de variations aléatoires de température, des variations de tension, des perturbations électromagnétiques, ou à des phénomènes assez compliqués qui peuvent se produire dans tout circuit électrique (comme le ''shot noise''). L'idée la plus simple utilise deux horloges : une horloge lente et une horloge rapide, dont la fréquence est un multiple de l'autre. Par exemple, on peut choisir une fréquence de 1 Mhz et une autre de 100 Hz : la fréquence la plus grande est égale à 10000 fois l'autre. La dérive d'horloge fera son œuvre, les deux horloges seront très légèrement désynchronisées en permanence, et cette désynchronisation peut être utilisée pour produire des nombres aléatoires. Par exemple, on peut compter le nombre de cycles d'horloge produit par l'horloge rapide durant une période de l'horloge lente. Si ce nombre est pair, on produit un bit aléatoire qui vaut 1 , il vaut 0 si ce nombre est pair. Pour information, c'est exactement cette technique qui était utilisée dans l'''Intel 82802 Firmware Hub''. ===L'aléatoire généré par la tension d'alimentation=== Il existe d'autres solutions matérielles qui utilisent le bruit thermique. Tous les circuits électroniques de l'univers sont soumis à de microscopiques variations de température, dues à l'agitation thermique des atomes. Plus la température est élevée, plus les atomes qui composent les fils métalliques des circuits s'agitent. Vu que les particules d'un métal contiennent des charges électriques, ces vibrations font naître des variations de tensions assez infimes. Il suffit d'amplifier ces variations pour obtenir un résultat capable de représenter un zéro ou un 1. Ce principe a été utilisé sur des anciens processeurs Intel qui géraient l'instruction RDRAND, une instruction qui produisait un nombre aléatoire. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits compteurs et décompteurs | prevText=Les circuits compteurs et décompteurs | next=Les circuits de décalage et de rotation | nextText=Les circuits de décalage et de rotation }} </noinclude> ed70578gz8f5jxw3oghmpx2l7r47w50 768065 768064 2026-06-18T16:51:55Z Mewtow 31375 768065 wikitext text/x-wiki Dans le chapitre précédent, nous avons abordé les compteurs, des circuits qui mémorisent un nombre et l'incrémentent au besoin. Dans ce chapitre, nous allons voir d'autres circuits compteurs, bien différents de ceux du chapitre précédent. Ils ne comptent pas au sens commun du terme. A la place, ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle. Pour l'anecdote, le processeur Intel 8008, le tout premier microprocesseur 8 bits commercialisé, a utilisé ce genre de compteurs pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. De tels compteurs sont souvent basés sur un registre à décalage. Aussi, avant de poursuivre, je préfére faire un rappel sur les types de registre à décalage. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | PIPO || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. À l'exception de certains compteurs one-hot qui seront vu juste après, ces compteurs sont des compteurs à rétroaction. Un terme bien barbare pour dire que l'on boucle leur sortie sur leur entrée, parfois en insérant un circuit combinatoire entre les deux. Ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. En conséquence, on peut les réinitialiser, mais pas insérer une valeur dans le compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. ==Les compteurs en anneau et de Johnson (SISO)== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un ''compteur one-hot''. La seconde possibilité, où le bit sortant est inversé, donne un compteur de Johnson. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ===Les compteurs en anneau : les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ===Les compteurs de Johnson : les compteurs unaires=== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. [[File:A simple sinusoid generator.jpg|centre|vignette|upright=2.5|Générateur de sinusoïde avec un compteur de Johnson.]] ===Les registres à décalage à rétroaction=== Les '''compteurs à rétroaction''' sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur=== Un compteur est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==La génération de nombres pseudo-aléatoires== Les compteurs peuvent aussi être utilisés pour générer des nombres "aléatoires". Je dis aléatoires entre guillemets car ils ne sont pas vraiment aléatoires, mais s'en rapprochent suffisamment pour être considérés comme tels. Pour mettre en avant cela, on parle aussi de nombres "pseudo-aléatoires". De nombreuses situations demandent de générer des nombres pseudo-aléatoire de manière matérielle. Cela peut servir pour sélectionner une ligne de cache à remplacer lors d'un défaut de cache, pour implémenter des circuits cryptographiques, pour calculer la durée d'émission sur un bus Ethernet à la suite d'une collision, et j'en passe. Les méthodes que nous allons voir produisent un nombre pseudo-aléatoire un bit à la fois, à quelques exceptions près. Les circuits que nous allons voir fournissent un bit sur leur sortie et ce bit varie de manière assez aléatoire. Les bits en sortie du circuit sont accumulés dans un registre à décalage normal, pour former un nombre aléatoire. Nous appellerons ce registre : l'accumulateur. ===L'usage de registres à décalage à rétroaction=== [[File:Nonlinear-combo-generator.png|thumb|Nonlinear-combo-generator]] La première solution utilise des ''registres à décalages à rétroaction'', les fameux LSFR du chapitre précédent. Un LSFR seul ne fournit pas un aléatoire digne de ce nom, mais il est possible de combiner plusieurs LSFR pour obtenir une meilleure approximation de l'aléatoire. Avec cette technique, plusieurs registres à décalages à rétroaction sont reliés à un circuit combinatoire non-linéaire. Ce circuit prendra en entrée un (ou plusieurs) bit de chaque registre à décalage à rétroaction, et combinera ces bits pour fournir un bit de sortie. [[File:A5-1 GSM cipher.svg|centre|thumb|upright=2|Exemple avec trois LSFR différents, de taille différentes : le bit envoyé à l'accumulateur est un XOR du bit sortant des trois LSFR.]] Pour rendre le tout encore plus aléatoire, il est possible de cadencer les LSFR à des fréquences différentes. Cette technique est utilisée dans les générateurs ''stop-and-go'', ''alternative step'', et à ''shrinking''. * Le générateur ''alternative step'' utilise trois LSFR. Le premier commande un multiplexeur qui choisit la sortie parmi les deux restants. * Le générateur ''stop-and-go'' utilise deux LSFR. Le premier est relié à l'entrée d'horloge du second et le bit de sortie du second est utilisé comme résultat. Une technique similaire était utilisée dans les processeurs VIA C3, pour l'implémentation de leurs instructions cryptographiques. * Le ''shrinking generator'' utilise deux LSFR cadencés à des vitesses différentes. Si le bit de sortie du premier vaut 1, alors le bit de sortie du second est utilisé comme résultat. Par contre, si le bit de sortie du premier vaut 0, aucun bit n'est fourni en sortie, le bit de sortie du second registre est oublié. ===L'aléatoire généré par des ''timers'' ou des compteurs d'horloge=== Au-delà des LSFR, il est possible d'utiliser des compteurs pour générer du pseudo-aléatoire. Par exemple, une technique très simple utilise un simple ''timer''. Si on a besoin d'un nombre pseudo-aléatoire, il suffit de lire le ''timer'' et d'utiliser le nombre lu comme nombre pseudo-aléatoire. Si le délai entre deux demandes est irrégulier, le résultat semblera aléatoire. Mais il s'agit là d'une technique assez peu fiable dans le monde réel et seules quelques applications bien spécifiques se satisfont de cette méthode. Une solution un peu plus fiable utilise ce qu'on appelle la '''dérive de l'horloge'''. Il faut savoir qu'un signal d'horloge n'est jamais vraiment très précis. Une horloge censée tourner à 1 Ghz ne tournera pas en permanence à 1Ghz exactement, mais verra sa fréquence varier de quelques Hz ou Khz de manière irrégulière. Ces variations peuvent venir de variations aléatoires de température, des variations de tension, des perturbations électromagnétiques, ou à des phénomènes assez compliqués qui peuvent se produire dans tout circuit électrique (comme le ''shot noise''). L'idée la plus simple utilise deux horloges : une horloge lente et une horloge rapide, dont la fréquence est un multiple de l'autre. Par exemple, on peut choisir une fréquence de 1 Mhz et une autre de 100 Hz : la fréquence la plus grande est égale à 10000 fois l'autre. La dérive d'horloge fera son œuvre, les deux horloges seront très légèrement désynchronisées en permanence, et cette désynchronisation peut être utilisée pour produire des nombres aléatoires. Par exemple, on peut compter le nombre de cycles d'horloge produit par l'horloge rapide durant une période de l'horloge lente. Si ce nombre est pair, on produit un bit aléatoire qui vaut 1 , il vaut 0 si ce nombre est pair. Pour information, c'est exactement cette technique qui était utilisée dans l'''Intel 82802 Firmware Hub''. ===L'aléatoire généré par la tension d'alimentation=== Il existe d'autres solutions matérielles qui utilisent le bruit thermique. Tous les circuits électroniques de l'univers sont soumis à de microscopiques variations de température, dues à l'agitation thermique des atomes. Plus la température est élevée, plus les atomes qui composent les fils métalliques des circuits s'agitent. Vu que les particules d'un métal contiennent des charges électriques, ces vibrations font naître des variations de tensions assez infimes. Il suffit d'amplifier ces variations pour obtenir un résultat capable de représenter un zéro ou un 1. Ce principe a été utilisé sur des anciens processeurs Intel qui géraient l'instruction RDRAND, une instruction qui produisait un nombre aléatoire. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits compteurs et décompteurs | prevText=Les circuits compteurs et décompteurs | next=Les circuits de décalage et de rotation | nextText=Les circuits de décalage et de rotation }} </noinclude> b4bgbtei2bgov7d2w0gw6irnjnmp1qk 768066 768065 2026-06-18T16:54:23Z Mewtow 31375 768066 wikitext text/x-wiki Dans le chapitre précédent, nous avons abordé les compteurs, des circuits qui mémorisent un nombre et l'incrémentent au besoin. Dans ce chapitre, nous allons voir d'autres circuits compteurs, bien différents de ceux du chapitre précédent. Ils ne comptent pas au sens commun du terme. A la place, ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Pour l'anecdote, le processeur Intel 8008, le tout premier microprocesseur 8 bits commercialisé, a utilisé ce genre de compteurs pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. De tels compteurs sont souvent basés sur un registre à décalage. L'idée est de boucler la sortie du registre à décalage sur sont entrée, parfois en insérant un circuit combinatoire entre les deux. C'est ce qui leur a valu le nom de '''compteurs à rétroaction''', un terme bien barbare pour dire que l'entrée est bouclée sur la sortie. Avant de poursuivre, je préfère faire un rappel sur les types de registre à décalage. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | PIPO || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. ==Les compteurs en anneau et de Johnson (SISO)== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un ''compteur one-hot''. La seconde possibilité, où le bit sortant est inversé, donne un compteur de Johnson. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ===Les compteurs en anneau : les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ===Les compteurs de Johnson : les compteurs unaires=== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. [[File:A simple sinusoid generator.jpg|centre|vignette|upright=2.5|Générateur de sinusoïde avec un compteur de Johnson.]] ===Les registres à décalage à rétroaction=== Les '''compteurs à rétroaction''' sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur=== Un compteur est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==La génération de nombres pseudo-aléatoires== Les compteurs peuvent aussi être utilisés pour générer des nombres "aléatoires". Je dis aléatoires entre guillemets car ils ne sont pas vraiment aléatoires, mais s'en rapprochent suffisamment pour être considérés comme tels. Pour mettre en avant cela, on parle aussi de nombres "pseudo-aléatoires". De nombreuses situations demandent de générer des nombres pseudo-aléatoire de manière matérielle. Cela peut servir pour sélectionner une ligne de cache à remplacer lors d'un défaut de cache, pour implémenter des circuits cryptographiques, pour calculer la durée d'émission sur un bus Ethernet à la suite d'une collision, et j'en passe. Les méthodes que nous allons voir produisent un nombre pseudo-aléatoire un bit à la fois, à quelques exceptions près. Les circuits que nous allons voir fournissent un bit sur leur sortie et ce bit varie de manière assez aléatoire. Les bits en sortie du circuit sont accumulés dans un registre à décalage normal, pour former un nombre aléatoire. Nous appellerons ce registre : l'accumulateur. ===L'usage de registres à décalage à rétroaction=== [[File:Nonlinear-combo-generator.png|thumb|Nonlinear-combo-generator]] La première solution utilise des ''registres à décalages à rétroaction'', les fameux LSFR du chapitre précédent. Un LSFR seul ne fournit pas un aléatoire digne de ce nom, mais il est possible de combiner plusieurs LSFR pour obtenir une meilleure approximation de l'aléatoire. Avec cette technique, plusieurs registres à décalages à rétroaction sont reliés à un circuit combinatoire non-linéaire. Ce circuit prendra en entrée un (ou plusieurs) bit de chaque registre à décalage à rétroaction, et combinera ces bits pour fournir un bit de sortie. [[File:A5-1 GSM cipher.svg|centre|thumb|upright=2|Exemple avec trois LSFR différents, de taille différentes : le bit envoyé à l'accumulateur est un XOR du bit sortant des trois LSFR.]] Pour rendre le tout encore plus aléatoire, il est possible de cadencer les LSFR à des fréquences différentes. Cette technique est utilisée dans les générateurs ''stop-and-go'', ''alternative step'', et à ''shrinking''. * Le générateur ''alternative step'' utilise trois LSFR. Le premier commande un multiplexeur qui choisit la sortie parmi les deux restants. * Le générateur ''stop-and-go'' utilise deux LSFR. Le premier est relié à l'entrée d'horloge du second et le bit de sortie du second est utilisé comme résultat. Une technique similaire était utilisée dans les processeurs VIA C3, pour l'implémentation de leurs instructions cryptographiques. * Le ''shrinking generator'' utilise deux LSFR cadencés à des vitesses différentes. Si le bit de sortie du premier vaut 1, alors le bit de sortie du second est utilisé comme résultat. Par contre, si le bit de sortie du premier vaut 0, aucun bit n'est fourni en sortie, le bit de sortie du second registre est oublié. ===L'aléatoire généré par des ''timers'' ou des compteurs d'horloge=== Au-delà des LSFR, il est possible d'utiliser des compteurs pour générer du pseudo-aléatoire. Par exemple, une technique très simple utilise un simple ''timer''. Si on a besoin d'un nombre pseudo-aléatoire, il suffit de lire le ''timer'' et d'utiliser le nombre lu comme nombre pseudo-aléatoire. Si le délai entre deux demandes est irrégulier, le résultat semblera aléatoire. Mais il s'agit là d'une technique assez peu fiable dans le monde réel et seules quelques applications bien spécifiques se satisfont de cette méthode. Une solution un peu plus fiable utilise ce qu'on appelle la '''dérive de l'horloge'''. Il faut savoir qu'un signal d'horloge n'est jamais vraiment très précis. Une horloge censée tourner à 1 Ghz ne tournera pas en permanence à 1Ghz exactement, mais verra sa fréquence varier de quelques Hz ou Khz de manière irrégulière. Ces variations peuvent venir de variations aléatoires de température, des variations de tension, des perturbations électromagnétiques, ou à des phénomènes assez compliqués qui peuvent se produire dans tout circuit électrique (comme le ''shot noise''). L'idée la plus simple utilise deux horloges : une horloge lente et une horloge rapide, dont la fréquence est un multiple de l'autre. Par exemple, on peut choisir une fréquence de 1 Mhz et une autre de 100 Hz : la fréquence la plus grande est égale à 10000 fois l'autre. La dérive d'horloge fera son œuvre, les deux horloges seront très légèrement désynchronisées en permanence, et cette désynchronisation peut être utilisée pour produire des nombres aléatoires. Par exemple, on peut compter le nombre de cycles d'horloge produit par l'horloge rapide durant une période de l'horloge lente. Si ce nombre est pair, on produit un bit aléatoire qui vaut 1 , il vaut 0 si ce nombre est pair. Pour information, c'est exactement cette technique qui était utilisée dans l'''Intel 82802 Firmware Hub''. ===L'aléatoire généré par la tension d'alimentation=== Il existe d'autres solutions matérielles qui utilisent le bruit thermique. Tous les circuits électroniques de l'univers sont soumis à de microscopiques variations de température, dues à l'agitation thermique des atomes. Plus la température est élevée, plus les atomes qui composent les fils métalliques des circuits s'agitent. Vu que les particules d'un métal contiennent des charges électriques, ces vibrations font naître des variations de tensions assez infimes. Il suffit d'amplifier ces variations pour obtenir un résultat capable de représenter un zéro ou un 1. Ce principe a été utilisé sur des anciens processeurs Intel qui géraient l'instruction RDRAND, une instruction qui produisait un nombre aléatoire. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits compteurs et décompteurs | prevText=Les circuits compteurs et décompteurs | next=Les circuits de décalage et de rotation | nextText=Les circuits de décalage et de rotation }} </noinclude> bevlc9ae9zkbnjh82eecuvd49e2o53f 768067 768066 2026-06-18T16:54:37Z Mewtow 31375 Mewtow a déplacé la page [[Fonctionnement d'un ordinateur/Les timers et diviseurs de fréquence]] vers [[Fonctionnement d'un ordinateur/Les compteurs à rétroaction]] 768066 wikitext text/x-wiki Dans le chapitre précédent, nous avons abordé les compteurs, des circuits qui mémorisent un nombre et l'incrémentent au besoin. Dans ce chapitre, nous allons voir d'autres circuits compteurs, bien différents de ceux du chapitre précédent. Ils ne comptent pas au sens commun du terme. A la place, ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Pour l'anecdote, le processeur Intel 8008, le tout premier microprocesseur 8 bits commercialisé, a utilisé ce genre de compteurs pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. De tels compteurs sont souvent basés sur un registre à décalage. L'idée est de boucler la sortie du registre à décalage sur sont entrée, parfois en insérant un circuit combinatoire entre les deux. C'est ce qui leur a valu le nom de '''compteurs à rétroaction''', un terme bien barbare pour dire que l'entrée est bouclée sur la sortie. Avant de poursuivre, je préfère faire un rappel sur les types de registre à décalage. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | PIPO || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. ==Les compteurs en anneau et de Johnson (SISO)== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un ''compteur one-hot''. La seconde possibilité, où le bit sortant est inversé, donne un compteur de Johnson. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ===Les compteurs en anneau : les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ===Les compteurs de Johnson : les compteurs unaires=== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. [[File:A simple sinusoid generator.jpg|centre|vignette|upright=2.5|Générateur de sinusoïde avec un compteur de Johnson.]] ===Les registres à décalage à rétroaction=== Les '''compteurs à rétroaction''' sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur=== Un compteur est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==La génération de nombres pseudo-aléatoires== Les compteurs peuvent aussi être utilisés pour générer des nombres "aléatoires". Je dis aléatoires entre guillemets car ils ne sont pas vraiment aléatoires, mais s'en rapprochent suffisamment pour être considérés comme tels. Pour mettre en avant cela, on parle aussi de nombres "pseudo-aléatoires". De nombreuses situations demandent de générer des nombres pseudo-aléatoire de manière matérielle. Cela peut servir pour sélectionner une ligne de cache à remplacer lors d'un défaut de cache, pour implémenter des circuits cryptographiques, pour calculer la durée d'émission sur un bus Ethernet à la suite d'une collision, et j'en passe. Les méthodes que nous allons voir produisent un nombre pseudo-aléatoire un bit à la fois, à quelques exceptions près. Les circuits que nous allons voir fournissent un bit sur leur sortie et ce bit varie de manière assez aléatoire. Les bits en sortie du circuit sont accumulés dans un registre à décalage normal, pour former un nombre aléatoire. Nous appellerons ce registre : l'accumulateur. ===L'usage de registres à décalage à rétroaction=== [[File:Nonlinear-combo-generator.png|thumb|Nonlinear-combo-generator]] La première solution utilise des ''registres à décalages à rétroaction'', les fameux LSFR du chapitre précédent. Un LSFR seul ne fournit pas un aléatoire digne de ce nom, mais il est possible de combiner plusieurs LSFR pour obtenir une meilleure approximation de l'aléatoire. Avec cette technique, plusieurs registres à décalages à rétroaction sont reliés à un circuit combinatoire non-linéaire. Ce circuit prendra en entrée un (ou plusieurs) bit de chaque registre à décalage à rétroaction, et combinera ces bits pour fournir un bit de sortie. [[File:A5-1 GSM cipher.svg|centre|thumb|upright=2|Exemple avec trois LSFR différents, de taille différentes : le bit envoyé à l'accumulateur est un XOR du bit sortant des trois LSFR.]] Pour rendre le tout encore plus aléatoire, il est possible de cadencer les LSFR à des fréquences différentes. Cette technique est utilisée dans les générateurs ''stop-and-go'', ''alternative step'', et à ''shrinking''. * Le générateur ''alternative step'' utilise trois LSFR. Le premier commande un multiplexeur qui choisit la sortie parmi les deux restants. * Le générateur ''stop-and-go'' utilise deux LSFR. Le premier est relié à l'entrée d'horloge du second et le bit de sortie du second est utilisé comme résultat. Une technique similaire était utilisée dans les processeurs VIA C3, pour l'implémentation de leurs instructions cryptographiques. * Le ''shrinking generator'' utilise deux LSFR cadencés à des vitesses différentes. Si le bit de sortie du premier vaut 1, alors le bit de sortie du second est utilisé comme résultat. Par contre, si le bit de sortie du premier vaut 0, aucun bit n'est fourni en sortie, le bit de sortie du second registre est oublié. ===L'aléatoire généré par des ''timers'' ou des compteurs d'horloge=== Au-delà des LSFR, il est possible d'utiliser des compteurs pour générer du pseudo-aléatoire. Par exemple, une technique très simple utilise un simple ''timer''. Si on a besoin d'un nombre pseudo-aléatoire, il suffit de lire le ''timer'' et d'utiliser le nombre lu comme nombre pseudo-aléatoire. Si le délai entre deux demandes est irrégulier, le résultat semblera aléatoire. Mais il s'agit là d'une technique assez peu fiable dans le monde réel et seules quelques applications bien spécifiques se satisfont de cette méthode. Une solution un peu plus fiable utilise ce qu'on appelle la '''dérive de l'horloge'''. Il faut savoir qu'un signal d'horloge n'est jamais vraiment très précis. Une horloge censée tourner à 1 Ghz ne tournera pas en permanence à 1Ghz exactement, mais verra sa fréquence varier de quelques Hz ou Khz de manière irrégulière. Ces variations peuvent venir de variations aléatoires de température, des variations de tension, des perturbations électromagnétiques, ou à des phénomènes assez compliqués qui peuvent se produire dans tout circuit électrique (comme le ''shot noise''). L'idée la plus simple utilise deux horloges : une horloge lente et une horloge rapide, dont la fréquence est un multiple de l'autre. Par exemple, on peut choisir une fréquence de 1 Mhz et une autre de 100 Hz : la fréquence la plus grande est égale à 10000 fois l'autre. La dérive d'horloge fera son œuvre, les deux horloges seront très légèrement désynchronisées en permanence, et cette désynchronisation peut être utilisée pour produire des nombres aléatoires. Par exemple, on peut compter le nombre de cycles d'horloge produit par l'horloge rapide durant une période de l'horloge lente. Si ce nombre est pair, on produit un bit aléatoire qui vaut 1 , il vaut 0 si ce nombre est pair. Pour information, c'est exactement cette technique qui était utilisée dans l'''Intel 82802 Firmware Hub''. ===L'aléatoire généré par la tension d'alimentation=== Il existe d'autres solutions matérielles qui utilisent le bruit thermique. Tous les circuits électroniques de l'univers sont soumis à de microscopiques variations de température, dues à l'agitation thermique des atomes. Plus la température est élevée, plus les atomes qui composent les fils métalliques des circuits s'agitent. Vu que les particules d'un métal contiennent des charges électriques, ces vibrations font naître des variations de tensions assez infimes. Il suffit d'amplifier ces variations pour obtenir un résultat capable de représenter un zéro ou un 1. Ce principe a été utilisé sur des anciens processeurs Intel qui géraient l'instruction RDRAND, une instruction qui produisait un nombre aléatoire. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits compteurs et décompteurs | prevText=Les circuits compteurs et décompteurs | next=Les circuits de décalage et de rotation | nextText=Les circuits de décalage et de rotation }} </noinclude> bevlc9ae9zkbnjh82eecuvd49e2o53f 768072 768067 2026-06-18T16:55:42Z Mewtow 31375 /* Les registres à décalage à rétroaction */ 768072 wikitext text/x-wiki Dans le chapitre précédent, nous avons abordé les compteurs, des circuits qui mémorisent un nombre et l'incrémentent au besoin. Dans ce chapitre, nous allons voir d'autres circuits compteurs, bien différents de ceux du chapitre précédent. Ils ne comptent pas au sens commun du terme. A la place, ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Pour l'anecdote, le processeur Intel 8008, le tout premier microprocesseur 8 bits commercialisé, a utilisé ce genre de compteurs pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. De tels compteurs sont souvent basés sur un registre à décalage. L'idée est de boucler la sortie du registre à décalage sur sont entrée, parfois en insérant un circuit combinatoire entre les deux. C'est ce qui leur a valu le nom de '''compteurs à rétroaction''', un terme bien barbare pour dire que l'entrée est bouclée sur la sortie. Avant de poursuivre, je préfère faire un rappel sur les types de registre à décalage. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | PIPO || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. ==Les compteurs en anneau et de Johnson (SISO)== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un ''compteur one-hot''. La seconde possibilité, où le bit sortant est inversé, donne un compteur de Johnson. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ===Les compteurs en anneau : les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ===Les compteurs de Johnson : les compteurs unaires=== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. [[File:A simple sinusoid generator.jpg|centre|vignette|upright=2.5|Générateur de sinusoïde avec un compteur de Johnson.]] ==Les registres à décalage à rétroaction== Les '''compteurs à rétroaction''' sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur=== Un compteur est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==La génération de nombres pseudo-aléatoires== Les compteurs peuvent aussi être utilisés pour générer des nombres "aléatoires". Je dis aléatoires entre guillemets car ils ne sont pas vraiment aléatoires, mais s'en rapprochent suffisamment pour être considérés comme tels. Pour mettre en avant cela, on parle aussi de nombres "pseudo-aléatoires". De nombreuses situations demandent de générer des nombres pseudo-aléatoire de manière matérielle. Cela peut servir pour sélectionner une ligne de cache à remplacer lors d'un défaut de cache, pour implémenter des circuits cryptographiques, pour calculer la durée d'émission sur un bus Ethernet à la suite d'une collision, et j'en passe. Les méthodes que nous allons voir produisent un nombre pseudo-aléatoire un bit à la fois, à quelques exceptions près. Les circuits que nous allons voir fournissent un bit sur leur sortie et ce bit varie de manière assez aléatoire. Les bits en sortie du circuit sont accumulés dans un registre à décalage normal, pour former un nombre aléatoire. Nous appellerons ce registre : l'accumulateur. ===L'usage de registres à décalage à rétroaction=== [[File:Nonlinear-combo-generator.png|thumb|Nonlinear-combo-generator]] La première solution utilise des ''registres à décalages à rétroaction'', les fameux LSFR du chapitre précédent. Un LSFR seul ne fournit pas un aléatoire digne de ce nom, mais il est possible de combiner plusieurs LSFR pour obtenir une meilleure approximation de l'aléatoire. Avec cette technique, plusieurs registres à décalages à rétroaction sont reliés à un circuit combinatoire non-linéaire. Ce circuit prendra en entrée un (ou plusieurs) bit de chaque registre à décalage à rétroaction, et combinera ces bits pour fournir un bit de sortie. [[File:A5-1 GSM cipher.svg|centre|thumb|upright=2|Exemple avec trois LSFR différents, de taille différentes : le bit envoyé à l'accumulateur est un XOR du bit sortant des trois LSFR.]] Pour rendre le tout encore plus aléatoire, il est possible de cadencer les LSFR à des fréquences différentes. Cette technique est utilisée dans les générateurs ''stop-and-go'', ''alternative step'', et à ''shrinking''. * Le générateur ''alternative step'' utilise trois LSFR. Le premier commande un multiplexeur qui choisit la sortie parmi les deux restants. * Le générateur ''stop-and-go'' utilise deux LSFR. Le premier est relié à l'entrée d'horloge du second et le bit de sortie du second est utilisé comme résultat. Une technique similaire était utilisée dans les processeurs VIA C3, pour l'implémentation de leurs instructions cryptographiques. * Le ''shrinking generator'' utilise deux LSFR cadencés à des vitesses différentes. Si le bit de sortie du premier vaut 1, alors le bit de sortie du second est utilisé comme résultat. Par contre, si le bit de sortie du premier vaut 0, aucun bit n'est fourni en sortie, le bit de sortie du second registre est oublié. ===L'aléatoire généré par des ''timers'' ou des compteurs d'horloge=== Au-delà des LSFR, il est possible d'utiliser des compteurs pour générer du pseudo-aléatoire. Par exemple, une technique très simple utilise un simple ''timer''. Si on a besoin d'un nombre pseudo-aléatoire, il suffit de lire le ''timer'' et d'utiliser le nombre lu comme nombre pseudo-aléatoire. Si le délai entre deux demandes est irrégulier, le résultat semblera aléatoire. Mais il s'agit là d'une technique assez peu fiable dans le monde réel et seules quelques applications bien spécifiques se satisfont de cette méthode. Une solution un peu plus fiable utilise ce qu'on appelle la '''dérive de l'horloge'''. Il faut savoir qu'un signal d'horloge n'est jamais vraiment très précis. Une horloge censée tourner à 1 Ghz ne tournera pas en permanence à 1Ghz exactement, mais verra sa fréquence varier de quelques Hz ou Khz de manière irrégulière. Ces variations peuvent venir de variations aléatoires de température, des variations de tension, des perturbations électromagnétiques, ou à des phénomènes assez compliqués qui peuvent se produire dans tout circuit électrique (comme le ''shot noise''). L'idée la plus simple utilise deux horloges : une horloge lente et une horloge rapide, dont la fréquence est un multiple de l'autre. Par exemple, on peut choisir une fréquence de 1 Mhz et une autre de 100 Hz : la fréquence la plus grande est égale à 10000 fois l'autre. La dérive d'horloge fera son œuvre, les deux horloges seront très légèrement désynchronisées en permanence, et cette désynchronisation peut être utilisée pour produire des nombres aléatoires. Par exemple, on peut compter le nombre de cycles d'horloge produit par l'horloge rapide durant une période de l'horloge lente. Si ce nombre est pair, on produit un bit aléatoire qui vaut 1 , il vaut 0 si ce nombre est pair. Pour information, c'est exactement cette technique qui était utilisée dans l'''Intel 82802 Firmware Hub''. ===L'aléatoire généré par la tension d'alimentation=== Il existe d'autres solutions matérielles qui utilisent le bruit thermique. Tous les circuits électroniques de l'univers sont soumis à de microscopiques variations de température, dues à l'agitation thermique des atomes. Plus la température est élevée, plus les atomes qui composent les fils métalliques des circuits s'agitent. Vu que les particules d'un métal contiennent des charges électriques, ces vibrations font naître des variations de tensions assez infimes. Il suffit d'amplifier ces variations pour obtenir un résultat capable de représenter un zéro ou un 1. Ce principe a été utilisé sur des anciens processeurs Intel qui géraient l'instruction RDRAND, une instruction qui produisait un nombre aléatoire. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits compteurs et décompteurs | prevText=Les circuits compteurs et décompteurs | next=Les circuits de décalage et de rotation | nextText=Les circuits de décalage et de rotation }} </noinclude> gpu883mjpi285cj1pqtcz3bmo5q5xzd 768073 768072 2026-06-18T16:55:52Z Mewtow 31375 /* Les registres à décalage à rétroaction */ 768073 wikitext text/x-wiki Dans le chapitre précédent, nous avons abordé les compteurs, des circuits qui mémorisent un nombre et l'incrémentent au besoin. Dans ce chapitre, nous allons voir d'autres circuits compteurs, bien différents de ceux du chapitre précédent. Ils ne comptent pas au sens commun du terme. A la place, ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Pour l'anecdote, le processeur Intel 8008, le tout premier microprocesseur 8 bits commercialisé, a utilisé ce genre de compteurs pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. De tels compteurs sont souvent basés sur un registre à décalage. L'idée est de boucler la sortie du registre à décalage sur sont entrée, parfois en insérant un circuit combinatoire entre les deux. C'est ce qui leur a valu le nom de '''compteurs à rétroaction''', un terme bien barbare pour dire que l'entrée est bouclée sur la sortie. Avant de poursuivre, je préfère faire un rappel sur les types de registre à décalage. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | PIPO || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. ==Les compteurs en anneau et de Johnson (SISO)== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un ''compteur one-hot''. La seconde possibilité, où le bit sortant est inversé, donne un compteur de Johnson. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ===Les compteurs en anneau : les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ===Les compteurs de Johnson : les compteurs unaires=== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. [[File:A simple sinusoid generator.jpg|centre|vignette|upright=2.5|Générateur de sinusoïde avec un compteur de Johnson.]] ==Les registres à décalage à rétroaction== Les '''registres à décalage à rétroaction''' sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ===La période d'un compteur=== Un compteur est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==La génération de nombres pseudo-aléatoires== Les compteurs peuvent aussi être utilisés pour générer des nombres "aléatoires". Je dis aléatoires entre guillemets car ils ne sont pas vraiment aléatoires, mais s'en rapprochent suffisamment pour être considérés comme tels. Pour mettre en avant cela, on parle aussi de nombres "pseudo-aléatoires". De nombreuses situations demandent de générer des nombres pseudo-aléatoire de manière matérielle. Cela peut servir pour sélectionner une ligne de cache à remplacer lors d'un défaut de cache, pour implémenter des circuits cryptographiques, pour calculer la durée d'émission sur un bus Ethernet à la suite d'une collision, et j'en passe. Les méthodes que nous allons voir produisent un nombre pseudo-aléatoire un bit à la fois, à quelques exceptions près. Les circuits que nous allons voir fournissent un bit sur leur sortie et ce bit varie de manière assez aléatoire. Les bits en sortie du circuit sont accumulés dans un registre à décalage normal, pour former un nombre aléatoire. Nous appellerons ce registre : l'accumulateur. ===L'usage de registres à décalage à rétroaction=== [[File:Nonlinear-combo-generator.png|thumb|Nonlinear-combo-generator]] La première solution utilise des ''registres à décalages à rétroaction'', les fameux LSFR du chapitre précédent. Un LSFR seul ne fournit pas un aléatoire digne de ce nom, mais il est possible de combiner plusieurs LSFR pour obtenir une meilleure approximation de l'aléatoire. Avec cette technique, plusieurs registres à décalages à rétroaction sont reliés à un circuit combinatoire non-linéaire. Ce circuit prendra en entrée un (ou plusieurs) bit de chaque registre à décalage à rétroaction, et combinera ces bits pour fournir un bit de sortie. [[File:A5-1 GSM cipher.svg|centre|thumb|upright=2|Exemple avec trois LSFR différents, de taille différentes : le bit envoyé à l'accumulateur est un XOR du bit sortant des trois LSFR.]] Pour rendre le tout encore plus aléatoire, il est possible de cadencer les LSFR à des fréquences différentes. Cette technique est utilisée dans les générateurs ''stop-and-go'', ''alternative step'', et à ''shrinking''. * Le générateur ''alternative step'' utilise trois LSFR. Le premier commande un multiplexeur qui choisit la sortie parmi les deux restants. * Le générateur ''stop-and-go'' utilise deux LSFR. Le premier est relié à l'entrée d'horloge du second et le bit de sortie du second est utilisé comme résultat. Une technique similaire était utilisée dans les processeurs VIA C3, pour l'implémentation de leurs instructions cryptographiques. * Le ''shrinking generator'' utilise deux LSFR cadencés à des vitesses différentes. Si le bit de sortie du premier vaut 1, alors le bit de sortie du second est utilisé comme résultat. Par contre, si le bit de sortie du premier vaut 0, aucun bit n'est fourni en sortie, le bit de sortie du second registre est oublié. ===L'aléatoire généré par des ''timers'' ou des compteurs d'horloge=== Au-delà des LSFR, il est possible d'utiliser des compteurs pour générer du pseudo-aléatoire. Par exemple, une technique très simple utilise un simple ''timer''. Si on a besoin d'un nombre pseudo-aléatoire, il suffit de lire le ''timer'' et d'utiliser le nombre lu comme nombre pseudo-aléatoire. Si le délai entre deux demandes est irrégulier, le résultat semblera aléatoire. Mais il s'agit là d'une technique assez peu fiable dans le monde réel et seules quelques applications bien spécifiques se satisfont de cette méthode. Une solution un peu plus fiable utilise ce qu'on appelle la '''dérive de l'horloge'''. Il faut savoir qu'un signal d'horloge n'est jamais vraiment très précis. Une horloge censée tourner à 1 Ghz ne tournera pas en permanence à 1Ghz exactement, mais verra sa fréquence varier de quelques Hz ou Khz de manière irrégulière. Ces variations peuvent venir de variations aléatoires de température, des variations de tension, des perturbations électromagnétiques, ou à des phénomènes assez compliqués qui peuvent se produire dans tout circuit électrique (comme le ''shot noise''). L'idée la plus simple utilise deux horloges : une horloge lente et une horloge rapide, dont la fréquence est un multiple de l'autre. Par exemple, on peut choisir une fréquence de 1 Mhz et une autre de 100 Hz : la fréquence la plus grande est égale à 10000 fois l'autre. La dérive d'horloge fera son œuvre, les deux horloges seront très légèrement désynchronisées en permanence, et cette désynchronisation peut être utilisée pour produire des nombres aléatoires. Par exemple, on peut compter le nombre de cycles d'horloge produit par l'horloge rapide durant une période de l'horloge lente. Si ce nombre est pair, on produit un bit aléatoire qui vaut 1 , il vaut 0 si ce nombre est pair. Pour information, c'est exactement cette technique qui était utilisée dans l'''Intel 82802 Firmware Hub''. ===L'aléatoire généré par la tension d'alimentation=== Il existe d'autres solutions matérielles qui utilisent le bruit thermique. Tous les circuits électroniques de l'univers sont soumis à de microscopiques variations de température, dues à l'agitation thermique des atomes. Plus la température est élevée, plus les atomes qui composent les fils métalliques des circuits s'agitent. Vu que les particules d'un métal contiennent des charges électriques, ces vibrations font naître des variations de tensions assez infimes. Il suffit d'amplifier ces variations pour obtenir un résultat capable de représenter un zéro ou un 1. Ce principe a été utilisé sur des anciens processeurs Intel qui géraient l'instruction RDRAND, une instruction qui produisait un nombre aléatoire. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits compteurs et décompteurs | prevText=Les circuits compteurs et décompteurs | next=Les circuits de décalage et de rotation | nextText=Les circuits de décalage et de rotation }} </noinclude> pldp53f97vl36fz4uwaxh91hu1xtngd 768074 768073 2026-06-18T16:56:32Z Mewtow 31375 /* Les registres à décalage à rétroaction */ 768074 wikitext text/x-wiki Dans le chapitre précédent, nous avons abordé les compteurs, des circuits qui mémorisent un nombre et l'incrémentent au besoin. Dans ce chapitre, nous allons voir d'autres circuits compteurs, bien différents de ceux du chapitre précédent. Ils ne comptent pas au sens commun du terme. A la place, ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Pour l'anecdote, le processeur Intel 8008, le tout premier microprocesseur 8 bits commercialisé, a utilisé ce genre de compteurs pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. De tels compteurs sont souvent basés sur un registre à décalage. L'idée est de boucler la sortie du registre à décalage sur sont entrée, parfois en insérant un circuit combinatoire entre les deux. C'est ce qui leur a valu le nom de '''compteurs à rétroaction''', un terme bien barbare pour dire que l'entrée est bouclée sur la sortie. Avant de poursuivre, je préfère faire un rappel sur les types de registre à décalage. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | PIPO || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. ==Les compteurs en anneau et de Johnson (SISO)== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un ''compteur one-hot''. La seconde possibilité, où le bit sortant est inversé, donne un compteur de Johnson. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ===Les compteurs en anneau : les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ===Les compteurs de Johnson : les compteurs unaires=== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. [[File:A simple sinusoid generator.jpg|centre|vignette|upright=2.5|Générateur de sinusoïde avec un compteur de Johnson.]] ===Les registres à décalage à rétroaction=== Les '''registres à décalage à rétroaction''' sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ==La période d'un compteur== Un compteur est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ==L'initialisation d'un compteur à rétroaction== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==La génération de nombres pseudo-aléatoires== Les compteurs peuvent aussi être utilisés pour générer des nombres "aléatoires". Je dis aléatoires entre guillemets car ils ne sont pas vraiment aléatoires, mais s'en rapprochent suffisamment pour être considérés comme tels. Pour mettre en avant cela, on parle aussi de nombres "pseudo-aléatoires". De nombreuses situations demandent de générer des nombres pseudo-aléatoire de manière matérielle. Cela peut servir pour sélectionner une ligne de cache à remplacer lors d'un défaut de cache, pour implémenter des circuits cryptographiques, pour calculer la durée d'émission sur un bus Ethernet à la suite d'une collision, et j'en passe. Les méthodes que nous allons voir produisent un nombre pseudo-aléatoire un bit à la fois, à quelques exceptions près. Les circuits que nous allons voir fournissent un bit sur leur sortie et ce bit varie de manière assez aléatoire. Les bits en sortie du circuit sont accumulés dans un registre à décalage normal, pour former un nombre aléatoire. Nous appellerons ce registre : l'accumulateur. ===L'usage de registres à décalage à rétroaction=== [[File:Nonlinear-combo-generator.png|thumb|Nonlinear-combo-generator]] La première solution utilise des ''registres à décalages à rétroaction'', les fameux LSFR du chapitre précédent. Un LSFR seul ne fournit pas un aléatoire digne de ce nom, mais il est possible de combiner plusieurs LSFR pour obtenir une meilleure approximation de l'aléatoire. Avec cette technique, plusieurs registres à décalages à rétroaction sont reliés à un circuit combinatoire non-linéaire. Ce circuit prendra en entrée un (ou plusieurs) bit de chaque registre à décalage à rétroaction, et combinera ces bits pour fournir un bit de sortie. [[File:A5-1 GSM cipher.svg|centre|thumb|upright=2|Exemple avec trois LSFR différents, de taille différentes : le bit envoyé à l'accumulateur est un XOR du bit sortant des trois LSFR.]] Pour rendre le tout encore plus aléatoire, il est possible de cadencer les LSFR à des fréquences différentes. Cette technique est utilisée dans les générateurs ''stop-and-go'', ''alternative step'', et à ''shrinking''. * Le générateur ''alternative step'' utilise trois LSFR. Le premier commande un multiplexeur qui choisit la sortie parmi les deux restants. * Le générateur ''stop-and-go'' utilise deux LSFR. Le premier est relié à l'entrée d'horloge du second et le bit de sortie du second est utilisé comme résultat. Une technique similaire était utilisée dans les processeurs VIA C3, pour l'implémentation de leurs instructions cryptographiques. * Le ''shrinking generator'' utilise deux LSFR cadencés à des vitesses différentes. Si le bit de sortie du premier vaut 1, alors le bit de sortie du second est utilisé comme résultat. Par contre, si le bit de sortie du premier vaut 0, aucun bit n'est fourni en sortie, le bit de sortie du second registre est oublié. ===L'aléatoire généré par des ''timers'' ou des compteurs d'horloge=== Au-delà des LSFR, il est possible d'utiliser des compteurs pour générer du pseudo-aléatoire. Par exemple, une technique très simple utilise un simple ''timer''. Si on a besoin d'un nombre pseudo-aléatoire, il suffit de lire le ''timer'' et d'utiliser le nombre lu comme nombre pseudo-aléatoire. Si le délai entre deux demandes est irrégulier, le résultat semblera aléatoire. Mais il s'agit là d'une technique assez peu fiable dans le monde réel et seules quelques applications bien spécifiques se satisfont de cette méthode. Une solution un peu plus fiable utilise ce qu'on appelle la '''dérive de l'horloge'''. Il faut savoir qu'un signal d'horloge n'est jamais vraiment très précis. Une horloge censée tourner à 1 Ghz ne tournera pas en permanence à 1Ghz exactement, mais verra sa fréquence varier de quelques Hz ou Khz de manière irrégulière. Ces variations peuvent venir de variations aléatoires de température, des variations de tension, des perturbations électromagnétiques, ou à des phénomènes assez compliqués qui peuvent se produire dans tout circuit électrique (comme le ''shot noise''). L'idée la plus simple utilise deux horloges : une horloge lente et une horloge rapide, dont la fréquence est un multiple de l'autre. Par exemple, on peut choisir une fréquence de 1 Mhz et une autre de 100 Hz : la fréquence la plus grande est égale à 10000 fois l'autre. La dérive d'horloge fera son œuvre, les deux horloges seront très légèrement désynchronisées en permanence, et cette désynchronisation peut être utilisée pour produire des nombres aléatoires. Par exemple, on peut compter le nombre de cycles d'horloge produit par l'horloge rapide durant une période de l'horloge lente. Si ce nombre est pair, on produit un bit aléatoire qui vaut 1 , il vaut 0 si ce nombre est pair. Pour information, c'est exactement cette technique qui était utilisée dans l'''Intel 82802 Firmware Hub''. ===L'aléatoire généré par la tension d'alimentation=== Il existe d'autres solutions matérielles qui utilisent le bruit thermique. Tous les circuits électroniques de l'univers sont soumis à de microscopiques variations de température, dues à l'agitation thermique des atomes. Plus la température est élevée, plus les atomes qui composent les fils métalliques des circuits s'agitent. Vu que les particules d'un métal contiennent des charges électriques, ces vibrations font naître des variations de tensions assez infimes. Il suffit d'amplifier ces variations pour obtenir un résultat capable de représenter un zéro ou un 1. Ce principe a été utilisé sur des anciens processeurs Intel qui géraient l'instruction RDRAND, une instruction qui produisait un nombre aléatoire. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits compteurs et décompteurs | prevText=Les circuits compteurs et décompteurs | next=Les circuits de décalage et de rotation | nextText=Les circuits de décalage et de rotation }} </noinclude> sa5k0ja8m2khoee2i7vzenvpm5irss0 768075 768074 2026-06-18T16:56:51Z Mewtow 31375 /* Les registres à décalage à rétroaction */ 768075 wikitext text/x-wiki Dans le chapitre précédent, nous avons abordé les compteurs, des circuits qui mémorisent un nombre et l'incrémentent au besoin. Dans ce chapitre, nous allons voir d'autres circuits compteurs, bien différents de ceux du chapitre précédent. Ils ne comptent pas au sens commun du terme. A la place, ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Pour l'anecdote, le processeur Intel 8008, le tout premier microprocesseur 8 bits commercialisé, a utilisé ce genre de compteurs pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. De tels compteurs sont souvent basés sur un registre à décalage. L'idée est de boucler la sortie du registre à décalage sur sont entrée, parfois en insérant un circuit combinatoire entre les deux. C'est ce qui leur a valu le nom de '''compteurs à rétroaction''', un terme bien barbare pour dire que l'entrée est bouclée sur la sortie. Avant de poursuivre, je préfère faire un rappel sur les types de registre à décalage. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | PIPO || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. ==Les compteurs en anneau et de Johnson (SISO)== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un ''compteur one-hot''. La seconde possibilité, où le bit sortant est inversé, donne un compteur de Johnson. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ===Les compteurs en anneau : les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ===Les compteurs de Johnson : les compteurs unaires=== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. [[File:A simple sinusoid generator.jpg|centre|vignette|upright=2.5|Générateur de sinusoïde avec un compteur de Johnson.]] ==Les registres à décalage à rétroaction== Les '''registres à décalage à rétroaction''' sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ==La période d'un compteur== Un compteur est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ==L'initialisation d'un compteur à rétroaction== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==La génération de nombres pseudo-aléatoires== Les compteurs peuvent aussi être utilisés pour générer des nombres "aléatoires". Je dis aléatoires entre guillemets car ils ne sont pas vraiment aléatoires, mais s'en rapprochent suffisamment pour être considérés comme tels. Pour mettre en avant cela, on parle aussi de nombres "pseudo-aléatoires". De nombreuses situations demandent de générer des nombres pseudo-aléatoire de manière matérielle. Cela peut servir pour sélectionner une ligne de cache à remplacer lors d'un défaut de cache, pour implémenter des circuits cryptographiques, pour calculer la durée d'émission sur un bus Ethernet à la suite d'une collision, et j'en passe. Les méthodes que nous allons voir produisent un nombre pseudo-aléatoire un bit à la fois, à quelques exceptions près. Les circuits que nous allons voir fournissent un bit sur leur sortie et ce bit varie de manière assez aléatoire. Les bits en sortie du circuit sont accumulés dans un registre à décalage normal, pour former un nombre aléatoire. Nous appellerons ce registre : l'accumulateur. ===L'usage de registres à décalage à rétroaction=== [[File:Nonlinear-combo-generator.png|thumb|Nonlinear-combo-generator]] La première solution utilise des ''registres à décalages à rétroaction'', les fameux LSFR du chapitre précédent. Un LSFR seul ne fournit pas un aléatoire digne de ce nom, mais il est possible de combiner plusieurs LSFR pour obtenir une meilleure approximation de l'aléatoire. Avec cette technique, plusieurs registres à décalages à rétroaction sont reliés à un circuit combinatoire non-linéaire. Ce circuit prendra en entrée un (ou plusieurs) bit de chaque registre à décalage à rétroaction, et combinera ces bits pour fournir un bit de sortie. [[File:A5-1 GSM cipher.svg|centre|thumb|upright=2|Exemple avec trois LSFR différents, de taille différentes : le bit envoyé à l'accumulateur est un XOR du bit sortant des trois LSFR.]] Pour rendre le tout encore plus aléatoire, il est possible de cadencer les LSFR à des fréquences différentes. Cette technique est utilisée dans les générateurs ''stop-and-go'', ''alternative step'', et à ''shrinking''. * Le générateur ''alternative step'' utilise trois LSFR. Le premier commande un multiplexeur qui choisit la sortie parmi les deux restants. * Le générateur ''stop-and-go'' utilise deux LSFR. Le premier est relié à l'entrée d'horloge du second et le bit de sortie du second est utilisé comme résultat. Une technique similaire était utilisée dans les processeurs VIA C3, pour l'implémentation de leurs instructions cryptographiques. * Le ''shrinking generator'' utilise deux LSFR cadencés à des vitesses différentes. Si le bit de sortie du premier vaut 1, alors le bit de sortie du second est utilisé comme résultat. Par contre, si le bit de sortie du premier vaut 0, aucun bit n'est fourni en sortie, le bit de sortie du second registre est oublié. ===L'aléatoire généré par des ''timers'' ou des compteurs d'horloge=== Au-delà des LSFR, il est possible d'utiliser des compteurs pour générer du pseudo-aléatoire. Par exemple, une technique très simple utilise un simple ''timer''. Si on a besoin d'un nombre pseudo-aléatoire, il suffit de lire le ''timer'' et d'utiliser le nombre lu comme nombre pseudo-aléatoire. Si le délai entre deux demandes est irrégulier, le résultat semblera aléatoire. Mais il s'agit là d'une technique assez peu fiable dans le monde réel et seules quelques applications bien spécifiques se satisfont de cette méthode. Une solution un peu plus fiable utilise ce qu'on appelle la '''dérive de l'horloge'''. Il faut savoir qu'un signal d'horloge n'est jamais vraiment très précis. Une horloge censée tourner à 1 Ghz ne tournera pas en permanence à 1Ghz exactement, mais verra sa fréquence varier de quelques Hz ou Khz de manière irrégulière. Ces variations peuvent venir de variations aléatoires de température, des variations de tension, des perturbations électromagnétiques, ou à des phénomènes assez compliqués qui peuvent se produire dans tout circuit électrique (comme le ''shot noise''). L'idée la plus simple utilise deux horloges : une horloge lente et une horloge rapide, dont la fréquence est un multiple de l'autre. Par exemple, on peut choisir une fréquence de 1 Mhz et une autre de 100 Hz : la fréquence la plus grande est égale à 10000 fois l'autre. La dérive d'horloge fera son œuvre, les deux horloges seront très légèrement désynchronisées en permanence, et cette désynchronisation peut être utilisée pour produire des nombres aléatoires. Par exemple, on peut compter le nombre de cycles d'horloge produit par l'horloge rapide durant une période de l'horloge lente. Si ce nombre est pair, on produit un bit aléatoire qui vaut 1 , il vaut 0 si ce nombre est pair. Pour information, c'est exactement cette technique qui était utilisée dans l'''Intel 82802 Firmware Hub''. ===L'aléatoire généré par la tension d'alimentation=== Il existe d'autres solutions matérielles qui utilisent le bruit thermique. Tous les circuits électroniques de l'univers sont soumis à de microscopiques variations de température, dues à l'agitation thermique des atomes. Plus la température est élevée, plus les atomes qui composent les fils métalliques des circuits s'agitent. Vu que les particules d'un métal contiennent des charges électriques, ces vibrations font naître des variations de tensions assez infimes. Il suffit d'amplifier ces variations pour obtenir un résultat capable de représenter un zéro ou un 1. Ce principe a été utilisé sur des anciens processeurs Intel qui géraient l'instruction RDRAND, une instruction qui produisait un nombre aléatoire. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits compteurs et décompteurs | prevText=Les circuits compteurs et décompteurs | next=Les circuits de décalage et de rotation | nextText=Les circuits de décalage et de rotation }} </noinclude> iixvkr14cu77sofuue7ydcvhgty6lxu 768076 768075 2026-06-18T16:57:47Z Mewtow 31375 /* La période d'un compteur */ 768076 wikitext text/x-wiki Dans le chapitre précédent, nous avons abordé les compteurs, des circuits qui mémorisent un nombre et l'incrémentent au besoin. Dans ce chapitre, nous allons voir d'autres circuits compteurs, bien différents de ceux du chapitre précédent. Ils ne comptent pas au sens commun du terme. A la place, ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Pour l'anecdote, le processeur Intel 8008, le tout premier microprocesseur 8 bits commercialisé, a utilisé ce genre de compteurs pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. De tels compteurs sont souvent basés sur un registre à décalage. L'idée est de boucler la sortie du registre à décalage sur sont entrée, parfois en insérant un circuit combinatoire entre les deux. C'est ce qui leur a valu le nom de '''compteurs à rétroaction''', un terme bien barbare pour dire que l'entrée est bouclée sur la sortie. Avant de poursuivre, je préfère faire un rappel sur les types de registre à décalage. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | PIPO || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. ==Les compteurs en anneau et de Johnson (SISO)== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un ''compteur one-hot''. La seconde possibilité, où le bit sortant est inversé, donne un compteur de Johnson. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ===Les compteurs en anneau : les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ===Les compteurs de Johnson : les compteurs unaires=== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. [[File:A simple sinusoid generator.jpg|centre|vignette|upright=2.5|Générateur de sinusoïde avec un compteur de Johnson.]] ==Les registres à décalage à rétroaction== Les '''registres à décalage à rétroaction''' sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ==La période d'un compteur à rétroaction== Un compteur est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ==L'initialisation d'un compteur à rétroaction== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==La génération de nombres pseudo-aléatoires== Les compteurs peuvent aussi être utilisés pour générer des nombres "aléatoires". Je dis aléatoires entre guillemets car ils ne sont pas vraiment aléatoires, mais s'en rapprochent suffisamment pour être considérés comme tels. Pour mettre en avant cela, on parle aussi de nombres "pseudo-aléatoires". De nombreuses situations demandent de générer des nombres pseudo-aléatoire de manière matérielle. Cela peut servir pour sélectionner une ligne de cache à remplacer lors d'un défaut de cache, pour implémenter des circuits cryptographiques, pour calculer la durée d'émission sur un bus Ethernet à la suite d'une collision, et j'en passe. Les méthodes que nous allons voir produisent un nombre pseudo-aléatoire un bit à la fois, à quelques exceptions près. Les circuits que nous allons voir fournissent un bit sur leur sortie et ce bit varie de manière assez aléatoire. Les bits en sortie du circuit sont accumulés dans un registre à décalage normal, pour former un nombre aléatoire. Nous appellerons ce registre : l'accumulateur. ===L'usage de registres à décalage à rétroaction=== [[File:Nonlinear-combo-generator.png|thumb|Nonlinear-combo-generator]] La première solution utilise des ''registres à décalages à rétroaction'', les fameux LSFR du chapitre précédent. Un LSFR seul ne fournit pas un aléatoire digne de ce nom, mais il est possible de combiner plusieurs LSFR pour obtenir une meilleure approximation de l'aléatoire. Avec cette technique, plusieurs registres à décalages à rétroaction sont reliés à un circuit combinatoire non-linéaire. Ce circuit prendra en entrée un (ou plusieurs) bit de chaque registre à décalage à rétroaction, et combinera ces bits pour fournir un bit de sortie. [[File:A5-1 GSM cipher.svg|centre|thumb|upright=2|Exemple avec trois LSFR différents, de taille différentes : le bit envoyé à l'accumulateur est un XOR du bit sortant des trois LSFR.]] Pour rendre le tout encore plus aléatoire, il est possible de cadencer les LSFR à des fréquences différentes. Cette technique est utilisée dans les générateurs ''stop-and-go'', ''alternative step'', et à ''shrinking''. * Le générateur ''alternative step'' utilise trois LSFR. Le premier commande un multiplexeur qui choisit la sortie parmi les deux restants. * Le générateur ''stop-and-go'' utilise deux LSFR. Le premier est relié à l'entrée d'horloge du second et le bit de sortie du second est utilisé comme résultat. Une technique similaire était utilisée dans les processeurs VIA C3, pour l'implémentation de leurs instructions cryptographiques. * Le ''shrinking generator'' utilise deux LSFR cadencés à des vitesses différentes. Si le bit de sortie du premier vaut 1, alors le bit de sortie du second est utilisé comme résultat. Par contre, si le bit de sortie du premier vaut 0, aucun bit n'est fourni en sortie, le bit de sortie du second registre est oublié. ===L'aléatoire généré par des ''timers'' ou des compteurs d'horloge=== Au-delà des LSFR, il est possible d'utiliser des compteurs pour générer du pseudo-aléatoire. Par exemple, une technique très simple utilise un simple ''timer''. Si on a besoin d'un nombre pseudo-aléatoire, il suffit de lire le ''timer'' et d'utiliser le nombre lu comme nombre pseudo-aléatoire. Si le délai entre deux demandes est irrégulier, le résultat semblera aléatoire. Mais il s'agit là d'une technique assez peu fiable dans le monde réel et seules quelques applications bien spécifiques se satisfont de cette méthode. Une solution un peu plus fiable utilise ce qu'on appelle la '''dérive de l'horloge'''. Il faut savoir qu'un signal d'horloge n'est jamais vraiment très précis. Une horloge censée tourner à 1 Ghz ne tournera pas en permanence à 1Ghz exactement, mais verra sa fréquence varier de quelques Hz ou Khz de manière irrégulière. Ces variations peuvent venir de variations aléatoires de température, des variations de tension, des perturbations électromagnétiques, ou à des phénomènes assez compliqués qui peuvent se produire dans tout circuit électrique (comme le ''shot noise''). L'idée la plus simple utilise deux horloges : une horloge lente et une horloge rapide, dont la fréquence est un multiple de l'autre. Par exemple, on peut choisir une fréquence de 1 Mhz et une autre de 100 Hz : la fréquence la plus grande est égale à 10000 fois l'autre. La dérive d'horloge fera son œuvre, les deux horloges seront très légèrement désynchronisées en permanence, et cette désynchronisation peut être utilisée pour produire des nombres aléatoires. Par exemple, on peut compter le nombre de cycles d'horloge produit par l'horloge rapide durant une période de l'horloge lente. Si ce nombre est pair, on produit un bit aléatoire qui vaut 1 , il vaut 0 si ce nombre est pair. Pour information, c'est exactement cette technique qui était utilisée dans l'''Intel 82802 Firmware Hub''. ===L'aléatoire généré par la tension d'alimentation=== Il existe d'autres solutions matérielles qui utilisent le bruit thermique. Tous les circuits électroniques de l'univers sont soumis à de microscopiques variations de température, dues à l'agitation thermique des atomes. Plus la température est élevée, plus les atomes qui composent les fils métalliques des circuits s'agitent. Vu que les particules d'un métal contiennent des charges électriques, ces vibrations font naître des variations de tensions assez infimes. Il suffit d'amplifier ces variations pour obtenir un résultat capable de représenter un zéro ou un 1. Ce principe a été utilisé sur des anciens processeurs Intel qui géraient l'instruction RDRAND, une instruction qui produisait un nombre aléatoire. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits compteurs et décompteurs | prevText=Les circuits compteurs et décompteurs | next=Les circuits de décalage et de rotation | nextText=Les circuits de décalage et de rotation }} </noinclude> g06kyu7flweq360thj34ye5f9ca0k8n 768086 768076 2026-06-18T17:11:05Z Mewtow 31375 /* Les compteurs en anneau : les compteurs one-hot */ 768086 wikitext text/x-wiki Dans le chapitre précédent, nous avons abordé les compteurs, des circuits qui mémorisent un nombre et l'incrémentent au besoin. Dans ce chapitre, nous allons voir d'autres circuits compteurs, bien différents de ceux du chapitre précédent. Ils ne comptent pas au sens commun du terme. A la place, ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Pour l'anecdote, le processeur Intel 8008, le tout premier microprocesseur 8 bits commercialisé, a utilisé ce genre de compteurs pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. De tels compteurs sont souvent basés sur un registre à décalage. L'idée est de boucler la sortie du registre à décalage sur sont entrée, parfois en insérant un circuit combinatoire entre les deux. C'est ce qui leur a valu le nom de '''compteurs à rétroaction''', un terme bien barbare pour dire que l'entrée est bouclée sur la sortie. Avant de poursuivre, je préfère faire un rappel sur les types de registre à décalage. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | PIPO || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. ==Les compteurs en anneau et de Johnson (SISO)== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un ''compteur one-hot''. La seconde possibilité, où le bit sortant est inversé, donne un compteur de Johnson. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ===Les compteurs en anneau : les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. Les compteurs en anneau sont beaucoup utilisés pour les diviseurs de fréquence. Si n'importe quel compteur fait l'affaire, il est cependant utile d'utiliser les compteurs les plus adaptés à la tâche. Il est rare que l'on doive diviser une fréquence par 50 ou par 100, par exemple. Un diviseur de fréquence divise une fréquence par N, avec N très petit : 4, 6, 8, 10, 12, etc. Or, les compteurs en anneau, sont particulièrement adaptés pour compter jusqu'à des valeurs assez faibles. Il est donc naturel d'utiliser un compteur en anneau dans un diviseur de fréquence. Le circuit obtenu est beaucoup plus simple qu’avec un compteur normal. Et c'est la raison pour laquelle les diviseurs de fréquence sont souvent conçus en utilisant des compteurs ''one-hot''. Plus on divise une fréquence par un N très petit, plus les compteurs auront d'avantages : très simples, demandent peu de portes logiques, sont très rapides, prennent peu de place, permettent de se passer de circuit comparateur. ===Les compteurs de Johnson : les compteurs unaires=== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. [[File:A simple sinusoid generator.jpg|centre|vignette|upright=2.5|Générateur de sinusoïde avec un compteur de Johnson.]] ==Les registres à décalage à rétroaction== Les '''registres à décalage à rétroaction''' sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ==La période d'un compteur à rétroaction== Un compteur est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ==L'initialisation d'un compteur à rétroaction== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==La génération de nombres pseudo-aléatoires== Les compteurs peuvent aussi être utilisés pour générer des nombres "aléatoires". Je dis aléatoires entre guillemets car ils ne sont pas vraiment aléatoires, mais s'en rapprochent suffisamment pour être considérés comme tels. Pour mettre en avant cela, on parle aussi de nombres "pseudo-aléatoires". De nombreuses situations demandent de générer des nombres pseudo-aléatoire de manière matérielle. Cela peut servir pour sélectionner une ligne de cache à remplacer lors d'un défaut de cache, pour implémenter des circuits cryptographiques, pour calculer la durée d'émission sur un bus Ethernet à la suite d'une collision, et j'en passe. Les méthodes que nous allons voir produisent un nombre pseudo-aléatoire un bit à la fois, à quelques exceptions près. Les circuits que nous allons voir fournissent un bit sur leur sortie et ce bit varie de manière assez aléatoire. Les bits en sortie du circuit sont accumulés dans un registre à décalage normal, pour former un nombre aléatoire. Nous appellerons ce registre : l'accumulateur. ===L'usage de registres à décalage à rétroaction=== [[File:Nonlinear-combo-generator.png|thumb|Nonlinear-combo-generator]] La première solution utilise des ''registres à décalages à rétroaction'', les fameux LSFR du chapitre précédent. Un LSFR seul ne fournit pas un aléatoire digne de ce nom, mais il est possible de combiner plusieurs LSFR pour obtenir une meilleure approximation de l'aléatoire. Avec cette technique, plusieurs registres à décalages à rétroaction sont reliés à un circuit combinatoire non-linéaire. Ce circuit prendra en entrée un (ou plusieurs) bit de chaque registre à décalage à rétroaction, et combinera ces bits pour fournir un bit de sortie. [[File:A5-1 GSM cipher.svg|centre|thumb|upright=2|Exemple avec trois LSFR différents, de taille différentes : le bit envoyé à l'accumulateur est un XOR du bit sortant des trois LSFR.]] Pour rendre le tout encore plus aléatoire, il est possible de cadencer les LSFR à des fréquences différentes. Cette technique est utilisée dans les générateurs ''stop-and-go'', ''alternative step'', et à ''shrinking''. * Le générateur ''alternative step'' utilise trois LSFR. Le premier commande un multiplexeur qui choisit la sortie parmi les deux restants. * Le générateur ''stop-and-go'' utilise deux LSFR. Le premier est relié à l'entrée d'horloge du second et le bit de sortie du second est utilisé comme résultat. Une technique similaire était utilisée dans les processeurs VIA C3, pour l'implémentation de leurs instructions cryptographiques. * Le ''shrinking generator'' utilise deux LSFR cadencés à des vitesses différentes. Si le bit de sortie du premier vaut 1, alors le bit de sortie du second est utilisé comme résultat. Par contre, si le bit de sortie du premier vaut 0, aucun bit n'est fourni en sortie, le bit de sortie du second registre est oublié. ===L'aléatoire généré par des ''timers'' ou des compteurs d'horloge=== Au-delà des LSFR, il est possible d'utiliser des compteurs pour générer du pseudo-aléatoire. Par exemple, une technique très simple utilise un simple ''timer''. Si on a besoin d'un nombre pseudo-aléatoire, il suffit de lire le ''timer'' et d'utiliser le nombre lu comme nombre pseudo-aléatoire. Si le délai entre deux demandes est irrégulier, le résultat semblera aléatoire. Mais il s'agit là d'une technique assez peu fiable dans le monde réel et seules quelques applications bien spécifiques se satisfont de cette méthode. Une solution un peu plus fiable utilise ce qu'on appelle la '''dérive de l'horloge'''. Il faut savoir qu'un signal d'horloge n'est jamais vraiment très précis. Une horloge censée tourner à 1 Ghz ne tournera pas en permanence à 1Ghz exactement, mais verra sa fréquence varier de quelques Hz ou Khz de manière irrégulière. Ces variations peuvent venir de variations aléatoires de température, des variations de tension, des perturbations électromagnétiques, ou à des phénomènes assez compliqués qui peuvent se produire dans tout circuit électrique (comme le ''shot noise''). L'idée la plus simple utilise deux horloges : une horloge lente et une horloge rapide, dont la fréquence est un multiple de l'autre. Par exemple, on peut choisir une fréquence de 1 Mhz et une autre de 100 Hz : la fréquence la plus grande est égale à 10000 fois l'autre. La dérive d'horloge fera son œuvre, les deux horloges seront très légèrement désynchronisées en permanence, et cette désynchronisation peut être utilisée pour produire des nombres aléatoires. Par exemple, on peut compter le nombre de cycles d'horloge produit par l'horloge rapide durant une période de l'horloge lente. Si ce nombre est pair, on produit un bit aléatoire qui vaut 1 , il vaut 0 si ce nombre est pair. Pour information, c'est exactement cette technique qui était utilisée dans l'''Intel 82802 Firmware Hub''. ===L'aléatoire généré par la tension d'alimentation=== Il existe d'autres solutions matérielles qui utilisent le bruit thermique. Tous les circuits électroniques de l'univers sont soumis à de microscopiques variations de température, dues à l'agitation thermique des atomes. Plus la température est élevée, plus les atomes qui composent les fils métalliques des circuits s'agitent. Vu que les particules d'un métal contiennent des charges électriques, ces vibrations font naître des variations de tensions assez infimes. Il suffit d'amplifier ces variations pour obtenir un résultat capable de représenter un zéro ou un 1. Ce principe a été utilisé sur des anciens processeurs Intel qui géraient l'instruction RDRAND, une instruction qui produisait un nombre aléatoire. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits compteurs et décompteurs | prevText=Les circuits compteurs et décompteurs | next=Les circuits de décalage et de rotation | nextText=Les circuits de décalage et de rotation }} </noinclude> j95j13k0y2b7z7g7ah06htemck6vxpd 768089 768086 2026-06-18T17:12:24Z Mewtow 31375 /* Les compteurs en anneau : les compteurs one-hot */ 768089 wikitext text/x-wiki Dans le chapitre précédent, nous avons abordé les compteurs, des circuits qui mémorisent un nombre et l'incrémentent au besoin. Dans ce chapitre, nous allons voir d'autres circuits compteurs, bien différents de ceux du chapitre précédent. Ils ne comptent pas au sens commun du terme. A la place, ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Pour l'anecdote, le processeur Intel 8008, le tout premier microprocesseur 8 bits commercialisé, a utilisé ce genre de compteurs pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. De tels compteurs sont souvent basés sur un registre à décalage. L'idée est de boucler la sortie du registre à décalage sur sont entrée, parfois en insérant un circuit combinatoire entre les deux. C'est ce qui leur a valu le nom de '''compteurs à rétroaction''', un terme bien barbare pour dire que l'entrée est bouclée sur la sortie. Avant de poursuivre, je préfère faire un rappel sur les types de registre à décalage. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | PIPO || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. ==Les compteurs en anneau et de Johnson (SISO)== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un ''compteur one-hot''. La seconde possibilité, où le bit sortant est inversé, donne un compteur de Johnson. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ===Les compteurs en anneau : les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ===Les compteurs de Johnson : les compteurs unaires=== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. [[File:A simple sinusoid generator.jpg|centre|vignette|upright=2.5|Générateur de sinusoïde avec un compteur de Johnson.]] ==Les registres à décalage à rétroaction== Les '''registres à décalage à rétroaction''' sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ==La période d'un compteur à rétroaction== Un compteur est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ==L'initialisation d'un compteur à rétroaction== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==La génération de nombres pseudo-aléatoires== Les compteurs peuvent aussi être utilisés pour générer des nombres "aléatoires". Je dis aléatoires entre guillemets car ils ne sont pas vraiment aléatoires, mais s'en rapprochent suffisamment pour être considérés comme tels. Pour mettre en avant cela, on parle aussi de nombres "pseudo-aléatoires". De nombreuses situations demandent de générer des nombres pseudo-aléatoire de manière matérielle. Cela peut servir pour sélectionner une ligne de cache à remplacer lors d'un défaut de cache, pour implémenter des circuits cryptographiques, pour calculer la durée d'émission sur un bus Ethernet à la suite d'une collision, et j'en passe. Les méthodes que nous allons voir produisent un nombre pseudo-aléatoire un bit à la fois, à quelques exceptions près. Les circuits que nous allons voir fournissent un bit sur leur sortie et ce bit varie de manière assez aléatoire. Les bits en sortie du circuit sont accumulés dans un registre à décalage normal, pour former un nombre aléatoire. Nous appellerons ce registre : l'accumulateur. ===L'usage de registres à décalage à rétroaction=== [[File:Nonlinear-combo-generator.png|thumb|Nonlinear-combo-generator]] La première solution utilise des ''registres à décalages à rétroaction'', les fameux LSFR du chapitre précédent. Un LSFR seul ne fournit pas un aléatoire digne de ce nom, mais il est possible de combiner plusieurs LSFR pour obtenir une meilleure approximation de l'aléatoire. Avec cette technique, plusieurs registres à décalages à rétroaction sont reliés à un circuit combinatoire non-linéaire. Ce circuit prendra en entrée un (ou plusieurs) bit de chaque registre à décalage à rétroaction, et combinera ces bits pour fournir un bit de sortie. [[File:A5-1 GSM cipher.svg|centre|thumb|upright=2|Exemple avec trois LSFR différents, de taille différentes : le bit envoyé à l'accumulateur est un XOR du bit sortant des trois LSFR.]] Pour rendre le tout encore plus aléatoire, il est possible de cadencer les LSFR à des fréquences différentes. Cette technique est utilisée dans les générateurs ''stop-and-go'', ''alternative step'', et à ''shrinking''. * Le générateur ''alternative step'' utilise trois LSFR. Le premier commande un multiplexeur qui choisit la sortie parmi les deux restants. * Le générateur ''stop-and-go'' utilise deux LSFR. Le premier est relié à l'entrée d'horloge du second et le bit de sortie du second est utilisé comme résultat. Une technique similaire était utilisée dans les processeurs VIA C3, pour l'implémentation de leurs instructions cryptographiques. * Le ''shrinking generator'' utilise deux LSFR cadencés à des vitesses différentes. Si le bit de sortie du premier vaut 1, alors le bit de sortie du second est utilisé comme résultat. Par contre, si le bit de sortie du premier vaut 0, aucun bit n'est fourni en sortie, le bit de sortie du second registre est oublié. ===L'aléatoire généré par des ''timers'' ou des compteurs d'horloge=== Au-delà des LSFR, il est possible d'utiliser des compteurs pour générer du pseudo-aléatoire. Par exemple, une technique très simple utilise un simple ''timer''. Si on a besoin d'un nombre pseudo-aléatoire, il suffit de lire le ''timer'' et d'utiliser le nombre lu comme nombre pseudo-aléatoire. Si le délai entre deux demandes est irrégulier, le résultat semblera aléatoire. Mais il s'agit là d'une technique assez peu fiable dans le monde réel et seules quelques applications bien spécifiques se satisfont de cette méthode. Une solution un peu plus fiable utilise ce qu'on appelle la '''dérive de l'horloge'''. Il faut savoir qu'un signal d'horloge n'est jamais vraiment très précis. Une horloge censée tourner à 1 Ghz ne tournera pas en permanence à 1Ghz exactement, mais verra sa fréquence varier de quelques Hz ou Khz de manière irrégulière. Ces variations peuvent venir de variations aléatoires de température, des variations de tension, des perturbations électromagnétiques, ou à des phénomènes assez compliqués qui peuvent se produire dans tout circuit électrique (comme le ''shot noise''). L'idée la plus simple utilise deux horloges : une horloge lente et une horloge rapide, dont la fréquence est un multiple de l'autre. Par exemple, on peut choisir une fréquence de 1 Mhz et une autre de 100 Hz : la fréquence la plus grande est égale à 10000 fois l'autre. La dérive d'horloge fera son œuvre, les deux horloges seront très légèrement désynchronisées en permanence, et cette désynchronisation peut être utilisée pour produire des nombres aléatoires. Par exemple, on peut compter le nombre de cycles d'horloge produit par l'horloge rapide durant une période de l'horloge lente. Si ce nombre est pair, on produit un bit aléatoire qui vaut 1 , il vaut 0 si ce nombre est pair. Pour information, c'est exactement cette technique qui était utilisée dans l'''Intel 82802 Firmware Hub''. ===L'aléatoire généré par la tension d'alimentation=== Il existe d'autres solutions matérielles qui utilisent le bruit thermique. Tous les circuits électroniques de l'univers sont soumis à de microscopiques variations de température, dues à l'agitation thermique des atomes. Plus la température est élevée, plus les atomes qui composent les fils métalliques des circuits s'agitent. Vu que les particules d'un métal contiennent des charges électriques, ces vibrations font naître des variations de tensions assez infimes. Il suffit d'amplifier ces variations pour obtenir un résultat capable de représenter un zéro ou un 1. Ce principe a été utilisé sur des anciens processeurs Intel qui géraient l'instruction RDRAND, une instruction qui produisait un nombre aléatoire. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits compteurs et décompteurs | prevText=Les circuits compteurs et décompteurs | next=Les circuits de décalage et de rotation | nextText=Les circuits de décalage et de rotation }} </noinclude> g06kyu7flweq360thj34ye5f9ca0k8n 768090 768089 2026-06-18T19:03:05Z Mewtow 31375 /* L'initialisation d'un compteur à rétroaction */ 768090 wikitext text/x-wiki Dans le chapitre précédent, nous avons abordé les compteurs, des circuits qui mémorisent un nombre et l'incrémentent au besoin. Dans ce chapitre, nous allons voir d'autres circuits compteurs, bien différents de ceux du chapitre précédent. Ils ne comptent pas au sens commun du terme. A la place, ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Pour l'anecdote, le processeur Intel 8008, le tout premier microprocesseur 8 bits commercialisé, a utilisé ce genre de compteurs pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. De tels compteurs sont souvent basés sur un registre à décalage. L'idée est de boucler la sortie du registre à décalage sur sont entrée, parfois en insérant un circuit combinatoire entre les deux. C'est ce qui leur a valu le nom de '''compteurs à rétroaction''', un terme bien barbare pour dire que l'entrée est bouclée sur la sortie. Avant de poursuivre, je préfère faire un rappel sur les types de registre à décalage. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | PIPO || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. ==Les compteurs en anneau et de Johnson (SISO)== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un ''compteur one-hot''. La seconde possibilité, où le bit sortant est inversé, donne un compteur de Johnson. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ===Les compteurs en anneau : les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ===Les compteurs de Johnson : les compteurs unaires=== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. [[File:A simple sinusoid generator.jpg|centre|vignette|upright=2.5|Générateur de sinusoïde avec un compteur de Johnson.]] ==Les registres à décalage à rétroaction== Les '''registres à décalage à rétroaction''' sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ==La période d'un compteur à rétroaction== Un compteur est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs, ce qui fait qu'il finira par repasser par une valeur qu'il aura déjà parcourue. Une fois qu'il repassera par cette valeur, son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celuid es compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==La génération de nombres pseudo-aléatoires== Les compteurs peuvent aussi être utilisés pour générer des nombres "aléatoires". Je dis aléatoires entre guillemets car ils ne sont pas vraiment aléatoires, mais s'en rapprochent suffisamment pour être considérés comme tels. Pour mettre en avant cela, on parle aussi de nombres "pseudo-aléatoires". De nombreuses situations demandent de générer des nombres pseudo-aléatoire de manière matérielle. Cela peut servir pour sélectionner une ligne de cache à remplacer lors d'un défaut de cache, pour implémenter des circuits cryptographiques, pour calculer la durée d'émission sur un bus Ethernet à la suite d'une collision, et j'en passe. Les méthodes que nous allons voir produisent un nombre pseudo-aléatoire un bit à la fois, à quelques exceptions près. Les circuits que nous allons voir fournissent un bit sur leur sortie et ce bit varie de manière assez aléatoire. Les bits en sortie du circuit sont accumulés dans un registre à décalage normal, pour former un nombre aléatoire. Nous appellerons ce registre : l'accumulateur. ===L'usage de registres à décalage à rétroaction=== [[File:Nonlinear-combo-generator.png|thumb|Nonlinear-combo-generator]] La première solution utilise des ''registres à décalages à rétroaction'', les fameux LSFR du chapitre précédent. Un LSFR seul ne fournit pas un aléatoire digne de ce nom, mais il est possible de combiner plusieurs LSFR pour obtenir une meilleure approximation de l'aléatoire. Avec cette technique, plusieurs registres à décalages à rétroaction sont reliés à un circuit combinatoire non-linéaire. Ce circuit prendra en entrée un (ou plusieurs) bit de chaque registre à décalage à rétroaction, et combinera ces bits pour fournir un bit de sortie. [[File:A5-1 GSM cipher.svg|centre|thumb|upright=2|Exemple avec trois LSFR différents, de taille différentes : le bit envoyé à l'accumulateur est un XOR du bit sortant des trois LSFR.]] Pour rendre le tout encore plus aléatoire, il est possible de cadencer les LSFR à des fréquences différentes. Cette technique est utilisée dans les générateurs ''stop-and-go'', ''alternative step'', et à ''shrinking''. * Le générateur ''alternative step'' utilise trois LSFR. Le premier commande un multiplexeur qui choisit la sortie parmi les deux restants. * Le générateur ''stop-and-go'' utilise deux LSFR. Le premier est relié à l'entrée d'horloge du second et le bit de sortie du second est utilisé comme résultat. Une technique similaire était utilisée dans les processeurs VIA C3, pour l'implémentation de leurs instructions cryptographiques. * Le ''shrinking generator'' utilise deux LSFR cadencés à des vitesses différentes. Si le bit de sortie du premier vaut 1, alors le bit de sortie du second est utilisé comme résultat. Par contre, si le bit de sortie du premier vaut 0, aucun bit n'est fourni en sortie, le bit de sortie du second registre est oublié. ===L'aléatoire généré par des ''timers'' ou des compteurs d'horloge=== Au-delà des LSFR, il est possible d'utiliser des compteurs pour générer du pseudo-aléatoire. Par exemple, une technique très simple utilise un simple ''timer''. Si on a besoin d'un nombre pseudo-aléatoire, il suffit de lire le ''timer'' et d'utiliser le nombre lu comme nombre pseudo-aléatoire. Si le délai entre deux demandes est irrégulier, le résultat semblera aléatoire. Mais il s'agit là d'une technique assez peu fiable dans le monde réel et seules quelques applications bien spécifiques se satisfont de cette méthode. Une solution un peu plus fiable utilise ce qu'on appelle la '''dérive de l'horloge'''. Il faut savoir qu'un signal d'horloge n'est jamais vraiment très précis. Une horloge censée tourner à 1 Ghz ne tournera pas en permanence à 1Ghz exactement, mais verra sa fréquence varier de quelques Hz ou Khz de manière irrégulière. Ces variations peuvent venir de variations aléatoires de température, des variations de tension, des perturbations électromagnétiques, ou à des phénomènes assez compliqués qui peuvent se produire dans tout circuit électrique (comme le ''shot noise''). L'idée la plus simple utilise deux horloges : une horloge lente et une horloge rapide, dont la fréquence est un multiple de l'autre. Par exemple, on peut choisir une fréquence de 1 Mhz et une autre de 100 Hz : la fréquence la plus grande est égale à 10000 fois l'autre. La dérive d'horloge fera son œuvre, les deux horloges seront très légèrement désynchronisées en permanence, et cette désynchronisation peut être utilisée pour produire des nombres aléatoires. Par exemple, on peut compter le nombre de cycles d'horloge produit par l'horloge rapide durant une période de l'horloge lente. Si ce nombre est pair, on produit un bit aléatoire qui vaut 1 , il vaut 0 si ce nombre est pair. Pour information, c'est exactement cette technique qui était utilisée dans l'''Intel 82802 Firmware Hub''. ===L'aléatoire généré par la tension d'alimentation=== Il existe d'autres solutions matérielles qui utilisent le bruit thermique. Tous les circuits électroniques de l'univers sont soumis à de microscopiques variations de température, dues à l'agitation thermique des atomes. Plus la température est élevée, plus les atomes qui composent les fils métalliques des circuits s'agitent. Vu que les particules d'un métal contiennent des charges électriques, ces vibrations font naître des variations de tensions assez infimes. Il suffit d'amplifier ces variations pour obtenir un résultat capable de représenter un zéro ou un 1. Ce principe a été utilisé sur des anciens processeurs Intel qui géraient l'instruction RDRAND, une instruction qui produisait un nombre aléatoire. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits compteurs et décompteurs | prevText=Les circuits compteurs et décompteurs | next=Les circuits de décalage et de rotation | nextText=Les circuits de décalage et de rotation }} </noinclude> ram6xrl5jopg32ov97bvbq83vzj2map 768092 768090 2026-06-18T19:09:26Z Mewtow 31375 /* La période d'un compteur à rétroaction */ 768092 wikitext text/x-wiki Dans le chapitre précédent, nous avons abordé les compteurs, des circuits qui mémorisent un nombre et l'incrémentent au besoin. Dans ce chapitre, nous allons voir d'autres circuits compteurs, bien différents de ceux du chapitre précédent. Ils ne comptent pas au sens commun du terme. A la place, ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Pour l'anecdote, le processeur Intel 8008, le tout premier microprocesseur 8 bits commercialisé, a utilisé ce genre de compteurs pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. De tels compteurs sont souvent basés sur un registre à décalage. L'idée est de boucler la sortie du registre à décalage sur sont entrée, parfois en insérant un circuit combinatoire entre les deux. C'est ce qui leur a valu le nom de '''compteurs à rétroaction''', un terme bien barbare pour dire que l'entrée est bouclée sur la sortie. Avant de poursuivre, je préfère faire un rappel sur les types de registre à décalage. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | PIPO || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. ==Les compteurs en anneau et de Johnson (SISO)== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un ''compteur one-hot''. La seconde possibilité, où le bit sortant est inversé, donne un compteur de Johnson. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ===Les compteurs en anneau : les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ===Les compteurs de Johnson : les compteurs unaires=== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. [[File:A simple sinusoid generator.jpg|centre|vignette|upright=2.5|Générateur de sinusoïde avec un compteur de Johnson.]] ==Les registres à décalage à rétroaction== Les '''registres à décalage à rétroaction''' sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ==Les généralités des compteurs à rétroaction== Quelques propriétés sont communes à tous les compteurs, qu'il s'agisse des compteurs à rétroaction ou des compteurs en anneau, voire des compteurs normaux du chapitre précédent. Un compteur est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs. Et ces deux propriétés sont source de comportements qu'on va détailler ci-dessous. Certains compteurs ont des '''valeurs interdites''', qui bloquent le compteur. Concrètement, une fois que le décompte arrive sur cette valeur, le compteur reste bloqué sur cette valeur. La valeur suivante, calculée par le compteur, est cette valeur elle-même. Tous les compteurs ne sont pas dans ce cas, de nombreux compteurs n'ont pas de valeur interdites. ===La période d'un compteur à rétroaction=== Si le compteur est initialisé correctement, il passera d'une valeur à l'autre, sans tomber sur une valeur interdite. Dans ce cas, il finira par repasser par une valeur qu'il aura déjà parcourue et son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celui des compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==La génération de nombres pseudo-aléatoires== Les compteurs peuvent aussi être utilisés pour générer des nombres "aléatoires". Je dis aléatoires entre guillemets car ils ne sont pas vraiment aléatoires, mais s'en rapprochent suffisamment pour être considérés comme tels. Pour mettre en avant cela, on parle aussi de nombres "pseudo-aléatoires". De nombreuses situations demandent de générer des nombres pseudo-aléatoire de manière matérielle. Cela peut servir pour sélectionner une ligne de cache à remplacer lors d'un défaut de cache, pour implémenter des circuits cryptographiques, pour calculer la durée d'émission sur un bus Ethernet à la suite d'une collision, et j'en passe. Les méthodes que nous allons voir produisent un nombre pseudo-aléatoire un bit à la fois, à quelques exceptions près. Les circuits que nous allons voir fournissent un bit sur leur sortie et ce bit varie de manière assez aléatoire. Les bits en sortie du circuit sont accumulés dans un registre à décalage normal, pour former un nombre aléatoire. Nous appellerons ce registre : l'accumulateur. ===L'usage de registres à décalage à rétroaction=== [[File:Nonlinear-combo-generator.png|thumb|Nonlinear-combo-generator]] La première solution utilise des ''registres à décalages à rétroaction'', les fameux LSFR du chapitre précédent. Un LSFR seul ne fournit pas un aléatoire digne de ce nom, mais il est possible de combiner plusieurs LSFR pour obtenir une meilleure approximation de l'aléatoire. Avec cette technique, plusieurs registres à décalages à rétroaction sont reliés à un circuit combinatoire non-linéaire. Ce circuit prendra en entrée un (ou plusieurs) bit de chaque registre à décalage à rétroaction, et combinera ces bits pour fournir un bit de sortie. [[File:A5-1 GSM cipher.svg|centre|thumb|upright=2|Exemple avec trois LSFR différents, de taille différentes : le bit envoyé à l'accumulateur est un XOR du bit sortant des trois LSFR.]] Pour rendre le tout encore plus aléatoire, il est possible de cadencer les LSFR à des fréquences différentes. Cette technique est utilisée dans les générateurs ''stop-and-go'', ''alternative step'', et à ''shrinking''. * Le générateur ''alternative step'' utilise trois LSFR. Le premier commande un multiplexeur qui choisit la sortie parmi les deux restants. * Le générateur ''stop-and-go'' utilise deux LSFR. Le premier est relié à l'entrée d'horloge du second et le bit de sortie du second est utilisé comme résultat. Une technique similaire était utilisée dans les processeurs VIA C3, pour l'implémentation de leurs instructions cryptographiques. * Le ''shrinking generator'' utilise deux LSFR cadencés à des vitesses différentes. Si le bit de sortie du premier vaut 1, alors le bit de sortie du second est utilisé comme résultat. Par contre, si le bit de sortie du premier vaut 0, aucun bit n'est fourni en sortie, le bit de sortie du second registre est oublié. ===L'aléatoire généré par des ''timers'' ou des compteurs d'horloge=== Au-delà des LSFR, il est possible d'utiliser des compteurs pour générer du pseudo-aléatoire. Par exemple, une technique très simple utilise un simple ''timer''. Si on a besoin d'un nombre pseudo-aléatoire, il suffit de lire le ''timer'' et d'utiliser le nombre lu comme nombre pseudo-aléatoire. Si le délai entre deux demandes est irrégulier, le résultat semblera aléatoire. Mais il s'agit là d'une technique assez peu fiable dans le monde réel et seules quelques applications bien spécifiques se satisfont de cette méthode. Une solution un peu plus fiable utilise ce qu'on appelle la '''dérive de l'horloge'''. Il faut savoir qu'un signal d'horloge n'est jamais vraiment très précis. Une horloge censée tourner à 1 Ghz ne tournera pas en permanence à 1Ghz exactement, mais verra sa fréquence varier de quelques Hz ou Khz de manière irrégulière. Ces variations peuvent venir de variations aléatoires de température, des variations de tension, des perturbations électromagnétiques, ou à des phénomènes assez compliqués qui peuvent se produire dans tout circuit électrique (comme le ''shot noise''). L'idée la plus simple utilise deux horloges : une horloge lente et une horloge rapide, dont la fréquence est un multiple de l'autre. Par exemple, on peut choisir une fréquence de 1 Mhz et une autre de 100 Hz : la fréquence la plus grande est égale à 10000 fois l'autre. La dérive d'horloge fera son œuvre, les deux horloges seront très légèrement désynchronisées en permanence, et cette désynchronisation peut être utilisée pour produire des nombres aléatoires. Par exemple, on peut compter le nombre de cycles d'horloge produit par l'horloge rapide durant une période de l'horloge lente. Si ce nombre est pair, on produit un bit aléatoire qui vaut 1 , il vaut 0 si ce nombre est pair. Pour information, c'est exactement cette technique qui était utilisée dans l'''Intel 82802 Firmware Hub''. ===L'aléatoire généré par la tension d'alimentation=== Il existe d'autres solutions matérielles qui utilisent le bruit thermique. Tous les circuits électroniques de l'univers sont soumis à de microscopiques variations de température, dues à l'agitation thermique des atomes. Plus la température est élevée, plus les atomes qui composent les fils métalliques des circuits s'agitent. Vu que les particules d'un métal contiennent des charges électriques, ces vibrations font naître des variations de tensions assez infimes. Il suffit d'amplifier ces variations pour obtenir un résultat capable de représenter un zéro ou un 1. Ce principe a été utilisé sur des anciens processeurs Intel qui géraient l'instruction RDRAND, une instruction qui produisait un nombre aléatoire. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits compteurs et décompteurs | prevText=Les circuits compteurs et décompteurs | next=Les circuits de décalage et de rotation | nextText=Les circuits de décalage et de rotation }} </noinclude> mtnjlm1wo27wb7vq618hjfrh5wqgjhd 768093 768092 2026-06-18T19:10:43Z Mewtow 31375 /* Les généralités des compteurs à rétroaction */ 768093 wikitext text/x-wiki Dans le chapitre précédent, nous avons abordé les compteurs, des circuits qui mémorisent un nombre et l'incrémentent au besoin. Dans ce chapitre, nous allons voir d'autres circuits compteurs, bien différents de ceux du chapitre précédent. Ils ne comptent pas au sens commun du terme. A la place, ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Pour l'anecdote, le processeur Intel 8008, le tout premier microprocesseur 8 bits commercialisé, a utilisé ce genre de compteurs pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. De tels compteurs sont souvent basés sur un registre à décalage. L'idée est de boucler la sortie du registre à décalage sur sont entrée, parfois en insérant un circuit combinatoire entre les deux. C'est ce qui leur a valu le nom de '''compteurs à rétroaction''', un terme bien barbare pour dire que l'entrée est bouclée sur la sortie. Avant de poursuivre, je préfère faire un rappel sur les types de registre à décalage. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | PIPO || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. ==Les compteurs en anneau et de Johnson (SISO)== Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un ''compteur one-hot''. La seconde possibilité, où le bit sortant est inversé, donne un compteur de Johnson. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ===Les compteurs en anneau : les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ===Les compteurs de Johnson : les compteurs unaires=== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. [[File:A simple sinusoid generator.jpg|centre|vignette|upright=2.5|Générateur de sinusoïde avec un compteur de Johnson.]] ==Les registres à décalage à rétroaction== Les '''registres à décalage à rétroaction''' sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Étudions en premier lieu le cas des '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage, et plus précisément des registres à décalage SIPO. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ==Les généralités sur les compteurs à rétroaction== Quelques propriétés sont communes à tous les compteurs, qu'il s'agisse des compteurs à rétroaction ou des compteurs en anneau, voire des compteurs normaux du chapitre précédent. Un compteur est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs. Et ces deux propriétés sont source de comportements qu'on va détailler ci-dessous. Certains compteurs ont des '''valeurs interdites''', qui bloquent le compteur. Concrètement, une fois que le décompte arrive sur cette valeur, le compteur reste bloqué sur cette valeur. La valeur suivante, calculée par le compteur, est cette valeur elle-même. Tous les compteurs ne sont pas dans ce cas, de nombreux compteurs n'ont pas de valeur interdites. ===La période d'un compteur à rétroaction=== Si le compteur est initialisé correctement, il passera d'une valeur à l'autre, sans tomber sur une valeur interdite. Dans ce cas, il finira par repasser par une valeur qu'il aura déjà parcourue et son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celui des compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==La génération de nombres pseudo-aléatoires== Les compteurs peuvent aussi être utilisés pour générer des nombres "aléatoires". Je dis aléatoires entre guillemets car ils ne sont pas vraiment aléatoires, mais s'en rapprochent suffisamment pour être considérés comme tels. Pour mettre en avant cela, on parle aussi de nombres "pseudo-aléatoires". De nombreuses situations demandent de générer des nombres pseudo-aléatoire de manière matérielle. Cela peut servir pour sélectionner une ligne de cache à remplacer lors d'un défaut de cache, pour implémenter des circuits cryptographiques, pour calculer la durée d'émission sur un bus Ethernet à la suite d'une collision, et j'en passe. Les méthodes que nous allons voir produisent un nombre pseudo-aléatoire un bit à la fois, à quelques exceptions près. Les circuits que nous allons voir fournissent un bit sur leur sortie et ce bit varie de manière assez aléatoire. Les bits en sortie du circuit sont accumulés dans un registre à décalage normal, pour former un nombre aléatoire. Nous appellerons ce registre : l'accumulateur. ===L'usage de registres à décalage à rétroaction=== [[File:Nonlinear-combo-generator.png|thumb|Nonlinear-combo-generator]] La première solution utilise des ''registres à décalages à rétroaction'', les fameux LSFR du chapitre précédent. Un LSFR seul ne fournit pas un aléatoire digne de ce nom, mais il est possible de combiner plusieurs LSFR pour obtenir une meilleure approximation de l'aléatoire. Avec cette technique, plusieurs registres à décalages à rétroaction sont reliés à un circuit combinatoire non-linéaire. Ce circuit prendra en entrée un (ou plusieurs) bit de chaque registre à décalage à rétroaction, et combinera ces bits pour fournir un bit de sortie. [[File:A5-1 GSM cipher.svg|centre|thumb|upright=2|Exemple avec trois LSFR différents, de taille différentes : le bit envoyé à l'accumulateur est un XOR du bit sortant des trois LSFR.]] Pour rendre le tout encore plus aléatoire, il est possible de cadencer les LSFR à des fréquences différentes. Cette technique est utilisée dans les générateurs ''stop-and-go'', ''alternative step'', et à ''shrinking''. * Le générateur ''alternative step'' utilise trois LSFR. Le premier commande un multiplexeur qui choisit la sortie parmi les deux restants. * Le générateur ''stop-and-go'' utilise deux LSFR. Le premier est relié à l'entrée d'horloge du second et le bit de sortie du second est utilisé comme résultat. Une technique similaire était utilisée dans les processeurs VIA C3, pour l'implémentation de leurs instructions cryptographiques. * Le ''shrinking generator'' utilise deux LSFR cadencés à des vitesses différentes. Si le bit de sortie du premier vaut 1, alors le bit de sortie du second est utilisé comme résultat. Par contre, si le bit de sortie du premier vaut 0, aucun bit n'est fourni en sortie, le bit de sortie du second registre est oublié. ===L'aléatoire généré par des ''timers'' ou des compteurs d'horloge=== Au-delà des LSFR, il est possible d'utiliser des compteurs pour générer du pseudo-aléatoire. Par exemple, une technique très simple utilise un simple ''timer''. Si on a besoin d'un nombre pseudo-aléatoire, il suffit de lire le ''timer'' et d'utiliser le nombre lu comme nombre pseudo-aléatoire. Si le délai entre deux demandes est irrégulier, le résultat semblera aléatoire. Mais il s'agit là d'une technique assez peu fiable dans le monde réel et seules quelques applications bien spécifiques se satisfont de cette méthode. Une solution un peu plus fiable utilise ce qu'on appelle la '''dérive de l'horloge'''. Il faut savoir qu'un signal d'horloge n'est jamais vraiment très précis. Une horloge censée tourner à 1 Ghz ne tournera pas en permanence à 1Ghz exactement, mais verra sa fréquence varier de quelques Hz ou Khz de manière irrégulière. Ces variations peuvent venir de variations aléatoires de température, des variations de tension, des perturbations électromagnétiques, ou à des phénomènes assez compliqués qui peuvent se produire dans tout circuit électrique (comme le ''shot noise''). L'idée la plus simple utilise deux horloges : une horloge lente et une horloge rapide, dont la fréquence est un multiple de l'autre. Par exemple, on peut choisir une fréquence de 1 Mhz et une autre de 100 Hz : la fréquence la plus grande est égale à 10000 fois l'autre. La dérive d'horloge fera son œuvre, les deux horloges seront très légèrement désynchronisées en permanence, et cette désynchronisation peut être utilisée pour produire des nombres aléatoires. Par exemple, on peut compter le nombre de cycles d'horloge produit par l'horloge rapide durant une période de l'horloge lente. Si ce nombre est pair, on produit un bit aléatoire qui vaut 1 , il vaut 0 si ce nombre est pair. Pour information, c'est exactement cette technique qui était utilisée dans l'''Intel 82802 Firmware Hub''. ===L'aléatoire généré par la tension d'alimentation=== Il existe d'autres solutions matérielles qui utilisent le bruit thermique. Tous les circuits électroniques de l'univers sont soumis à de microscopiques variations de température, dues à l'agitation thermique des atomes. Plus la température est élevée, plus les atomes qui composent les fils métalliques des circuits s'agitent. Vu que les particules d'un métal contiennent des charges électriques, ces vibrations font naître des variations de tensions assez infimes. Il suffit d'amplifier ces variations pour obtenir un résultat capable de représenter un zéro ou un 1. Ce principe a été utilisé sur des anciens processeurs Intel qui géraient l'instruction RDRAND, une instruction qui produisait un nombre aléatoire. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits compteurs et décompteurs | prevText=Les circuits compteurs et décompteurs | next=Les circuits de décalage et de rotation | nextText=Les circuits de décalage et de rotation }} </noinclude> amo5a0hncc16sr2o9amf1x2crdtmzdg 768095 768093 2026-06-18T19:12:49Z Mewtow 31375 768095 wikitext text/x-wiki Dans le chapitre précédent, nous avons abordé les compteurs, des circuits qui mémorisent un nombre et l'incrémentent au besoin. Dans ce chapitre, nous allons voir d'autres circuits compteurs, bien différents de ceux du chapitre précédent. Ils ne comptent pas au sens commun du terme. A la place, ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Pour l'anecdote, le processeur Intel 8008, le tout premier microprocesseur 8 bits commercialisé, a utilisé ce genre de compteurs pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. De tels compteurs sont souvent basés sur un registre à décalage. L'idée est de boucler la sortie du registre à décalage sur sont entrée, parfois en insérant un circuit combinatoire entre les deux. C'est ce qui leur a valu le nom de '''compteurs à rétroaction''', un terme bien barbare pour dire que l'entrée est bouclée sur la sortie. ==Les différents types de compteurs à rétroaction== Avant de poursuivre, je préfère faire un rappel sur les types de registre à décalage. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | PIPO || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un ''compteur one-hot''. La seconde possibilité, où le bit sortant est inversé, donne un compteur de Johnson. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ===Les compteurs en anneau : les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ===Les compteurs de Johnson : les compteurs unaires=== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. [[File:A simple sinusoid generator.jpg|centre|vignette|upright=2.5|Générateur de sinusoïde avec un compteur de Johnson.]] ===Les registres à décalage à rétroaction=== Les compteurs en anneau sont opposés aux '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Là où les compteurs en anneau utilisent un registre SISO, les LSFR sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ==Les généralités sur les compteurs à rétroaction== Quelques propriétés sont communes à tous les compteurs, qu'il s'agisse des compteurs à rétroaction ou des compteurs en anneau, voire des compteurs normaux du chapitre précédent. Un compteur est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs. Et ces deux propriétés sont source de comportements qu'on va détailler ci-dessous. Certains compteurs ont des '''valeurs interdites''', qui bloquent le compteur. Concrètement, une fois que le décompte arrive sur cette valeur, le compteur reste bloqué sur cette valeur. La valeur suivante, calculée par le compteur, est cette valeur elle-même. Tous les compteurs ne sont pas dans ce cas, de nombreux compteurs n'ont pas de valeur interdites. ===La période d'un compteur à rétroaction=== Si le compteur est initialisé correctement, il passera d'une valeur à l'autre, sans tomber sur une valeur interdite. Dans ce cas, il finira par repasser par une valeur qu'il aura déjà parcourue et son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celui des compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==La génération de nombres pseudo-aléatoires== Les compteurs peuvent aussi être utilisés pour générer des nombres "aléatoires". Je dis aléatoires entre guillemets car ils ne sont pas vraiment aléatoires, mais s'en rapprochent suffisamment pour être considérés comme tels. Pour mettre en avant cela, on parle aussi de nombres "pseudo-aléatoires". De nombreuses situations demandent de générer des nombres pseudo-aléatoire de manière matérielle. Cela peut servir pour sélectionner une ligne de cache à remplacer lors d'un défaut de cache, pour implémenter des circuits cryptographiques, pour calculer la durée d'émission sur un bus Ethernet à la suite d'une collision, et j'en passe. Les méthodes que nous allons voir produisent un nombre pseudo-aléatoire un bit à la fois, à quelques exceptions près. Les circuits que nous allons voir fournissent un bit sur leur sortie et ce bit varie de manière assez aléatoire. Les bits en sortie du circuit sont accumulés dans un registre à décalage normal, pour former un nombre aléatoire. Nous appellerons ce registre : l'accumulateur. ===L'usage de registres à décalage à rétroaction=== [[File:Nonlinear-combo-generator.png|thumb|Nonlinear-combo-generator]] La première solution utilise des ''registres à décalages à rétroaction'', les fameux LSFR du chapitre précédent. Un LSFR seul ne fournit pas un aléatoire digne de ce nom, mais il est possible de combiner plusieurs LSFR pour obtenir une meilleure approximation de l'aléatoire. Avec cette technique, plusieurs registres à décalages à rétroaction sont reliés à un circuit combinatoire non-linéaire. Ce circuit prendra en entrée un (ou plusieurs) bit de chaque registre à décalage à rétroaction, et combinera ces bits pour fournir un bit de sortie. [[File:A5-1 GSM cipher.svg|centre|thumb|upright=2|Exemple avec trois LSFR différents, de taille différentes : le bit envoyé à l'accumulateur est un XOR du bit sortant des trois LSFR.]] Pour rendre le tout encore plus aléatoire, il est possible de cadencer les LSFR à des fréquences différentes. Cette technique est utilisée dans les générateurs ''stop-and-go'', ''alternative step'', et à ''shrinking''. * Le générateur ''alternative step'' utilise trois LSFR. Le premier commande un multiplexeur qui choisit la sortie parmi les deux restants. * Le générateur ''stop-and-go'' utilise deux LSFR. Le premier est relié à l'entrée d'horloge du second et le bit de sortie du second est utilisé comme résultat. Une technique similaire était utilisée dans les processeurs VIA C3, pour l'implémentation de leurs instructions cryptographiques. * Le ''shrinking generator'' utilise deux LSFR cadencés à des vitesses différentes. Si le bit de sortie du premier vaut 1, alors le bit de sortie du second est utilisé comme résultat. Par contre, si le bit de sortie du premier vaut 0, aucun bit n'est fourni en sortie, le bit de sortie du second registre est oublié. ===L'aléatoire généré par des ''timers'' ou des compteurs d'horloge=== Au-delà des LSFR, il est possible d'utiliser des compteurs pour générer du pseudo-aléatoire. Par exemple, une technique très simple utilise un simple ''timer''. Si on a besoin d'un nombre pseudo-aléatoire, il suffit de lire le ''timer'' et d'utiliser le nombre lu comme nombre pseudo-aléatoire. Si le délai entre deux demandes est irrégulier, le résultat semblera aléatoire. Mais il s'agit là d'une technique assez peu fiable dans le monde réel et seules quelques applications bien spécifiques se satisfont de cette méthode. Une solution un peu plus fiable utilise ce qu'on appelle la '''dérive de l'horloge'''. Il faut savoir qu'un signal d'horloge n'est jamais vraiment très précis. Une horloge censée tourner à 1 Ghz ne tournera pas en permanence à 1Ghz exactement, mais verra sa fréquence varier de quelques Hz ou Khz de manière irrégulière. Ces variations peuvent venir de variations aléatoires de température, des variations de tension, des perturbations électromagnétiques, ou à des phénomènes assez compliqués qui peuvent se produire dans tout circuit électrique (comme le ''shot noise''). L'idée la plus simple utilise deux horloges : une horloge lente et une horloge rapide, dont la fréquence est un multiple de l'autre. Par exemple, on peut choisir une fréquence de 1 Mhz et une autre de 100 Hz : la fréquence la plus grande est égale à 10000 fois l'autre. La dérive d'horloge fera son œuvre, les deux horloges seront très légèrement désynchronisées en permanence, et cette désynchronisation peut être utilisée pour produire des nombres aléatoires. Par exemple, on peut compter le nombre de cycles d'horloge produit par l'horloge rapide durant une période de l'horloge lente. Si ce nombre est pair, on produit un bit aléatoire qui vaut 1 , il vaut 0 si ce nombre est pair. Pour information, c'est exactement cette technique qui était utilisée dans l'''Intel 82802 Firmware Hub''. ===L'aléatoire généré par la tension d'alimentation=== Il existe d'autres solutions matérielles qui utilisent le bruit thermique. Tous les circuits électroniques de l'univers sont soumis à de microscopiques variations de température, dues à l'agitation thermique des atomes. Plus la température est élevée, plus les atomes qui composent les fils métalliques des circuits s'agitent. Vu que les particules d'un métal contiennent des charges électriques, ces vibrations font naître des variations de tensions assez infimes. Il suffit d'amplifier ces variations pour obtenir un résultat capable de représenter un zéro ou un 1. Ce principe a été utilisé sur des anciens processeurs Intel qui géraient l'instruction RDRAND, une instruction qui produisait un nombre aléatoire. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits compteurs et décompteurs | prevText=Les circuits compteurs et décompteurs | next=Les circuits de décalage et de rotation | nextText=Les circuits de décalage et de rotation }} </noinclude> hyxvrxacjokazabq4v2bb0f0jx9eoyy 768096 768095 2026-06-18T19:13:08Z Mewtow 31375 /* Les compteurs en anneau : les compteurs one-hot */ 768096 wikitext text/x-wiki Dans le chapitre précédent, nous avons abordé les compteurs, des circuits qui mémorisent un nombre et l'incrémentent au besoin. Dans ce chapitre, nous allons voir d'autres circuits compteurs, bien différents de ceux du chapitre précédent. Ils ne comptent pas au sens commun du terme. A la place, ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Pour l'anecdote, le processeur Intel 8008, le tout premier microprocesseur 8 bits commercialisé, a utilisé ce genre de compteurs pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. De tels compteurs sont souvent basés sur un registre à décalage. L'idée est de boucler la sortie du registre à décalage sur sont entrée, parfois en insérant un circuit combinatoire entre les deux. C'est ce qui leur a valu le nom de '''compteurs à rétroaction''', un terme bien barbare pour dire que l'entrée est bouclée sur la sortie. ==Les différents types de compteurs à rétroaction== Avant de poursuivre, je préfère faire un rappel sur les types de registre à décalage. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | PIPO || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un ''compteur one-hot''. La seconde possibilité, où le bit sortant est inversé, donne un compteur de Johnson. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ===Les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ===Les compteurs de Johnson : les compteurs unaires=== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. [[File:A simple sinusoid generator.jpg|centre|vignette|upright=2.5|Générateur de sinusoïde avec un compteur de Johnson.]] ===Les registres à décalage à rétroaction=== Les compteurs en anneau sont opposés aux '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Là où les compteurs en anneau utilisent un registre SISO, les LSFR sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ==Les généralités sur les compteurs à rétroaction== Quelques propriétés sont communes à tous les compteurs, qu'il s'agisse des compteurs à rétroaction ou des compteurs en anneau, voire des compteurs normaux du chapitre précédent. Un compteur est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs. Et ces deux propriétés sont source de comportements qu'on va détailler ci-dessous. Certains compteurs ont des '''valeurs interdites''', qui bloquent le compteur. Concrètement, une fois que le décompte arrive sur cette valeur, le compteur reste bloqué sur cette valeur. La valeur suivante, calculée par le compteur, est cette valeur elle-même. Tous les compteurs ne sont pas dans ce cas, de nombreux compteurs n'ont pas de valeur interdites. ===La période d'un compteur à rétroaction=== Si le compteur est initialisé correctement, il passera d'une valeur à l'autre, sans tomber sur une valeur interdite. Dans ce cas, il finira par repasser par une valeur qu'il aura déjà parcourue et son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celui des compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==La génération de nombres pseudo-aléatoires== Les compteurs peuvent aussi être utilisés pour générer des nombres "aléatoires". Je dis aléatoires entre guillemets car ils ne sont pas vraiment aléatoires, mais s'en rapprochent suffisamment pour être considérés comme tels. Pour mettre en avant cela, on parle aussi de nombres "pseudo-aléatoires". De nombreuses situations demandent de générer des nombres pseudo-aléatoire de manière matérielle. Cela peut servir pour sélectionner une ligne de cache à remplacer lors d'un défaut de cache, pour implémenter des circuits cryptographiques, pour calculer la durée d'émission sur un bus Ethernet à la suite d'une collision, et j'en passe. Les méthodes que nous allons voir produisent un nombre pseudo-aléatoire un bit à la fois, à quelques exceptions près. Les circuits que nous allons voir fournissent un bit sur leur sortie et ce bit varie de manière assez aléatoire. Les bits en sortie du circuit sont accumulés dans un registre à décalage normal, pour former un nombre aléatoire. Nous appellerons ce registre : l'accumulateur. ===L'usage de registres à décalage à rétroaction=== [[File:Nonlinear-combo-generator.png|thumb|Nonlinear-combo-generator]] La première solution utilise des ''registres à décalages à rétroaction'', les fameux LSFR du chapitre précédent. Un LSFR seul ne fournit pas un aléatoire digne de ce nom, mais il est possible de combiner plusieurs LSFR pour obtenir une meilleure approximation de l'aléatoire. Avec cette technique, plusieurs registres à décalages à rétroaction sont reliés à un circuit combinatoire non-linéaire. Ce circuit prendra en entrée un (ou plusieurs) bit de chaque registre à décalage à rétroaction, et combinera ces bits pour fournir un bit de sortie. [[File:A5-1 GSM cipher.svg|centre|thumb|upright=2|Exemple avec trois LSFR différents, de taille différentes : le bit envoyé à l'accumulateur est un XOR du bit sortant des trois LSFR.]] Pour rendre le tout encore plus aléatoire, il est possible de cadencer les LSFR à des fréquences différentes. Cette technique est utilisée dans les générateurs ''stop-and-go'', ''alternative step'', et à ''shrinking''. * Le générateur ''alternative step'' utilise trois LSFR. Le premier commande un multiplexeur qui choisit la sortie parmi les deux restants. * Le générateur ''stop-and-go'' utilise deux LSFR. Le premier est relié à l'entrée d'horloge du second et le bit de sortie du second est utilisé comme résultat. Une technique similaire était utilisée dans les processeurs VIA C3, pour l'implémentation de leurs instructions cryptographiques. * Le ''shrinking generator'' utilise deux LSFR cadencés à des vitesses différentes. Si le bit de sortie du premier vaut 1, alors le bit de sortie du second est utilisé comme résultat. Par contre, si le bit de sortie du premier vaut 0, aucun bit n'est fourni en sortie, le bit de sortie du second registre est oublié. ===L'aléatoire généré par des ''timers'' ou des compteurs d'horloge=== Au-delà des LSFR, il est possible d'utiliser des compteurs pour générer du pseudo-aléatoire. Par exemple, une technique très simple utilise un simple ''timer''. Si on a besoin d'un nombre pseudo-aléatoire, il suffit de lire le ''timer'' et d'utiliser le nombre lu comme nombre pseudo-aléatoire. Si le délai entre deux demandes est irrégulier, le résultat semblera aléatoire. Mais il s'agit là d'une technique assez peu fiable dans le monde réel et seules quelques applications bien spécifiques se satisfont de cette méthode. Une solution un peu plus fiable utilise ce qu'on appelle la '''dérive de l'horloge'''. Il faut savoir qu'un signal d'horloge n'est jamais vraiment très précis. Une horloge censée tourner à 1 Ghz ne tournera pas en permanence à 1Ghz exactement, mais verra sa fréquence varier de quelques Hz ou Khz de manière irrégulière. Ces variations peuvent venir de variations aléatoires de température, des variations de tension, des perturbations électromagnétiques, ou à des phénomènes assez compliqués qui peuvent se produire dans tout circuit électrique (comme le ''shot noise''). L'idée la plus simple utilise deux horloges : une horloge lente et une horloge rapide, dont la fréquence est un multiple de l'autre. Par exemple, on peut choisir une fréquence de 1 Mhz et une autre de 100 Hz : la fréquence la plus grande est égale à 10000 fois l'autre. La dérive d'horloge fera son œuvre, les deux horloges seront très légèrement désynchronisées en permanence, et cette désynchronisation peut être utilisée pour produire des nombres aléatoires. Par exemple, on peut compter le nombre de cycles d'horloge produit par l'horloge rapide durant une période de l'horloge lente. Si ce nombre est pair, on produit un bit aléatoire qui vaut 1 , il vaut 0 si ce nombre est pair. Pour information, c'est exactement cette technique qui était utilisée dans l'''Intel 82802 Firmware Hub''. ===L'aléatoire généré par la tension d'alimentation=== Il existe d'autres solutions matérielles qui utilisent le bruit thermique. Tous les circuits électroniques de l'univers sont soumis à de microscopiques variations de température, dues à l'agitation thermique des atomes. Plus la température est élevée, plus les atomes qui composent les fils métalliques des circuits s'agitent. Vu que les particules d'un métal contiennent des charges électriques, ces vibrations font naître des variations de tensions assez infimes. Il suffit d'amplifier ces variations pour obtenir un résultat capable de représenter un zéro ou un 1. Ce principe a été utilisé sur des anciens processeurs Intel qui géraient l'instruction RDRAND, une instruction qui produisait un nombre aléatoire. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits compteurs et décompteurs | prevText=Les circuits compteurs et décompteurs | next=Les circuits de décalage et de rotation | nextText=Les circuits de décalage et de rotation }} </noinclude> 5ttd6hv2klmmw5569fyk29jki8tiiio 768097 768096 2026-06-18T19:13:26Z Mewtow 31375 /* Les compteurs de Johnson : les compteurs unaires */ 768097 wikitext text/x-wiki Dans le chapitre précédent, nous avons abordé les compteurs, des circuits qui mémorisent un nombre et l'incrémentent au besoin. Dans ce chapitre, nous allons voir d'autres circuits compteurs, bien différents de ceux du chapitre précédent. Ils ne comptent pas au sens commun du terme. A la place, ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Pour l'anecdote, le processeur Intel 8008, le tout premier microprocesseur 8 bits commercialisé, a utilisé ce genre de compteurs pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. De tels compteurs sont souvent basés sur un registre à décalage. L'idée est de boucler la sortie du registre à décalage sur sont entrée, parfois en insérant un circuit combinatoire entre les deux. C'est ce qui leur a valu le nom de '''compteurs à rétroaction''', un terme bien barbare pour dire que l'entrée est bouclée sur la sortie. ==Les différents types de compteurs à rétroaction== Avant de poursuivre, je préfère faire un rappel sur les types de registre à décalage. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | PIPO || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omets dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un ''compteur one-hot''. La seconde possibilité, où le bit sortant est inversé, donne un compteur de Johnson. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ===Les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations car nous en reparlerons dans la suite du cours. ===Les compteurs de Johnson=== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. [[File:A simple sinusoid generator.jpg|centre|vignette|upright=2.5|Générateur de sinusoïde avec un compteur de Johnson.]] ===Les registres à décalage à rétroaction=== Les compteurs en anneau sont opposés aux '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Là où les compteurs en anneau utilisent un registre SISO, les LSFR sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage. A rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ==Les généralités sur les compteurs à rétroaction== Quelques propriétés sont communes à tous les compteurs, qu'il s'agisse des compteurs à rétroaction ou des compteurs en anneau, voire des compteurs normaux du chapitre précédent. Un compteur est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs. Et ces deux propriétés sont source de comportements qu'on va détailler ci-dessous. Certains compteurs ont des '''valeurs interdites''', qui bloquent le compteur. Concrètement, une fois que le décompte arrive sur cette valeur, le compteur reste bloqué sur cette valeur. La valeur suivante, calculée par le compteur, est cette valeur elle-même. Tous les compteurs ne sont pas dans ce cas, de nombreux compteurs n'ont pas de valeur interdites. ===La période d'un compteur à rétroaction=== Si le compteur est initialisé correctement, il passera d'une valeur à l'autre, sans tomber sur une valeur interdite. Dans ce cas, il finira par repasser par une valeur qu'il aura déjà parcourue et son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celui des compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==La génération de nombres pseudo-aléatoires== Les compteurs peuvent aussi être utilisés pour générer des nombres "aléatoires". Je dis aléatoires entre guillemets car ils ne sont pas vraiment aléatoires, mais s'en rapprochent suffisamment pour être considérés comme tels. Pour mettre en avant cela, on parle aussi de nombres "pseudo-aléatoires". De nombreuses situations demandent de générer des nombres pseudo-aléatoire de manière matérielle. Cela peut servir pour sélectionner une ligne de cache à remplacer lors d'un défaut de cache, pour implémenter des circuits cryptographiques, pour calculer la durée d'émission sur un bus Ethernet à la suite d'une collision, et j'en passe. Les méthodes que nous allons voir produisent un nombre pseudo-aléatoire un bit à la fois, à quelques exceptions près. Les circuits que nous allons voir fournissent un bit sur leur sortie et ce bit varie de manière assez aléatoire. Les bits en sortie du circuit sont accumulés dans un registre à décalage normal, pour former un nombre aléatoire. Nous appellerons ce registre : l'accumulateur. ===L'usage de registres à décalage à rétroaction=== [[File:Nonlinear-combo-generator.png|thumb|Nonlinear-combo-generator]] La première solution utilise des ''registres à décalages à rétroaction'', les fameux LSFR du chapitre précédent. Un LSFR seul ne fournit pas un aléatoire digne de ce nom, mais il est possible de combiner plusieurs LSFR pour obtenir une meilleure approximation de l'aléatoire. Avec cette technique, plusieurs registres à décalages à rétroaction sont reliés à un circuit combinatoire non-linéaire. Ce circuit prendra en entrée un (ou plusieurs) bit de chaque registre à décalage à rétroaction, et combinera ces bits pour fournir un bit de sortie. [[File:A5-1 GSM cipher.svg|centre|thumb|upright=2|Exemple avec trois LSFR différents, de taille différentes : le bit envoyé à l'accumulateur est un XOR du bit sortant des trois LSFR.]] Pour rendre le tout encore plus aléatoire, il est possible de cadencer les LSFR à des fréquences différentes. Cette technique est utilisée dans les générateurs ''stop-and-go'', ''alternative step'', et à ''shrinking''. * Le générateur ''alternative step'' utilise trois LSFR. Le premier commande un multiplexeur qui choisit la sortie parmi les deux restants. * Le générateur ''stop-and-go'' utilise deux LSFR. Le premier est relié à l'entrée d'horloge du second et le bit de sortie du second est utilisé comme résultat. Une technique similaire était utilisée dans les processeurs VIA C3, pour l'implémentation de leurs instructions cryptographiques. * Le ''shrinking generator'' utilise deux LSFR cadencés à des vitesses différentes. Si le bit de sortie du premier vaut 1, alors le bit de sortie du second est utilisé comme résultat. Par contre, si le bit de sortie du premier vaut 0, aucun bit n'est fourni en sortie, le bit de sortie du second registre est oublié. ===L'aléatoire généré par des ''timers'' ou des compteurs d'horloge=== Au-delà des LSFR, il est possible d'utiliser des compteurs pour générer du pseudo-aléatoire. Par exemple, une technique très simple utilise un simple ''timer''. Si on a besoin d'un nombre pseudo-aléatoire, il suffit de lire le ''timer'' et d'utiliser le nombre lu comme nombre pseudo-aléatoire. Si le délai entre deux demandes est irrégulier, le résultat semblera aléatoire. Mais il s'agit là d'une technique assez peu fiable dans le monde réel et seules quelques applications bien spécifiques se satisfont de cette méthode. Une solution un peu plus fiable utilise ce qu'on appelle la '''dérive de l'horloge'''. Il faut savoir qu'un signal d'horloge n'est jamais vraiment très précis. Une horloge censée tourner à 1 Ghz ne tournera pas en permanence à 1Ghz exactement, mais verra sa fréquence varier de quelques Hz ou Khz de manière irrégulière. Ces variations peuvent venir de variations aléatoires de température, des variations de tension, des perturbations électromagnétiques, ou à des phénomènes assez compliqués qui peuvent se produire dans tout circuit électrique (comme le ''shot noise''). L'idée la plus simple utilise deux horloges : une horloge lente et une horloge rapide, dont la fréquence est un multiple de l'autre. Par exemple, on peut choisir une fréquence de 1 Mhz et une autre de 100 Hz : la fréquence la plus grande est égale à 10000 fois l'autre. La dérive d'horloge fera son œuvre, les deux horloges seront très légèrement désynchronisées en permanence, et cette désynchronisation peut être utilisée pour produire des nombres aléatoires. Par exemple, on peut compter le nombre de cycles d'horloge produit par l'horloge rapide durant une période de l'horloge lente. Si ce nombre est pair, on produit un bit aléatoire qui vaut 1 , il vaut 0 si ce nombre est pair. Pour information, c'est exactement cette technique qui était utilisée dans l'''Intel 82802 Firmware Hub''. ===L'aléatoire généré par la tension d'alimentation=== Il existe d'autres solutions matérielles qui utilisent le bruit thermique. Tous les circuits électroniques de l'univers sont soumis à de microscopiques variations de température, dues à l'agitation thermique des atomes. Plus la température est élevée, plus les atomes qui composent les fils métalliques des circuits s'agitent. Vu que les particules d'un métal contiennent des charges électriques, ces vibrations font naître des variations de tensions assez infimes. Il suffit d'amplifier ces variations pour obtenir un résultat capable de représenter un zéro ou un 1. Ce principe a été utilisé sur des anciens processeurs Intel qui géraient l'instruction RDRAND, une instruction qui produisait un nombre aléatoire. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits compteurs et décompteurs | prevText=Les circuits compteurs et décompteurs | next=Les circuits de décalage et de rotation | nextText=Les circuits de décalage et de rotation }} </noinclude> m2gvhe446ki40tu2kihyawyjyc7cdy0 768098 768097 2026-06-18T19:14:31Z Mewtow 31375 768098 wikitext text/x-wiki Dans le chapitre précédent, nous avons abordé les compteurs, des circuits qui mémorisent un nombre et l'incrémentent au besoin. Dans ce chapitre, nous allons voir d'autres circuits compteurs, bien différents de ceux du chapitre précédent. Ils ne comptent pas au sens commun du terme. À la place, ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. Pour l'anecdote, le processeur Intel 8008, le tout premier microprocesseur 8 bits commercialisé, a utilisé ce genre de compteurs pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. De tels compteurs sont souvent basés sur un registre à décalage. L'idée est de boucler la sortie du registre à décalage sur son entrée, parfois en insérant un circuit combinatoire entre les deux. C'est ce qui leur a valu le nom de '''compteurs à rétroaction''', un terme bien barbare pour dire que l'entrée est bouclée sur la sortie. ==Les différents types de compteurs à rétroaction== Avant de poursuivre, je préfère faire un rappel sur les types de registre à décalage. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | PIPO || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omet dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi, car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un ''compteur one-hot''. La seconde possibilité, où le bit sortant est inversé, donne un compteur de Johnson. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ===Les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations, car nous en reparlerons dans la suite du cours. ===Les compteurs de Johnson=== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. [[File:A simple sinusoid generator.jpg|centre|vignette|upright=2.5|Générateur de sinusoïde avec un compteur de Johnson.]] ===Les registres à décalage à rétroaction=== Les compteurs en anneau sont opposés aux '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Là où les compteurs en anneau utilisent un registre SISO, les LSFR sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage. À rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ==Les généralités sur les compteurs à rétroaction== Quelques propriétés sont communes à tous les compteurs, qu'il s'agisse des compteurs à rétroaction ou des compteurs en anneau, voire des compteurs normaux du chapitre précédent. Un compteur est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs. Et ces deux propriétés sont source de comportements qu'on va détailler ci-dessous. Certains compteurs ont des '''valeurs interdites''', qui bloquent le compteur. Concrètement, une fois que le décompte arrive sur cette valeur, le compteur reste bloqué sur cette valeur. La valeur suivante, calculée par le compteur, est cette valeur elle-même. Tous les compteurs ne sont pas dans ce cas, de nombreux compteurs n'ont pas de valeur interdite. ===La période d'un compteur à rétroaction=== Si le compteur est initialisé correctement, il passera d'une valeur à l'autre, sans tomber sur une valeur interdite. Dans ce cas, il finira par repasser par une valeur qu'il aura déjà parcourue et son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celui des compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==La génération de nombres pseudo-aléatoires== Les compteurs peuvent aussi être utilisés pour générer des nombres "aléatoires". Je dis aléatoires entre guillemets, car ils ne sont pas vraiment aléatoires, mais s'en rapprochent suffisamment pour être considérés comme tels. Pour mettre en avant cela, on parle aussi de nombres "pseudo-aléatoires". De nombreuses situations demandent de générer des nombres pseudo-aléatoire de manière matérielle. Cela peut servir pour sélectionner une ligne de cache à remplacer lors d'un défaut de cache, pour implémenter des circuits cryptographiques, pour calculer la durée d'émission sur un bus Ethernet à la suite d'une collision, et j'en passe. Les méthodes que nous allons voir produisent un nombre pseudo-aléatoire un bit à la fois, à quelques exceptions près. Les circuits que nous allons voir fournissent un bit sur leur sortie et ce bit varie de manière assez aléatoire. Les bits en sortie du circuit sont accumulés dans un registre à décalage normal, pour former un nombre aléatoire. Nous appellerons ce registre : l'accumulateur. ===L'usage de registres à décalage à rétroaction=== [[File:Nonlinear-combo-generator.png|thumb|Nonlinear-combo-generator]] La première solution utilise des ''registres à décalages à rétroaction'', les fameux LSFR du chapitre précédent. Un LSFR seul ne fournit pas un aléatoire digne de ce nom, mais il est possible de combiner plusieurs LSFR pour obtenir une meilleure approximation de l'aléatoire. Avec cette technique, plusieurs registres à décalages à rétroaction sont reliés à un circuit combinatoire non-linéaire. Ce circuit prendra en entrée un (ou plusieurs) bit de chaque registre à décalage à rétroaction, et combinera ces bits pour fournir un bit de sortie. [[File:A5-1 GSM cipher.svg|centre|thumb|upright=2|Exemple avec trois LSFR différents, de tailles différentes : le bit envoyé à l'accumulateur est un XOR du bit sortant des trois LSFR.]] Pour rendre le tout encore plus aléatoire, il est possible de cadencer les LSFR à des fréquences différentes. Cette technique est utilisée dans les générateurs ''stop-and-go'', ''alternative step'', et à ''shrinking''. * Le générateur ''alternative step'' utilise trois LSFR. Le premier commande un multiplexeur qui choisit la sortie parmi les deux restants. * Le générateur ''stop-and-go'' utilise deux LSFR. Le premier est relié à l'entrée d'horloge du second et le bit de sortie du second est utilisé comme résultat. Une technique similaire était utilisée dans les processeurs VIA C3, pour l'implémentation de leurs instructions cryptographiques. * Le ''shrinking generator'' utilise deux LSFR cadencés à des vitesses différentes. Si le bit de sortie du premier vaut 1, alors le bit de sortie du second est utilisé comme résultat. Par contre, si le bit de sortie du premier vaut 0, aucun bit n'est fourni en sortie, le bit de sortie du second registre est oublié. ===L'aléatoire généré par des ''timers'' ou des compteurs d'horloge=== Au-delà des LSFR, il est possible d'utiliser des compteurs pour générer du pseudo-aléatoire. Par exemple, une technique très simple utilise un simple ''timer''. Si on a besoin d'un nombre pseudo-aléatoire, il suffit de lire le ''timer'' et d'utiliser le nombre lu comme nombre pseudo-aléatoire. Si le délai entre deux demandes est irrégulier, le résultat semblera aléatoire. Mais il s'agit là d'une technique assez peu fiable dans le monde réel et seules quelques applications bien spécifiques se satisfont de cette méthode. Une solution un peu plus fiable utilise ce qu'on appelle la '''dérive de l'horloge'''. Il faut savoir qu'un signal d'horloge n'est jamais vraiment très précis. Une horloge censée tourner à 1 Ghz ne tournera pas en permanence à 1Ghz exactement, mais verra sa fréquence varier de quelques Hz ou Khz de manière irrégulière. Ces variations peuvent venir de variations aléatoires de température, des variations de tension, des perturbations électromagnétiques, ou à des phénomènes assez compliqués qui peuvent se produire dans tout circuit électrique (comme le ''shot noise''). L'idée la plus simple utilise deux horloges : une horloge lente et une horloge rapide, dont la fréquence est un multiple de l'autre. Par exemple, on peut choisir une fréquence de 1 Mhz et une autre de 100 Hz : la fréquence la plus grande est égale à 10000 fois l'autre. La dérive d'horloge fera son œuvre, les deux horloges seront très légèrement désynchronisées en permanence, et cette désynchronisation peut être utilisée pour produire des nombres aléatoires. Par exemple, on peut compter le nombre de cycles d'horloge produit par l'horloge rapide durant une période de l'horloge lente. Si ce nombre est pair, on produit un bit aléatoire qui vaut 1 , il vaut 0 si ce nombre est pair. Pour information, c'est exactement cette technique qui était utilisée dans l'''Intel 82802 Firmware Hub''. ===L'aléatoire généré par la tension d'alimentation=== Il existe d'autres solutions matérielles qui utilisent le bruit thermique. Tous les circuits électroniques de l'univers sont soumis à de microscopiques variations de température, dues à l'agitation thermique des atomes. Plus la température est élevée, plus les atomes qui composent les fils métalliques des circuits s'agitent. Vu que les particules d'un métal contiennent des charges électriques, ces vibrations font naître des variations de tensions assez infimes. Il suffit d'amplifier ces variations pour obtenir un résultat capable de représenter un zéro ou un 1. Ce principe a été utilisé sur des anciens processeurs Intel qui géraient l'instruction RDRAND, une instruction qui produisait un nombre aléatoire. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits compteurs et décompteurs | prevText=Les circuits compteurs et décompteurs | next=Les circuits de décalage et de rotation | nextText=Les circuits de décalage et de rotation }} </noinclude> 0w1whe5zirjdzzqg0qfwhzkxa63s0iz 768110 768098 2026-06-18T20:03:33Z Mewtow 31375 768110 wikitext text/x-wiki Dans le chapitre précédent, nous avons abordé les compteurs, des circuits qui mémorisent un nombre et l'incrémentent au besoin. Dans ce chapitre, nous allons voir d'autres circuits compteurs, bien différents de ceux du chapitre précédent. Ils ne comptent pas au sens commun du terme. À la place, ils sont conçus pour dérouler une suite de nombres bien précise, prédéterminée lors de la création du compteur. Par exemple, on peut créer un compteur qui sort la suite de nombres 4,7,6,1,0,3,2,5 en boucle, ce qui peut servir pour fabriquer des suites de nombres pseudo-aléatoires, par exemple. : Pour l'anecdote, le processeur Intel 8008, le tout premier microprocesseur 8 bits commercialisé, a utilisé ce genre de compteurs pour le pointeur de pile, pour économiser quelques portes logiques. Ces compteurs implémentaient la séquence suivante : 000, 001, 010, 101, 011, 111, 110, 100. De tels compteurs sont souvent basés sur un registre à décalage. L'idée est de boucler la sortie du registre à décalage sur son entrée, parfois en insérant un circuit combinatoire entre les deux. C'est ce qui leur a valu le nom de '''compteurs à rétroaction''', un terme bien barbare pour dire que l'entrée est bouclée sur la sortie. ==Les différents types de compteurs à rétroaction== Avant de poursuivre, je préfère faire un rappel sur les types de registre à décalage. Pour rappel, un registre à décalage dispose d'une entrée et d'une sortie. L'entrée peut être de deux types : soit une entrée série qui prend 1 bit, soit une entrée parallèle qui prend un nombre. Il en est de même pour la sortie, qui peut être série ou parallèle. En combinant les deux, cela donne quatre possibilités qui portent les noms de registres à décalage PIPO, PISO, SIPO et SISO (P pour parallèle, S pour série, I pour''Input'', O pour ''Output''). {|class="wikitable" |+ Classification des registres à décalage |- ! ! Entrée parallèle ! Entrée série |- ! Sortie parallèle | PIPO || SIPO |- ! Sortie série | PISO || SISO |} Les registres PIPO ne sont pas des registres à décalage, on les omet dans ce qui suit. Les trois types restants de registres à décalage permettent de créer des compteurs. Les compteurs en question ne portent pas de noms proprement dit, à l'exception de certains compteurs basés sur un registre SISO appelés des compteurs en anneau, et encore cette dénomination est légèrement impropre. Les compteurs basés sur des registres à décalage SISO sont aussi appelés des '''compteurs en anneau'''. Ils sont appelés ainsi, car le bit sortant du registre est renvoyé sur son entrée. Précisément, le bit entrant dans le registre à décalage est calculé à partir du bit sortant. Et il n'y a pas 36 façons de faire ce calcul : soit le bit sortant est laissé tel quel, soit il est inversé. La première possibilité, où le bit entrant est égal au bit sortant, donne un ''compteur one-hot''. La seconde possibilité, où le bit sortant est inversé, donne un compteur de Johnson. Les deux sont très différents, et ne fonctionnent pas du tout pareil. ===Les compteurs ''one-hot''=== Les '''compteurs ''one-hot''''' sont appelés ainsi, car ils permettent de compter dans une représentation des nombres appelée la représentation ''one-hot''. Pour rappel, dans une telle représentation, un seul bit est à 1 pendant que les autres sont à 0. Les entiers sont codés de la manière suivante : le nombre N est encodé en mettant le énième bit à 1, avec la condition que l'on commence à compteur à partir de zéro. Il est important de remarquer que dans cette représentation, le zéro est n'est PAS codé en mettant tous les bits à 0, la valeur 0000...0000 est une valeur interdite. À la place, le zéro est codé en mettant le bit de poids faible à 1. Pour N bits, on peut encoder seulement N valeurs, dont le zéro. {| class="wikitable" border="1" |- ! Décimal !! Binaire !! ''One-hot'' |- | 0 || 000 || 00000001 |- | 1 || 001 || 00000010 |- | 2 || 010 || 00000100 |- | 3 || 011 || 00001000 |- | 4 || 100 || 00010000 |- | 5 || 101 || 00100000 |- | 6 || 110 || 01000000 |- | 7 || 111 || 10000000 |} Un compteur en représentation ''one-hot'' contient un nombre codé de cette manière, qui est incrémenté ou décrémenté si besoin. Pour donner un exemple, la séquence d'un compteur en anneau de 4 bits est : * 0001 (0) ; * 0010 (1) ; * 0100 (2) ; * 1000 (3) . Un compteur ''one-hot'' basique est composé d'un registre à décalage dont on boucle la sortie sur son entrée. En faisant cela, on garantit que le registre revient à zéro lors d'un débordement, zéro étant codé avec un 1 dans le bit de poids faible. Au passage, si vous ne mettez que des 0 dans un compteur en anneau, il restera bloqué pour toujours : décaler une suite de 0 donnera la même suite de 0. Initialiser un compteur ''one-hot'' demande donc quelques subtilités qu'on détaillera plus bas. [[File:Compteur en anneau de 4 bits.jpg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Faire des comparaisons avec ce type de compteur est très simple : le compteur contient la valeur N si le énième bit est à 1. Pas besoin d'utiliser de circuit comparateur, juste de lire un bit. Par contre, ce compteur n'est pas très économe en bascules. Imaginons que l'on veut un compteur qui compte jusqu'à une valeur N arbitraire : un compteur binaire normal utilisera environ <math>\log_2{(N)}</math> bascules, alors qu'un compteur ''one-hot'' demande N bascules. Mais si N est assez petit, l'économie de bascules est assez faible, alors que l'économie de circuits comparateurs/incrémenteurs l'est beaucoup plus. Il y a peu d'applications qui utilisent des compteurs en anneau. Ils étaient autrefois utilisés dans les tous premiers ordinateurs, notamment ceux qui géraient une représentation des nombres spécifique appelée la '''''Bi-quinary coded decimal'''''. Ils étaient aussi utilisés comme diviseurs de fréquence, comme on le verra dans le chapitre suivant. De nos jours, de tels compteurs sont utilisés dans les séquenceurs de processeurs, mais aussi dans les séquenceurs de certains périphériques, ou dans les circuits séquentiels simples qui se résument à des machines à états. Ils sont alors utilisés car très rapides, parfaitement adaptés au stockage de petites valeur, et surtout : ils n'ont pas besoin de circuit comparateur pour connaitre la valeur stockée dedans. Nous n'allons pas rentrer dans le détail de leurs utilisations, car nous en reparlerons dans la suite du cours. ===Les compteurs de Johnson=== Sur les '''compteurs de Johnson''', le bit sortant est inversé avant d'être bouclé sur l'entrée. [[File:Compteur de Johnson de 4 bits.jpg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] La séquence d'un compteur de Johnson de 4 bits est : * 1000 ; * 1100 ; * 1110 ; * 1111 ; * 0111 ; * 0011 ; * 0001 ; * 0000. Vous remarquerez peut-être que lorsque l'on passe d'une valeur à la suivante, seul un bit change d'état. Sachant cela, vous ferez peut-être le parallèle avec le code Gray vu dans les tout premiers chapitres, mais cela n'a rien à voir. Les valeurs d'un compteur Johnson ne suivent pas un code Gray classique, ni même une variante de celui-ci. Les compteurs qui comptent en code Gray sont foncièrement différents des compteurs Johnson. Une application des compteurs de Johnson, assez surprenante, est la fabrication d'un signal sinusoïdal. En combinant un compteur de Johnson, quelques résistances, et des circuits annexes, on peut facilement fabriquer un circuit qui émet un signal presque sinusoïdal (avec un effet d'escalier pas négligeable, mais bref). Les oscillateurs sinusoïdaux numériques les plus simples qui soient sont conçus ainsi. Quant aux compteurs en anneau, ils sont utilisés en lieu et place des compteurs normaux dans des circuits qui portent le nom de séquenceurs ou de machines à états, afin d'économiser quelques circuits. Mais nous en reparlerons dans le chapitre sur l'unité du contrôle du processeur. [[File:A simple sinusoid generator.jpg|centre|vignette|upright=2.5|Générateur de sinusoïde avec un compteur de Johnson.]] ===Les registres à décalage à rétroaction=== Les compteurs en anneau sont opposés aux '''registres à décalage à rétroaction linéaire'''. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Là où les compteurs en anneau utilisent un registre SISO, les LSFR sont fabriqués en prenant un registre à décalage SIPO ou PISO dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage. À rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ==Les généralités sur les compteurs à rétroaction== Quelques propriétés sont communes à tous les compteurs, qu'il s'agisse des compteurs à rétroaction ou des compteurs en anneau, voire des compteurs normaux du chapitre précédent. Un compteur est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs. Et ces deux propriétés sont source de comportements qu'on va détailler ci-dessous. Certains compteurs ont des '''valeurs interdites''', qui bloquent le compteur. Concrètement, une fois que le décompte arrive sur cette valeur, le compteur reste bloqué sur cette valeur. La valeur suivante, calculée par le compteur, est cette valeur elle-même. Tous les compteurs ne sont pas dans ce cas, de nombreux compteurs n'ont pas de valeur interdite. ===La période d'un compteur à rétroaction=== Si le compteur est initialisé correctement, il passera d'une valeur à l'autre, sans tomber sur une valeur interdite. Dans ce cas, il finira par repasser par une valeur qu'il aura déjà parcourue et son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celui des compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==La génération de nombres pseudo-aléatoires== Les compteurs peuvent aussi être utilisés pour générer des nombres "aléatoires". Je dis aléatoires entre guillemets, car ils ne sont pas vraiment aléatoires, mais s'en rapprochent suffisamment pour être considérés comme tels. Pour mettre en avant cela, on parle aussi de nombres "pseudo-aléatoires". De nombreuses situations demandent de générer des nombres pseudo-aléatoire de manière matérielle. Cela peut servir pour sélectionner une ligne de cache à remplacer lors d'un défaut de cache, pour implémenter des circuits cryptographiques, pour calculer la durée d'émission sur un bus Ethernet à la suite d'une collision, et j'en passe. Les méthodes que nous allons voir produisent un nombre pseudo-aléatoire un bit à la fois, à quelques exceptions près. Les circuits que nous allons voir fournissent un bit sur leur sortie et ce bit varie de manière assez aléatoire. Les bits en sortie du circuit sont accumulés dans un registre à décalage normal, pour former un nombre aléatoire. Nous appellerons ce registre : l'accumulateur. ===L'usage de registres à décalage à rétroaction=== [[File:Nonlinear-combo-generator.png|thumb|Nonlinear-combo-generator]] La première solution utilise des ''registres à décalages à rétroaction'', les fameux LSFR du chapitre précédent. Un LSFR seul ne fournit pas un aléatoire digne de ce nom, mais il est possible de combiner plusieurs LSFR pour obtenir une meilleure approximation de l'aléatoire. Avec cette technique, plusieurs registres à décalages à rétroaction sont reliés à un circuit combinatoire non-linéaire. Ce circuit prendra en entrée un (ou plusieurs) bit de chaque registre à décalage à rétroaction, et combinera ces bits pour fournir un bit de sortie. [[File:A5-1 GSM cipher.svg|centre|thumb|upright=2|Exemple avec trois LSFR différents, de tailles différentes : le bit envoyé à l'accumulateur est un XOR du bit sortant des trois LSFR.]] Pour rendre le tout encore plus aléatoire, il est possible de cadencer les LSFR à des fréquences différentes. Cette technique est utilisée dans les générateurs ''stop-and-go'', ''alternative step'', et à ''shrinking''. * Le générateur ''alternative step'' utilise trois LSFR. Le premier commande un multiplexeur qui choisit la sortie parmi les deux restants. * Le générateur ''stop-and-go'' utilise deux LSFR. Le premier est relié à l'entrée d'horloge du second et le bit de sortie du second est utilisé comme résultat. Une technique similaire était utilisée dans les processeurs VIA C3, pour l'implémentation de leurs instructions cryptographiques. * Le ''shrinking generator'' utilise deux LSFR cadencés à des vitesses différentes. Si le bit de sortie du premier vaut 1, alors le bit de sortie du second est utilisé comme résultat. Par contre, si le bit de sortie du premier vaut 0, aucun bit n'est fourni en sortie, le bit de sortie du second registre est oublié. ===L'aléatoire généré par des ''timers'' ou des compteurs d'horloge=== Au-delà des LSFR, il est possible d'utiliser des compteurs pour générer du pseudo-aléatoire. Par exemple, une technique très simple utilise un simple ''timer''. Si on a besoin d'un nombre pseudo-aléatoire, il suffit de lire le ''timer'' et d'utiliser le nombre lu comme nombre pseudo-aléatoire. Si le délai entre deux demandes est irrégulier, le résultat semblera aléatoire. Mais il s'agit là d'une technique assez peu fiable dans le monde réel et seules quelques applications bien spécifiques se satisfont de cette méthode. Une solution un peu plus fiable utilise ce qu'on appelle la '''dérive de l'horloge'''. Il faut savoir qu'un signal d'horloge n'est jamais vraiment très précis. Une horloge censée tourner à 1 Ghz ne tournera pas en permanence à 1Ghz exactement, mais verra sa fréquence varier de quelques Hz ou Khz de manière irrégulière. Ces variations peuvent venir de variations aléatoires de température, des variations de tension, des perturbations électromagnétiques, ou à des phénomènes assez compliqués qui peuvent se produire dans tout circuit électrique (comme le ''shot noise''). L'idée la plus simple utilise deux horloges : une horloge lente et une horloge rapide, dont la fréquence est un multiple de l'autre. Par exemple, on peut choisir une fréquence de 1 Mhz et une autre de 100 Hz : la fréquence la plus grande est égale à 10000 fois l'autre. La dérive d'horloge fera son œuvre, les deux horloges seront très légèrement désynchronisées en permanence, et cette désynchronisation peut être utilisée pour produire des nombres aléatoires. Par exemple, on peut compter le nombre de cycles d'horloge produit par l'horloge rapide durant une période de l'horloge lente. Si ce nombre est pair, on produit un bit aléatoire qui vaut 1 , il vaut 0 si ce nombre est pair. Pour information, c'est exactement cette technique qui était utilisée dans l'''Intel 82802 Firmware Hub''. ===L'aléatoire généré par la tension d'alimentation=== Il existe d'autres solutions matérielles qui utilisent le bruit thermique. Tous les circuits électroniques de l'univers sont soumis à de microscopiques variations de température, dues à l'agitation thermique des atomes. Plus la température est élevée, plus les atomes qui composent les fils métalliques des circuits s'agitent. Vu que les particules d'un métal contiennent des charges électriques, ces vibrations font naître des variations de tensions assez infimes. Il suffit d'amplifier ces variations pour obtenir un résultat capable de représenter un zéro ou un 1. Ce principe a été utilisé sur des anciens processeurs Intel qui géraient l'instruction RDRAND, une instruction qui produisait un nombre aléatoire. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits compteurs et décompteurs | prevText=Les circuits compteurs et décompteurs | next=Les circuits de décalage et de rotation | nextText=Les circuits de décalage et de rotation }} </noinclude> qx57ipjj6egjl9jwubvo56oonjhgtgd 768112 768110 2026-06-18T20:21:27Z Mewtow 31375 768112 wikitext text/x-wiki Les '''registres à décalage à rétroaction linéaire''' sont des registres à décalages dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage. À rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ==Les généralités sur les compteurs à rétroaction== Quelques propriétés sont communes à tous les compteurs, qu'il s'agisse des compteurs à rétroaction ou des compteurs en anneau, voire des compteurs normaux du chapitre précédent. Un compteur est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs. Et ces deux propriétés sont source de comportements qu'on va détailler ci-dessous. Certains compteurs ont des '''valeurs interdites''', qui bloquent le compteur. Concrètement, une fois que le décompte arrive sur cette valeur, le compteur reste bloqué sur cette valeur. La valeur suivante, calculée par le compteur, est cette valeur elle-même. Tous les compteurs ne sont pas dans ce cas, de nombreux compteurs n'ont pas de valeur interdite. ===La période d'un compteur à rétroaction=== Si le compteur est initialisé correctement, il passera d'une valeur à l'autre, sans tomber sur une valeur interdite. Dans ce cas, il finira par repasser par une valeur qu'il aura déjà parcourue et son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. Le cas le plus simple est celui des compteurs en anneau, suivi par les compteurs Johnson. Un compteur en anneau de N bits peut prendre N valeurs différentes, qui ont toutes un seul bit à 1. À l'opposé, un compteur Johnson peut prendre deux fois plus de valeurs. Pour nous en rendre compte, comparons la séquence de nombre déroulé par chaque compteur. Pour 5 bits, les séquences sont illustrées ci-dessous, dans les deux animations. [[File:Lauflicht 5 LED.gif|centre|vignette|Compteur en anneau de 5 bits.]] [[File:Johnson counter.gif|centre|vignette|Compteur de Johnson de 5 bits.]] La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celui des compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==La génération de nombres pseudo-aléatoires== Les compteurs peuvent aussi être utilisés pour générer des nombres "aléatoires". Je dis aléatoires entre guillemets, car ils ne sont pas vraiment aléatoires, mais s'en rapprochent suffisamment pour être considérés comme tels. Pour mettre en avant cela, on parle aussi de nombres "pseudo-aléatoires". De nombreuses situations demandent de générer des nombres pseudo-aléatoire de manière matérielle. Cela peut servir pour sélectionner une ligne de cache à remplacer lors d'un défaut de cache, pour implémenter des circuits cryptographiques, pour calculer la durée d'émission sur un bus Ethernet à la suite d'une collision, et j'en passe. Les méthodes que nous allons voir produisent un nombre pseudo-aléatoire un bit à la fois, à quelques exceptions près. Les circuits que nous allons voir fournissent un bit sur leur sortie et ce bit varie de manière assez aléatoire. Les bits en sortie du circuit sont accumulés dans un registre à décalage normal, pour former un nombre aléatoire. Nous appellerons ce registre : l'accumulateur. ===L'usage de registres à décalage à rétroaction=== [[File:Nonlinear-combo-generator.png|thumb|Nonlinear-combo-generator]] La première solution utilise des ''registres à décalages à rétroaction'', les fameux LSFR du chapitre précédent. Un LSFR seul ne fournit pas un aléatoire digne de ce nom, mais il est possible de combiner plusieurs LSFR pour obtenir une meilleure approximation de l'aléatoire. Avec cette technique, plusieurs registres à décalages à rétroaction sont reliés à un circuit combinatoire non-linéaire. Ce circuit prendra en entrée un (ou plusieurs) bit de chaque registre à décalage à rétroaction, et combinera ces bits pour fournir un bit de sortie. [[File:A5-1 GSM cipher.svg|centre|thumb|upright=2|Exemple avec trois LSFR différents, de tailles différentes : le bit envoyé à l'accumulateur est un XOR du bit sortant des trois LSFR.]] Pour rendre le tout encore plus aléatoire, il est possible de cadencer les LSFR à des fréquences différentes. Cette technique est utilisée dans les générateurs ''stop-and-go'', ''alternative step'', et à ''shrinking''. * Le générateur ''alternative step'' utilise trois LSFR. Le premier commande un multiplexeur qui choisit la sortie parmi les deux restants. * Le générateur ''stop-and-go'' utilise deux LSFR. Le premier est relié à l'entrée d'horloge du second et le bit de sortie du second est utilisé comme résultat. Une technique similaire était utilisée dans les processeurs VIA C3, pour l'implémentation de leurs instructions cryptographiques. * Le ''shrinking generator'' utilise deux LSFR cadencés à des vitesses différentes. Si le bit de sortie du premier vaut 1, alors le bit de sortie du second est utilisé comme résultat. Par contre, si le bit de sortie du premier vaut 0, aucun bit n'est fourni en sortie, le bit de sortie du second registre est oublié. ===L'aléatoire généré par des ''timers'' ou des compteurs d'horloge=== Au-delà des LSFR, il est possible d'utiliser des compteurs pour générer du pseudo-aléatoire. Par exemple, une technique très simple utilise un simple ''timer''. Si on a besoin d'un nombre pseudo-aléatoire, il suffit de lire le ''timer'' et d'utiliser le nombre lu comme nombre pseudo-aléatoire. Si le délai entre deux demandes est irrégulier, le résultat semblera aléatoire. Mais il s'agit là d'une technique assez peu fiable dans le monde réel et seules quelques applications bien spécifiques se satisfont de cette méthode. Une solution un peu plus fiable utilise ce qu'on appelle la '''dérive de l'horloge'''. Il faut savoir qu'un signal d'horloge n'est jamais vraiment très précis. Une horloge censée tourner à 1 Ghz ne tournera pas en permanence à 1Ghz exactement, mais verra sa fréquence varier de quelques Hz ou Khz de manière irrégulière. Ces variations peuvent venir de variations aléatoires de température, des variations de tension, des perturbations électromagnétiques, ou à des phénomènes assez compliqués qui peuvent se produire dans tout circuit électrique (comme le ''shot noise''). L'idée la plus simple utilise deux horloges : une horloge lente et une horloge rapide, dont la fréquence est un multiple de l'autre. Par exemple, on peut choisir une fréquence de 1 Mhz et une autre de 100 Hz : la fréquence la plus grande est égale à 10000 fois l'autre. La dérive d'horloge fera son œuvre, les deux horloges seront très légèrement désynchronisées en permanence, et cette désynchronisation peut être utilisée pour produire des nombres aléatoires. Par exemple, on peut compter le nombre de cycles d'horloge produit par l'horloge rapide durant une période de l'horloge lente. Si ce nombre est pair, on produit un bit aléatoire qui vaut 1 , il vaut 0 si ce nombre est pair. Pour information, c'est exactement cette technique qui était utilisée dans l'''Intel 82802 Firmware Hub''. ===L'aléatoire généré par la tension d'alimentation=== Il existe d'autres solutions matérielles qui utilisent le bruit thermique. Tous les circuits électroniques de l'univers sont soumis à de microscopiques variations de température, dues à l'agitation thermique des atomes. Plus la température est élevée, plus les atomes qui composent les fils métalliques des circuits s'agitent. Vu que les particules d'un métal contiennent des charges électriques, ces vibrations font naître des variations de tensions assez infimes. Il suffit d'amplifier ces variations pour obtenir un résultat capable de représenter un zéro ou un 1. Ce principe a été utilisé sur des anciens processeurs Intel qui géraient l'instruction RDRAND, une instruction qui produisait un nombre aléatoire. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits compteurs et décompteurs | prevText=Les circuits compteurs et décompteurs | next=Les circuits de décalage et de rotation | nextText=Les circuits de décalage et de rotation }} </noinclude> k6uhv8b8oxd4hx8v5fftw6pkch8rx4k 768118 768112 2026-06-18T20:27:24Z Mewtow 31375 /* La période d'un compteur à rétroaction */ 768118 wikitext text/x-wiki Les '''registres à décalage à rétroaction linéaire''' sont des registres à décalages dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage. À rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ==Les généralités sur les compteurs à rétroaction== Quelques propriétés sont communes à tous les compteurs, qu'il s'agisse des compteurs à rétroaction ou des compteurs en anneau, voire des compteurs normaux du chapitre précédent. Un compteur est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs. Et ces deux propriétés sont source de comportements qu'on va détailler ci-dessous. Certains compteurs ont des '''valeurs interdites''', qui bloquent le compteur. Concrètement, une fois que le décompte arrive sur cette valeur, le compteur reste bloqué sur cette valeur. La valeur suivante, calculée par le compteur, est cette valeur elle-même. Tous les compteurs ne sont pas dans ce cas, de nombreux compteurs n'ont pas de valeur interdite. ===La période d'un compteur à rétroaction=== Si le compteur est initialisé correctement, il passera d'une valeur à l'autre, sans tomber sur une valeur interdite. Dans ce cas, il finira par repasser par une valeur qu'il aura déjà parcourue et son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. La période des registres à décalage à rétroaction linéaire dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le registre à décalage à rétroaction passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un registre à rétroaction linéaire passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un compteur à rétroaction=== Les compteurs à rétroaction ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les compteurs basés sur un registre à décalage ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. C'est le cas sur les compteurs de Johnson, mais aussi sur les registres à décalage à rétroaction non-linéaire. Sur de tels compteurs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celui des compteurs en anneau et des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==La génération de nombres pseudo-aléatoires== Les compteurs peuvent aussi être utilisés pour générer des nombres "aléatoires". Je dis aléatoires entre guillemets, car ils ne sont pas vraiment aléatoires, mais s'en rapprochent suffisamment pour être considérés comme tels. Pour mettre en avant cela, on parle aussi de nombres "pseudo-aléatoires". De nombreuses situations demandent de générer des nombres pseudo-aléatoire de manière matérielle. Cela peut servir pour sélectionner une ligne de cache à remplacer lors d'un défaut de cache, pour implémenter des circuits cryptographiques, pour calculer la durée d'émission sur un bus Ethernet à la suite d'une collision, et j'en passe. Les méthodes que nous allons voir produisent un nombre pseudo-aléatoire un bit à la fois, à quelques exceptions près. Les circuits que nous allons voir fournissent un bit sur leur sortie et ce bit varie de manière assez aléatoire. Les bits en sortie du circuit sont accumulés dans un registre à décalage normal, pour former un nombre aléatoire. Nous appellerons ce registre : l'accumulateur. ===L'usage de registres à décalage à rétroaction=== [[File:Nonlinear-combo-generator.png|thumb|Nonlinear-combo-generator]] La première solution utilise des ''registres à décalages à rétroaction'', les fameux LSFR du chapitre précédent. Un LSFR seul ne fournit pas un aléatoire digne de ce nom, mais il est possible de combiner plusieurs LSFR pour obtenir une meilleure approximation de l'aléatoire. Avec cette technique, plusieurs registres à décalages à rétroaction sont reliés à un circuit combinatoire non-linéaire. Ce circuit prendra en entrée un (ou plusieurs) bit de chaque registre à décalage à rétroaction, et combinera ces bits pour fournir un bit de sortie. [[File:A5-1 GSM cipher.svg|centre|thumb|upright=2|Exemple avec trois LSFR différents, de tailles différentes : le bit envoyé à l'accumulateur est un XOR du bit sortant des trois LSFR.]] Pour rendre le tout encore plus aléatoire, il est possible de cadencer les LSFR à des fréquences différentes. Cette technique est utilisée dans les générateurs ''stop-and-go'', ''alternative step'', et à ''shrinking''. * Le générateur ''alternative step'' utilise trois LSFR. Le premier commande un multiplexeur qui choisit la sortie parmi les deux restants. * Le générateur ''stop-and-go'' utilise deux LSFR. Le premier est relié à l'entrée d'horloge du second et le bit de sortie du second est utilisé comme résultat. Une technique similaire était utilisée dans les processeurs VIA C3, pour l'implémentation de leurs instructions cryptographiques. * Le ''shrinking generator'' utilise deux LSFR cadencés à des vitesses différentes. Si le bit de sortie du premier vaut 1, alors le bit de sortie du second est utilisé comme résultat. Par contre, si le bit de sortie du premier vaut 0, aucun bit n'est fourni en sortie, le bit de sortie du second registre est oublié. ===L'aléatoire généré par des ''timers'' ou des compteurs d'horloge=== Au-delà des LSFR, il est possible d'utiliser des compteurs pour générer du pseudo-aléatoire. Par exemple, une technique très simple utilise un simple ''timer''. Si on a besoin d'un nombre pseudo-aléatoire, il suffit de lire le ''timer'' et d'utiliser le nombre lu comme nombre pseudo-aléatoire. Si le délai entre deux demandes est irrégulier, le résultat semblera aléatoire. Mais il s'agit là d'une technique assez peu fiable dans le monde réel et seules quelques applications bien spécifiques se satisfont de cette méthode. Une solution un peu plus fiable utilise ce qu'on appelle la '''dérive de l'horloge'''. Il faut savoir qu'un signal d'horloge n'est jamais vraiment très précis. Une horloge censée tourner à 1 Ghz ne tournera pas en permanence à 1Ghz exactement, mais verra sa fréquence varier de quelques Hz ou Khz de manière irrégulière. Ces variations peuvent venir de variations aléatoires de température, des variations de tension, des perturbations électromagnétiques, ou à des phénomènes assez compliqués qui peuvent se produire dans tout circuit électrique (comme le ''shot noise''). L'idée la plus simple utilise deux horloges : une horloge lente et une horloge rapide, dont la fréquence est un multiple de l'autre. Par exemple, on peut choisir une fréquence de 1 Mhz et une autre de 100 Hz : la fréquence la plus grande est égale à 10000 fois l'autre. La dérive d'horloge fera son œuvre, les deux horloges seront très légèrement désynchronisées en permanence, et cette désynchronisation peut être utilisée pour produire des nombres aléatoires. Par exemple, on peut compter le nombre de cycles d'horloge produit par l'horloge rapide durant une période de l'horloge lente. Si ce nombre est pair, on produit un bit aléatoire qui vaut 1 , il vaut 0 si ce nombre est pair. Pour information, c'est exactement cette technique qui était utilisée dans l'''Intel 82802 Firmware Hub''. ===L'aléatoire généré par la tension d'alimentation=== Il existe d'autres solutions matérielles qui utilisent le bruit thermique. Tous les circuits électroniques de l'univers sont soumis à de microscopiques variations de température, dues à l'agitation thermique des atomes. Plus la température est élevée, plus les atomes qui composent les fils métalliques des circuits s'agitent. Vu que les particules d'un métal contiennent des charges électriques, ces vibrations font naître des variations de tensions assez infimes. Il suffit d'amplifier ces variations pour obtenir un résultat capable de représenter un zéro ou un 1. Ce principe a été utilisé sur des anciens processeurs Intel qui géraient l'instruction RDRAND, une instruction qui produisait un nombre aléatoire. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits compteurs et décompteurs | prevText=Les circuits compteurs et décompteurs | next=Les circuits de décalage et de rotation | nextText=Les circuits de décalage et de rotation }} </noinclude> duvtjv9nunfej3q805baq7sk4sryurv 768120 768118 2026-06-18T20:30:37Z Mewtow 31375 /* Les généralités sur les compteurs à rétroaction */ 768120 wikitext text/x-wiki Les '''registres à décalage à rétroaction linéaire''' sont des registres à décalages dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage. À rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ==Les généralités sur les LSFRs == Quelques propriétés sont communes à tous les LSFRs. Un LSFR est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs. Et ces deux propriétés sont source de comportements qu'on va détailler ci-dessous. Certains LSFRs ont des '''valeurs interdites''', qui bloquent le compteur. Concrètement, une fois que le décompte arrive sur cette valeur, le compteur reste bloqué sur cette valeur. La valeur suivante, calculée par le compteur, est cette valeur elle-même. Tous les compteurs ne sont pas dans ce cas, de nombreux compteurs n'ont pas de valeur interdite. ===La période d'un LSFR=== Si le compteur est initialisé correctement, il passera d'une valeur à l'autre, sans tomber sur une valeur interdite. Dans ce cas, il finira par repasser par une valeur qu'il aura déjà parcourue et son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. La période d'un LSFR dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le LSFR passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un LSFR passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un LSFR=== Les LSFR ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les LSFR ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. Sur de tels LSFRs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celui des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==La génération de nombres pseudo-aléatoires== Les compteurs peuvent aussi être utilisés pour générer des nombres "aléatoires". Je dis aléatoires entre guillemets, car ils ne sont pas vraiment aléatoires, mais s'en rapprochent suffisamment pour être considérés comme tels. Pour mettre en avant cela, on parle aussi de nombres "pseudo-aléatoires". De nombreuses situations demandent de générer des nombres pseudo-aléatoire de manière matérielle. Cela peut servir pour sélectionner une ligne de cache à remplacer lors d'un défaut de cache, pour implémenter des circuits cryptographiques, pour calculer la durée d'émission sur un bus Ethernet à la suite d'une collision, et j'en passe. Les méthodes que nous allons voir produisent un nombre pseudo-aléatoire un bit à la fois, à quelques exceptions près. Les circuits que nous allons voir fournissent un bit sur leur sortie et ce bit varie de manière assez aléatoire. Les bits en sortie du circuit sont accumulés dans un registre à décalage normal, pour former un nombre aléatoire. Nous appellerons ce registre : l'accumulateur. ===L'usage de registres à décalage à rétroaction=== [[File:Nonlinear-combo-generator.png|thumb|Nonlinear-combo-generator]] La première solution utilise des ''registres à décalages à rétroaction'', les fameux LSFR du chapitre précédent. Un LSFR seul ne fournit pas un aléatoire digne de ce nom, mais il est possible de combiner plusieurs LSFR pour obtenir une meilleure approximation de l'aléatoire. Avec cette technique, plusieurs registres à décalages à rétroaction sont reliés à un circuit combinatoire non-linéaire. Ce circuit prendra en entrée un (ou plusieurs) bit de chaque registre à décalage à rétroaction, et combinera ces bits pour fournir un bit de sortie. [[File:A5-1 GSM cipher.svg|centre|thumb|upright=2|Exemple avec trois LSFR différents, de tailles différentes : le bit envoyé à l'accumulateur est un XOR du bit sortant des trois LSFR.]] Pour rendre le tout encore plus aléatoire, il est possible de cadencer les LSFR à des fréquences différentes. Cette technique est utilisée dans les générateurs ''stop-and-go'', ''alternative step'', et à ''shrinking''. * Le générateur ''alternative step'' utilise trois LSFR. Le premier commande un multiplexeur qui choisit la sortie parmi les deux restants. * Le générateur ''stop-and-go'' utilise deux LSFR. Le premier est relié à l'entrée d'horloge du second et le bit de sortie du second est utilisé comme résultat. Une technique similaire était utilisée dans les processeurs VIA C3, pour l'implémentation de leurs instructions cryptographiques. * Le ''shrinking generator'' utilise deux LSFR cadencés à des vitesses différentes. Si le bit de sortie du premier vaut 1, alors le bit de sortie du second est utilisé comme résultat. Par contre, si le bit de sortie du premier vaut 0, aucun bit n'est fourni en sortie, le bit de sortie du second registre est oublié. ===L'aléatoire généré par des ''timers'' ou des compteurs d'horloge=== Au-delà des LSFR, il est possible d'utiliser des compteurs pour générer du pseudo-aléatoire. Par exemple, une technique très simple utilise un simple ''timer''. Si on a besoin d'un nombre pseudo-aléatoire, il suffit de lire le ''timer'' et d'utiliser le nombre lu comme nombre pseudo-aléatoire. Si le délai entre deux demandes est irrégulier, le résultat semblera aléatoire. Mais il s'agit là d'une technique assez peu fiable dans le monde réel et seules quelques applications bien spécifiques se satisfont de cette méthode. Une solution un peu plus fiable utilise ce qu'on appelle la '''dérive de l'horloge'''. Il faut savoir qu'un signal d'horloge n'est jamais vraiment très précis. Une horloge censée tourner à 1 Ghz ne tournera pas en permanence à 1Ghz exactement, mais verra sa fréquence varier de quelques Hz ou Khz de manière irrégulière. Ces variations peuvent venir de variations aléatoires de température, des variations de tension, des perturbations électromagnétiques, ou à des phénomènes assez compliqués qui peuvent se produire dans tout circuit électrique (comme le ''shot noise''). L'idée la plus simple utilise deux horloges : une horloge lente et une horloge rapide, dont la fréquence est un multiple de l'autre. Par exemple, on peut choisir une fréquence de 1 Mhz et une autre de 100 Hz : la fréquence la plus grande est égale à 10000 fois l'autre. La dérive d'horloge fera son œuvre, les deux horloges seront très légèrement désynchronisées en permanence, et cette désynchronisation peut être utilisée pour produire des nombres aléatoires. Par exemple, on peut compter le nombre de cycles d'horloge produit par l'horloge rapide durant une période de l'horloge lente. Si ce nombre est pair, on produit un bit aléatoire qui vaut 1 , il vaut 0 si ce nombre est pair. Pour information, c'est exactement cette technique qui était utilisée dans l'''Intel 82802 Firmware Hub''. ===L'aléatoire généré par la tension d'alimentation=== Il existe d'autres solutions matérielles qui utilisent le bruit thermique. Tous les circuits électroniques de l'univers sont soumis à de microscopiques variations de température, dues à l'agitation thermique des atomes. Plus la température est élevée, plus les atomes qui composent les fils métalliques des circuits s'agitent. Vu que les particules d'un métal contiennent des charges électriques, ces vibrations font naître des variations de tensions assez infimes. Il suffit d'amplifier ces variations pour obtenir un résultat capable de représenter un zéro ou un 1. Ce principe a été utilisé sur des anciens processeurs Intel qui géraient l'instruction RDRAND, une instruction qui produisait un nombre aléatoire. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits compteurs et décompteurs | prevText=Les circuits compteurs et décompteurs | next=Les circuits de décalage et de rotation | nextText=Les circuits de décalage et de rotation }} </noinclude> hndkyq248p29gdpmo43w93kiugp67h7 768126 768120 2026-06-19T01:06:06Z Mewtow 31375 /* L'aléatoire généré par la tension d'alimentation */ 768126 wikitext text/x-wiki Les '''registres à décalage à rétroaction linéaire''' sont des registres à décalages dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage. À rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ==Les généralités sur les LSFRs == Quelques propriétés sont communes à tous les LSFRs. Un LSFR est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs. Et ces deux propriétés sont source de comportements qu'on va détailler ci-dessous. Certains LSFRs ont des '''valeurs interdites''', qui bloquent le compteur. Concrètement, une fois que le décompte arrive sur cette valeur, le compteur reste bloqué sur cette valeur. La valeur suivante, calculée par le compteur, est cette valeur elle-même. Tous les compteurs ne sont pas dans ce cas, de nombreux compteurs n'ont pas de valeur interdite. ===La période d'un LSFR=== Si le compteur est initialisé correctement, il passera d'une valeur à l'autre, sans tomber sur une valeur interdite. Dans ce cas, il finira par repasser par une valeur qu'il aura déjà parcourue et son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. La période d'un LSFR dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le LSFR passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un LSFR passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un LSFR=== Les LSFR ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les LSFR ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. Sur de tels LSFRs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celui des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==La génération de nombres pseudo-aléatoires== Les compteurs peuvent aussi être utilisés pour générer des nombres "aléatoires". Je dis aléatoires entre guillemets, car ils ne sont pas vraiment aléatoires, mais s'en rapprochent suffisamment pour être considérés comme tels. Pour mettre en avant cela, on parle aussi de nombres "pseudo-aléatoires". De nombreuses situations demandent de générer des nombres pseudo-aléatoire de manière matérielle. Cela peut servir pour sélectionner une ligne de cache à remplacer lors d'un défaut de cache, pour implémenter des circuits cryptographiques, pour calculer la durée d'émission sur un bus Ethernet à la suite d'une collision, et j'en passe. Les méthodes que nous allons voir produisent un nombre pseudo-aléatoire un bit à la fois, à quelques exceptions près. Les circuits que nous allons voir fournissent un bit sur leur sortie et ce bit varie de manière assez aléatoire. Les bits en sortie du circuit sont accumulés dans un registre à décalage normal, pour former un nombre aléatoire. Nous appellerons ce registre : l'accumulateur. ===L'usage de registres à décalage à rétroaction=== [[File:Nonlinear-combo-generator.png|thumb|Nonlinear-combo-generator]] La première solution utilise des ''registres à décalages à rétroaction'', les fameux LSFR du chapitre précédent. Un LSFR seul ne fournit pas un aléatoire digne de ce nom, mais il est possible de combiner plusieurs LSFR pour obtenir une meilleure approximation de l'aléatoire. Avec cette technique, plusieurs registres à décalages à rétroaction sont reliés à un circuit combinatoire non-linéaire. Ce circuit prendra en entrée un (ou plusieurs) bit de chaque registre à décalage à rétroaction, et combinera ces bits pour fournir un bit de sortie. [[File:A5-1 GSM cipher.svg|centre|thumb|upright=2|Exemple avec trois LSFR différents, de tailles différentes : le bit envoyé à l'accumulateur est un XOR du bit sortant des trois LSFR.]] Pour rendre le tout encore plus aléatoire, il est possible de cadencer les LSFR à des fréquences différentes. Cette technique est utilisée dans les générateurs ''stop-and-go'', ''alternative step'', et à ''shrinking''. * Le générateur ''alternative step'' utilise trois LSFR. Le premier commande un multiplexeur qui choisit la sortie parmi les deux restants. * Le générateur ''stop-and-go'' utilise deux LSFR. Le premier est relié à l'entrée d'horloge du second et le bit de sortie du second est utilisé comme résultat. Une technique similaire était utilisée dans les processeurs VIA C3, pour l'implémentation de leurs instructions cryptographiques. * Le ''shrinking generator'' utilise deux LSFR cadencés à des vitesses différentes. Si le bit de sortie du premier vaut 1, alors le bit de sortie du second est utilisé comme résultat. Par contre, si le bit de sortie du premier vaut 0, aucun bit n'est fourni en sortie, le bit de sortie du second registre est oublié. ===L'aléatoire généré par des ''timers'' ou des compteurs d'horloge=== Au-delà des LSFR, il est possible d'utiliser des compteurs pour générer du pseudo-aléatoire. Par exemple, une technique très simple utilise un simple ''timer''. Si on a besoin d'un nombre pseudo-aléatoire, il suffit de lire le ''timer'' et d'utiliser le nombre lu comme nombre pseudo-aléatoire. Si le délai entre deux demandes est irrégulier, le résultat semblera aléatoire. Mais il s'agit là d'une technique assez peu fiable dans le monde réel et seules quelques applications bien spécifiques se satisfont de cette méthode. Une solution un peu plus fiable utilise ce qu'on appelle la '''dérive de l'horloge'''. Il faut savoir qu'un signal d'horloge n'est jamais vraiment très précis. Une horloge censée tourner à 1 Ghz ne tournera pas en permanence à 1Ghz exactement, mais verra sa fréquence varier de quelques Hz ou Khz de manière irrégulière. Ces variations peuvent venir de variations aléatoires de température, des variations de tension, des perturbations électromagnétiques, ou à des phénomènes assez compliqués qui peuvent se produire dans tout circuit électrique (comme le ''shot noise''). L'idée la plus simple utilise deux horloges : une horloge lente et une horloge rapide, dont la fréquence est un multiple de l'autre. Par exemple, on peut choisir une fréquence de 1 Mhz et une autre de 100 Hz : la fréquence la plus grande est égale à 10000 fois l'autre. La dérive d'horloge fera son œuvre, les deux horloges seront très légèrement désynchronisées en permanence, et cette désynchronisation peut être utilisée pour produire des nombres aléatoires. Par exemple, on peut compter le nombre de cycles d'horloge produit par l'horloge rapide durant une période de l'horloge lente. Si ce nombre est pair, on produit un bit aléatoire qui vaut 1 , il vaut 0 si ce nombre est pair. Pour information, c'est exactement cette technique qui était utilisée dans l'''Intel 82802 Firmware Hub''. ===L'aléatoire généré par la tension d'alimentation=== Il existe d'autres solutions matérielles qui utilisent le bruit thermique. Tous les circuits électroniques de l'univers sont soumis à de microscopiques variations de température, dues à l'agitation thermique des atomes. Plus la température est élevée, plus les atomes qui composent les fils métalliques des circuits s'agitent. Vu que les particules d'un métal contiennent des charges électriques, ces vibrations font naître des variations de tensions assez infimes. Il suffit d'amplifier ces variations pour obtenir un résultat capable de représenter un zéro ou un 1. Ce principe a été utilisé sur des anciens processeurs Intel qui géraient l'instruction RDRAND, une instruction qui produisait un nombre aléatoire. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les compteurs et timers | prevText=Les compteurs et timers | next=Les circuits de décalage et de rotation | nextText=Les circuits de décalage et de rotation }} </noinclude> 1kkja2f05c4h05wblr88ziue5sxfubd 768127 768126 2026-06-19T01:06:26Z Mewtow 31375 Mewtow a déplacé la page [[Fonctionnement d'un ordinateur/Les compteurs à rétroaction]] vers [[Fonctionnement d'un ordinateur/Les registres à décalage à rétroaction linéaire]] 768126 wikitext text/x-wiki Les '''registres à décalage à rétroaction linéaire''' sont des registres à décalages dont on boucle l'entrée sur la sortie. Pour être plus précis, il y a très souvent un circuit combinatoire qui s'intercale entre la sortie et l'entrée. Son rôle est de calculer ce qu'il faut mettre sur l'entrée, en fonction de la sortie. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage. À rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ==Les généralités sur les LSFRs == Quelques propriétés sont communes à tous les LSFRs. Un LSFR est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs. Et ces deux propriétés sont source de comportements qu'on va détailler ci-dessous. Certains LSFRs ont des '''valeurs interdites''', qui bloquent le compteur. Concrètement, une fois que le décompte arrive sur cette valeur, le compteur reste bloqué sur cette valeur. La valeur suivante, calculée par le compteur, est cette valeur elle-même. Tous les compteurs ne sont pas dans ce cas, de nombreux compteurs n'ont pas de valeur interdite. ===La période d'un LSFR=== Si le compteur est initialisé correctement, il passera d'une valeur à l'autre, sans tomber sur une valeur interdite. Dans ce cas, il finira par repasser par une valeur qu'il aura déjà parcourue et son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. La période d'un LSFR dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le LSFR passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un LSFR passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un LSFR=== Les LSFR ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les LSFR ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. Sur de tels LSFRs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celui des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==La génération de nombres pseudo-aléatoires== Les compteurs peuvent aussi être utilisés pour générer des nombres "aléatoires". Je dis aléatoires entre guillemets, car ils ne sont pas vraiment aléatoires, mais s'en rapprochent suffisamment pour être considérés comme tels. Pour mettre en avant cela, on parle aussi de nombres "pseudo-aléatoires". De nombreuses situations demandent de générer des nombres pseudo-aléatoire de manière matérielle. Cela peut servir pour sélectionner une ligne de cache à remplacer lors d'un défaut de cache, pour implémenter des circuits cryptographiques, pour calculer la durée d'émission sur un bus Ethernet à la suite d'une collision, et j'en passe. Les méthodes que nous allons voir produisent un nombre pseudo-aléatoire un bit à la fois, à quelques exceptions près. Les circuits que nous allons voir fournissent un bit sur leur sortie et ce bit varie de manière assez aléatoire. Les bits en sortie du circuit sont accumulés dans un registre à décalage normal, pour former un nombre aléatoire. Nous appellerons ce registre : l'accumulateur. ===L'usage de registres à décalage à rétroaction=== [[File:Nonlinear-combo-generator.png|thumb|Nonlinear-combo-generator]] La première solution utilise des ''registres à décalages à rétroaction'', les fameux LSFR du chapitre précédent. Un LSFR seul ne fournit pas un aléatoire digne de ce nom, mais il est possible de combiner plusieurs LSFR pour obtenir une meilleure approximation de l'aléatoire. Avec cette technique, plusieurs registres à décalages à rétroaction sont reliés à un circuit combinatoire non-linéaire. Ce circuit prendra en entrée un (ou plusieurs) bit de chaque registre à décalage à rétroaction, et combinera ces bits pour fournir un bit de sortie. [[File:A5-1 GSM cipher.svg|centre|thumb|upright=2|Exemple avec trois LSFR différents, de tailles différentes : le bit envoyé à l'accumulateur est un XOR du bit sortant des trois LSFR.]] Pour rendre le tout encore plus aléatoire, il est possible de cadencer les LSFR à des fréquences différentes. Cette technique est utilisée dans les générateurs ''stop-and-go'', ''alternative step'', et à ''shrinking''. * Le générateur ''alternative step'' utilise trois LSFR. Le premier commande un multiplexeur qui choisit la sortie parmi les deux restants. * Le générateur ''stop-and-go'' utilise deux LSFR. Le premier est relié à l'entrée d'horloge du second et le bit de sortie du second est utilisé comme résultat. Une technique similaire était utilisée dans les processeurs VIA C3, pour l'implémentation de leurs instructions cryptographiques. * Le ''shrinking generator'' utilise deux LSFR cadencés à des vitesses différentes. Si le bit de sortie du premier vaut 1, alors le bit de sortie du second est utilisé comme résultat. Par contre, si le bit de sortie du premier vaut 0, aucun bit n'est fourni en sortie, le bit de sortie du second registre est oublié. ===L'aléatoire généré par des ''timers'' ou des compteurs d'horloge=== Au-delà des LSFR, il est possible d'utiliser des compteurs pour générer du pseudo-aléatoire. Par exemple, une technique très simple utilise un simple ''timer''. Si on a besoin d'un nombre pseudo-aléatoire, il suffit de lire le ''timer'' et d'utiliser le nombre lu comme nombre pseudo-aléatoire. Si le délai entre deux demandes est irrégulier, le résultat semblera aléatoire. Mais il s'agit là d'une technique assez peu fiable dans le monde réel et seules quelques applications bien spécifiques se satisfont de cette méthode. Une solution un peu plus fiable utilise ce qu'on appelle la '''dérive de l'horloge'''. Il faut savoir qu'un signal d'horloge n'est jamais vraiment très précis. Une horloge censée tourner à 1 Ghz ne tournera pas en permanence à 1Ghz exactement, mais verra sa fréquence varier de quelques Hz ou Khz de manière irrégulière. Ces variations peuvent venir de variations aléatoires de température, des variations de tension, des perturbations électromagnétiques, ou à des phénomènes assez compliqués qui peuvent se produire dans tout circuit électrique (comme le ''shot noise''). L'idée la plus simple utilise deux horloges : une horloge lente et une horloge rapide, dont la fréquence est un multiple de l'autre. Par exemple, on peut choisir une fréquence de 1 Mhz et une autre de 100 Hz : la fréquence la plus grande est égale à 10000 fois l'autre. La dérive d'horloge fera son œuvre, les deux horloges seront très légèrement désynchronisées en permanence, et cette désynchronisation peut être utilisée pour produire des nombres aléatoires. Par exemple, on peut compter le nombre de cycles d'horloge produit par l'horloge rapide durant une période de l'horloge lente. Si ce nombre est pair, on produit un bit aléatoire qui vaut 1 , il vaut 0 si ce nombre est pair. Pour information, c'est exactement cette technique qui était utilisée dans l'''Intel 82802 Firmware Hub''. ===L'aléatoire généré par la tension d'alimentation=== Il existe d'autres solutions matérielles qui utilisent le bruit thermique. Tous les circuits électroniques de l'univers sont soumis à de microscopiques variations de température, dues à l'agitation thermique des atomes. Plus la température est élevée, plus les atomes qui composent les fils métalliques des circuits s'agitent. Vu que les particules d'un métal contiennent des charges électriques, ces vibrations font naître des variations de tensions assez infimes. Il suffit d'amplifier ces variations pour obtenir un résultat capable de représenter un zéro ou un 1. Ce principe a été utilisé sur des anciens processeurs Intel qui géraient l'instruction RDRAND, une instruction qui produisait un nombre aléatoire. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les compteurs et timers | prevText=Les compteurs et timers | next=Les circuits de décalage et de rotation | nextText=Les circuits de décalage et de rotation }} </noinclude> 1kkja2f05c4h05wblr88ziue5sxfubd 768132 768127 2026-06-19T01:08:58Z Mewtow 31375 768132 wikitext text/x-wiki Les '''registres à décalage à rétroaction linéaire''' sont des registres à décalages un peu particuliers. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage. À rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. L'idée est qu'entre la sortie et l'entrée, il y a un circuit combinatoire qui s'intercale entre la sortie et l'entrée, qui calcule ce qu'il faut mettre sur l'entrée, à partir du contenu du registre Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] Il existe enfin des compteursqui ne sont pas des LFSR, même en incluant les compteurs de Gallois et autres. Ce sont des compteurs basés sur des registres à décalage où le circuit combinatoire inséré entre l'entrée et la sortie n'est pas basé sur des portes XOR ou NXOR. Ils sont cependant plus compliqués à concevoir, mais ils ont beaucoup d'avantages. ==Les généralités sur les LSFRs == Quelques propriétés sont communes à tous les LSFRs. Un LSFR est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs. Et ces deux propriétés sont source de comportements qu'on va détailler ci-dessous. Certains LSFRs ont des '''valeurs interdites''', qui bloquent le compteur. Concrètement, une fois que le décompte arrive sur cette valeur, le compteur reste bloqué sur cette valeur. La valeur suivante, calculée par le compteur, est cette valeur elle-même. Tous les compteurs ne sont pas dans ce cas, de nombreux compteurs n'ont pas de valeur interdite. ===La période d'un LSFR=== Si le compteur est initialisé correctement, il passera d'une valeur à l'autre, sans tomber sur une valeur interdite. Dans ce cas, il finira par repasser par une valeur qu'il aura déjà parcourue et son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. La période d'un LSFR dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le LSFR passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un LSFR passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un LSFR=== Les LSFR ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les LSFR ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. Sur de tels LSFRs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celui des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==La génération de nombres pseudo-aléatoires== Les compteurs peuvent aussi être utilisés pour générer des nombres "aléatoires". Je dis aléatoires entre guillemets, car ils ne sont pas vraiment aléatoires, mais s'en rapprochent suffisamment pour être considérés comme tels. Pour mettre en avant cela, on parle aussi de nombres "pseudo-aléatoires". De nombreuses situations demandent de générer des nombres pseudo-aléatoire de manière matérielle. Cela peut servir pour sélectionner une ligne de cache à remplacer lors d'un défaut de cache, pour implémenter des circuits cryptographiques, pour calculer la durée d'émission sur un bus Ethernet à la suite d'une collision, et j'en passe. Les méthodes que nous allons voir produisent un nombre pseudo-aléatoire un bit à la fois, à quelques exceptions près. Les circuits que nous allons voir fournissent un bit sur leur sortie et ce bit varie de manière assez aléatoire. Les bits en sortie du circuit sont accumulés dans un registre à décalage normal, pour former un nombre aléatoire. Nous appellerons ce registre : l'accumulateur. ===L'usage de registres à décalage à rétroaction=== [[File:Nonlinear-combo-generator.png|thumb|Nonlinear-combo-generator]] La première solution utilise des ''registres à décalages à rétroaction'', les fameux LSFR du chapitre précédent. Un LSFR seul ne fournit pas un aléatoire digne de ce nom, mais il est possible de combiner plusieurs LSFR pour obtenir une meilleure approximation de l'aléatoire. Avec cette technique, plusieurs registres à décalages à rétroaction sont reliés à un circuit combinatoire non-linéaire. Ce circuit prendra en entrée un (ou plusieurs) bit de chaque registre à décalage à rétroaction, et combinera ces bits pour fournir un bit de sortie. [[File:A5-1 GSM cipher.svg|centre|thumb|upright=2|Exemple avec trois LSFR différents, de tailles différentes : le bit envoyé à l'accumulateur est un XOR du bit sortant des trois LSFR.]] Pour rendre le tout encore plus aléatoire, il est possible de cadencer les LSFR à des fréquences différentes. Cette technique est utilisée dans les générateurs ''stop-and-go'', ''alternative step'', et à ''shrinking''. * Le générateur ''alternative step'' utilise trois LSFR. Le premier commande un multiplexeur qui choisit la sortie parmi les deux restants. * Le générateur ''stop-and-go'' utilise deux LSFR. Le premier est relié à l'entrée d'horloge du second et le bit de sortie du second est utilisé comme résultat. Une technique similaire était utilisée dans les processeurs VIA C3, pour l'implémentation de leurs instructions cryptographiques. * Le ''shrinking generator'' utilise deux LSFR cadencés à des vitesses différentes. Si le bit de sortie du premier vaut 1, alors le bit de sortie du second est utilisé comme résultat. Par contre, si le bit de sortie du premier vaut 0, aucun bit n'est fourni en sortie, le bit de sortie du second registre est oublié. ===L'aléatoire généré par des ''timers'' ou des compteurs d'horloge=== Au-delà des LSFR, il est possible d'utiliser des compteurs pour générer du pseudo-aléatoire. Par exemple, une technique très simple utilise un simple ''timer''. Si on a besoin d'un nombre pseudo-aléatoire, il suffit de lire le ''timer'' et d'utiliser le nombre lu comme nombre pseudo-aléatoire. Si le délai entre deux demandes est irrégulier, le résultat semblera aléatoire. Mais il s'agit là d'une technique assez peu fiable dans le monde réel et seules quelques applications bien spécifiques se satisfont de cette méthode. Une solution un peu plus fiable utilise ce qu'on appelle la '''dérive de l'horloge'''. Il faut savoir qu'un signal d'horloge n'est jamais vraiment très précis. Une horloge censée tourner à 1 Ghz ne tournera pas en permanence à 1Ghz exactement, mais verra sa fréquence varier de quelques Hz ou Khz de manière irrégulière. Ces variations peuvent venir de variations aléatoires de température, des variations de tension, des perturbations électromagnétiques, ou à des phénomènes assez compliqués qui peuvent se produire dans tout circuit électrique (comme le ''shot noise''). L'idée la plus simple utilise deux horloges : une horloge lente et une horloge rapide, dont la fréquence est un multiple de l'autre. Par exemple, on peut choisir une fréquence de 1 Mhz et une autre de 100 Hz : la fréquence la plus grande est égale à 10000 fois l'autre. La dérive d'horloge fera son œuvre, les deux horloges seront très légèrement désynchronisées en permanence, et cette désynchronisation peut être utilisée pour produire des nombres aléatoires. Par exemple, on peut compter le nombre de cycles d'horloge produit par l'horloge rapide durant une période de l'horloge lente. Si ce nombre est pair, on produit un bit aléatoire qui vaut 1 , il vaut 0 si ce nombre est pair. Pour information, c'est exactement cette technique qui était utilisée dans l'''Intel 82802 Firmware Hub''. ===L'aléatoire généré par la tension d'alimentation=== Il existe d'autres solutions matérielles qui utilisent le bruit thermique. Tous les circuits électroniques de l'univers sont soumis à de microscopiques variations de température, dues à l'agitation thermique des atomes. Plus la température est élevée, plus les atomes qui composent les fils métalliques des circuits s'agitent. Vu que les particules d'un métal contiennent des charges électriques, ces vibrations font naître des variations de tensions assez infimes. Il suffit d'amplifier ces variations pour obtenir un résultat capable de représenter un zéro ou un 1. Ce principe a été utilisé sur des anciens processeurs Intel qui géraient l'instruction RDRAND, une instruction qui produisait un nombre aléatoire. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les compteurs et timers | prevText=Les compteurs et timers | next=Les circuits de décalage et de rotation | nextText=Les circuits de décalage et de rotation }} </noinclude> qlueejreah5l8knw7hs12zglppbp4wg 768133 768132 2026-06-19T01:09:37Z Mewtow 31375 768133 wikitext text/x-wiki Les '''registres à décalage à rétroaction linéaire''' sont des registres à décalages un peu particuliers. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage. À rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. L'idée est qu'entre la sortie et l'entrée, il y a un circuit combinatoire qui s'intercale entre la sortie et l'entrée, qui calcule ce qu'il faut mettre sur l'entrée, à partir du contenu du registre Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un ''LFSR de Fibonacci'', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''registres à décalage à rétroaction de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] ==Les généralités sur les LSFRs == Quelques propriétés sont communes à tous les LSFRs. Un LSFR est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs. Et ces deux propriétés sont source de comportements qu'on va détailler ci-dessous. Certains LSFRs ont des '''valeurs interdites''', qui bloquent le compteur. Concrètement, une fois que le décompte arrive sur cette valeur, le compteur reste bloqué sur cette valeur. La valeur suivante, calculée par le compteur, est cette valeur elle-même. Tous les compteurs ne sont pas dans ce cas, de nombreux compteurs n'ont pas de valeur interdite. ===La période d'un LSFR=== Si le compteur est initialisé correctement, il passera d'une valeur à l'autre, sans tomber sur une valeur interdite. Dans ce cas, il finira par repasser par une valeur qu'il aura déjà parcourue et son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. La période d'un LSFR dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le LSFR passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un LSFR passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un LSFR=== Les LSFR ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les LSFR ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. Sur de tels LSFRs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celui des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==La génération de nombres pseudo-aléatoires== Les compteurs peuvent aussi être utilisés pour générer des nombres "aléatoires". Je dis aléatoires entre guillemets, car ils ne sont pas vraiment aléatoires, mais s'en rapprochent suffisamment pour être considérés comme tels. Pour mettre en avant cela, on parle aussi de nombres "pseudo-aléatoires". De nombreuses situations demandent de générer des nombres pseudo-aléatoire de manière matérielle. Cela peut servir pour sélectionner une ligne de cache à remplacer lors d'un défaut de cache, pour implémenter des circuits cryptographiques, pour calculer la durée d'émission sur un bus Ethernet à la suite d'une collision, et j'en passe. Les méthodes que nous allons voir produisent un nombre pseudo-aléatoire un bit à la fois, à quelques exceptions près. Les circuits que nous allons voir fournissent un bit sur leur sortie et ce bit varie de manière assez aléatoire. Les bits en sortie du circuit sont accumulés dans un registre à décalage normal, pour former un nombre aléatoire. Nous appellerons ce registre : l'accumulateur. ===L'usage de registres à décalage à rétroaction=== [[File:Nonlinear-combo-generator.png|thumb|Nonlinear-combo-generator]] La première solution utilise des ''registres à décalages à rétroaction'', les fameux LSFR du chapitre précédent. Un LSFR seul ne fournit pas un aléatoire digne de ce nom, mais il est possible de combiner plusieurs LSFR pour obtenir une meilleure approximation de l'aléatoire. Avec cette technique, plusieurs registres à décalages à rétroaction sont reliés à un circuit combinatoire non-linéaire. Ce circuit prendra en entrée un (ou plusieurs) bit de chaque registre à décalage à rétroaction, et combinera ces bits pour fournir un bit de sortie. [[File:A5-1 GSM cipher.svg|centre|thumb|upright=2|Exemple avec trois LSFR différents, de tailles différentes : le bit envoyé à l'accumulateur est un XOR du bit sortant des trois LSFR.]] Pour rendre le tout encore plus aléatoire, il est possible de cadencer les LSFR à des fréquences différentes. Cette technique est utilisée dans les générateurs ''stop-and-go'', ''alternative step'', et à ''shrinking''. * Le générateur ''alternative step'' utilise trois LSFR. Le premier commande un multiplexeur qui choisit la sortie parmi les deux restants. * Le générateur ''stop-and-go'' utilise deux LSFR. Le premier est relié à l'entrée d'horloge du second et le bit de sortie du second est utilisé comme résultat. Une technique similaire était utilisée dans les processeurs VIA C3, pour l'implémentation de leurs instructions cryptographiques. * Le ''shrinking generator'' utilise deux LSFR cadencés à des vitesses différentes. Si le bit de sortie du premier vaut 1, alors le bit de sortie du second est utilisé comme résultat. Par contre, si le bit de sortie du premier vaut 0, aucun bit n'est fourni en sortie, le bit de sortie du second registre est oublié. ===L'aléatoire généré par des ''timers'' ou des compteurs d'horloge=== Au-delà des LSFR, il est possible d'utiliser des compteurs pour générer du pseudo-aléatoire. Par exemple, une technique très simple utilise un simple ''timer''. Si on a besoin d'un nombre pseudo-aléatoire, il suffit de lire le ''timer'' et d'utiliser le nombre lu comme nombre pseudo-aléatoire. Si le délai entre deux demandes est irrégulier, le résultat semblera aléatoire. Mais il s'agit là d'une technique assez peu fiable dans le monde réel et seules quelques applications bien spécifiques se satisfont de cette méthode. Une solution un peu plus fiable utilise ce qu'on appelle la '''dérive de l'horloge'''. Il faut savoir qu'un signal d'horloge n'est jamais vraiment très précis. Une horloge censée tourner à 1 Ghz ne tournera pas en permanence à 1Ghz exactement, mais verra sa fréquence varier de quelques Hz ou Khz de manière irrégulière. Ces variations peuvent venir de variations aléatoires de température, des variations de tension, des perturbations électromagnétiques, ou à des phénomènes assez compliqués qui peuvent se produire dans tout circuit électrique (comme le ''shot noise''). L'idée la plus simple utilise deux horloges : une horloge lente et une horloge rapide, dont la fréquence est un multiple de l'autre. Par exemple, on peut choisir une fréquence de 1 Mhz et une autre de 100 Hz : la fréquence la plus grande est égale à 10000 fois l'autre. La dérive d'horloge fera son œuvre, les deux horloges seront très légèrement désynchronisées en permanence, et cette désynchronisation peut être utilisée pour produire des nombres aléatoires. Par exemple, on peut compter le nombre de cycles d'horloge produit par l'horloge rapide durant une période de l'horloge lente. Si ce nombre est pair, on produit un bit aléatoire qui vaut 1 , il vaut 0 si ce nombre est pair. Pour information, c'est exactement cette technique qui était utilisée dans l'''Intel 82802 Firmware Hub''. ===L'aléatoire généré par la tension d'alimentation=== Il existe d'autres solutions matérielles qui utilisent le bruit thermique. Tous les circuits électroniques de l'univers sont soumis à de microscopiques variations de température, dues à l'agitation thermique des atomes. Plus la température est élevée, plus les atomes qui composent les fils métalliques des circuits s'agitent. Vu que les particules d'un métal contiennent des charges électriques, ces vibrations font naître des variations de tensions assez infimes. Il suffit d'amplifier ces variations pour obtenir un résultat capable de représenter un zéro ou un 1. Ce principe a été utilisé sur des anciens processeurs Intel qui géraient l'instruction RDRAND, une instruction qui produisait un nombre aléatoire. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les compteurs et timers | prevText=Les compteurs et timers | next=Les circuits de décalage et de rotation | nextText=Les circuits de décalage et de rotation }} </noinclude> cr3imcx2pcq9aufao1gw31v5ofhi3xs 768138 768133 2026-06-19T01:24:42Z Mewtow 31375 768138 wikitext text/x-wiki Les '''registres à décalage à rétroaction linéaire''' sont des registres à décalages un peu particuliers. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage. À rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. L'idée est qu'entre la sortie et l'entrée, il y a un circuit combinatoire qui s'intercale entre la sortie et l'entrée, qui calcule ce qu'il faut mettre sur l'entrée, à partir du contenu du registre Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un '''''LFSR de Fibonacci''''', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''LSFR de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] ==Les généralités sur les LSFRs == Quelques propriétés sont communes à tous les LSFRs. Un LSFR est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs. Et ces deux propriétés sont source de comportements qu'on va détailler ci-dessous. Certains LSFRs ont des '''valeurs interdites''', qui bloquent le compteur. Concrètement, une fois que le décompte arrive sur cette valeur, le compteur reste bloqué sur cette valeur. La valeur suivante, calculée par le compteur, est cette valeur elle-même. Tous les compteurs ne sont pas dans ce cas, de nombreux compteurs n'ont pas de valeur interdite. ===La période d'un LSFR=== Si le compteur est initialisé correctement, il passera d'une valeur à l'autre, sans tomber sur une valeur interdite. Dans ce cas, il finira par repasser par une valeur qu'il aura déjà parcourue et son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. La période d'un LSFR dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le LSFR passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un LSFR passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les registres à rétroaction dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un LSFR=== Les LSFR ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les LSFR ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. Sur de tels LSFRs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celui des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==La génération de nombres pseudo-aléatoires== Les compteurs peuvent aussi être utilisés pour générer des nombres "aléatoires". Je dis aléatoires entre guillemets, car ils ne sont pas vraiment aléatoires, mais s'en rapprochent suffisamment pour être considérés comme tels. Pour mettre en avant cela, on parle aussi de nombres "pseudo-aléatoires". De nombreuses situations demandent de générer des nombres pseudo-aléatoire de manière matérielle. Cela peut servir pour sélectionner une ligne de cache à remplacer lors d'un défaut de cache, pour implémenter des circuits cryptographiques, pour calculer la durée d'émission sur un bus Ethernet à la suite d'une collision, et j'en passe. Les méthodes que nous allons voir produisent un nombre pseudo-aléatoire un bit à la fois, à quelques exceptions près. Les circuits que nous allons voir fournissent un bit sur leur sortie et ce bit varie de manière assez aléatoire. Les bits en sortie du circuit sont accumulés dans un registre à décalage normal, pour former un nombre aléatoire. Nous appellerons ce registre : l'accumulateur. ===L'usage de registres à décalage à rétroaction=== [[File:Nonlinear-combo-generator.png|thumb|Nonlinear-combo-generator]] La première solution utilise des ''registres à décalages à rétroaction'', les fameux LSFR du chapitre précédent. Un LSFR seul ne fournit pas un aléatoire digne de ce nom, mais il est possible de combiner plusieurs LSFR pour obtenir une meilleure approximation de l'aléatoire. Avec cette technique, plusieurs registres à décalages à rétroaction sont reliés à un circuit combinatoire non-linéaire. Ce circuit prendra en entrée un (ou plusieurs) bit de chaque registre à décalage à rétroaction, et combinera ces bits pour fournir un bit de sortie. [[File:A5-1 GSM cipher.svg|centre|thumb|upright=2|Exemple avec trois LSFR différents, de tailles différentes : le bit envoyé à l'accumulateur est un XOR du bit sortant des trois LSFR.]] Pour rendre le tout encore plus aléatoire, il est possible de cadencer les LSFR à des fréquences différentes. Cette technique est utilisée dans les générateurs ''stop-and-go'', ''alternative step'', et à ''shrinking''. * Le générateur ''alternative step'' utilise trois LSFR. Le premier commande un multiplexeur qui choisit la sortie parmi les deux restants. * Le générateur ''stop-and-go'' utilise deux LSFR. Le premier est relié à l'entrée d'horloge du second et le bit de sortie du second est utilisé comme résultat. Une technique similaire était utilisée dans les processeurs VIA C3, pour l'implémentation de leurs instructions cryptographiques. * Le ''shrinking generator'' utilise deux LSFR cadencés à des vitesses différentes. Si le bit de sortie du premier vaut 1, alors le bit de sortie du second est utilisé comme résultat. Par contre, si le bit de sortie du premier vaut 0, aucun bit n'est fourni en sortie, le bit de sortie du second registre est oublié. ===L'aléatoire généré par des ''timers'' ou des compteurs d'horloge=== Au-delà des LSFR, il est possible d'utiliser des compteurs pour générer du pseudo-aléatoire. Par exemple, une technique très simple utilise un simple ''timer''. Si on a besoin d'un nombre pseudo-aléatoire, il suffit de lire le ''timer'' et d'utiliser le nombre lu comme nombre pseudo-aléatoire. Si le délai entre deux demandes est irrégulier, le résultat semblera aléatoire. Mais il s'agit là d'une technique assez peu fiable dans le monde réel et seules quelques applications bien spécifiques se satisfont de cette méthode. Une solution un peu plus fiable utilise ce qu'on appelle la '''dérive de l'horloge'''. Il faut savoir qu'un signal d'horloge n'est jamais vraiment très précis. Une horloge censée tourner à 1 Ghz ne tournera pas en permanence à 1Ghz exactement, mais verra sa fréquence varier de quelques Hz ou Khz de manière irrégulière. Ces variations peuvent venir de variations aléatoires de température, des variations de tension, des perturbations électromagnétiques, ou à des phénomènes assez compliqués qui peuvent se produire dans tout circuit électrique (comme le ''shot noise''). L'idée la plus simple utilise deux horloges : une horloge lente et une horloge rapide, dont la fréquence est un multiple de l'autre. Par exemple, on peut choisir une fréquence de 1 Mhz et une autre de 100 Hz : la fréquence la plus grande est égale à 10000 fois l'autre. La dérive d'horloge fera son œuvre, les deux horloges seront très légèrement désynchronisées en permanence, et cette désynchronisation peut être utilisée pour produire des nombres aléatoires. Par exemple, on peut compter le nombre de cycles d'horloge produit par l'horloge rapide durant une période de l'horloge lente. Si ce nombre est pair, on produit un bit aléatoire qui vaut 1 , il vaut 0 si ce nombre est pair. Pour information, c'est exactement cette technique qui était utilisée dans l'''Intel 82802 Firmware Hub''. ===L'aléatoire généré par la tension d'alimentation=== Il existe d'autres solutions matérielles qui utilisent le bruit thermique. Tous les circuits électroniques de l'univers sont soumis à de microscopiques variations de température, dues à l'agitation thermique des atomes. Plus la température est élevée, plus les atomes qui composent les fils métalliques des circuits s'agitent. Vu que les particules d'un métal contiennent des charges électriques, ces vibrations font naître des variations de tensions assez infimes. Il suffit d'amplifier ces variations pour obtenir un résultat capable de représenter un zéro ou un 1. Ce principe a été utilisé sur des anciens processeurs Intel qui géraient l'instruction RDRAND, une instruction qui produisait un nombre aléatoire. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les compteurs et timers | prevText=Les compteurs et timers | next=Les circuits de décalage et de rotation | nextText=Les circuits de décalage et de rotation }} </noinclude> ndxslp0jplwyle4rd84f1aduyii33fo 768139 768138 2026-06-19T01:25:22Z Mewtow 31375 /* La période d'un LSFR */ 768139 wikitext text/x-wiki Les '''registres à décalage à rétroaction linéaire''' sont des registres à décalages un peu particuliers. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage. À rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. L'idée est qu'entre la sortie et l'entrée, il y a un circuit combinatoire qui s'intercale entre la sortie et l'entrée, qui calcule ce qu'il faut mettre sur l'entrée, à partir du contenu du registre Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un '''''LFSR de Fibonacci''''', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''LSFR de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] ==Les généralités sur les LSFRs == Quelques propriétés sont communes à tous les LSFRs. Un LSFR est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs. Et ces deux propriétés sont source de comportements qu'on va détailler ci-dessous. Certains LSFRs ont des '''valeurs interdites''', qui bloquent le compteur. Concrètement, une fois que le décompte arrive sur cette valeur, le compteur reste bloqué sur cette valeur. La valeur suivante, calculée par le compteur, est cette valeur elle-même. Tous les compteurs ne sont pas dans ce cas, de nombreux compteurs n'ont pas de valeur interdite. ===La période d'un LSFR=== Si le compteur est initialisé correctement, il passera d'une valeur à l'autre et finira par repasser par une valeur qu'il aura déjà parcourue et son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. La période d'un LSFR dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le LSFR passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un LSFR passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les LSFR dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ===L'initialisation d'un LSFR=== Les LSFR ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les LSFR ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. Sur de tels LSFRs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celui des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ==La génération de nombres pseudo-aléatoires== Les compteurs peuvent aussi être utilisés pour générer des nombres "aléatoires". Je dis aléatoires entre guillemets, car ils ne sont pas vraiment aléatoires, mais s'en rapprochent suffisamment pour être considérés comme tels. Pour mettre en avant cela, on parle aussi de nombres "pseudo-aléatoires". De nombreuses situations demandent de générer des nombres pseudo-aléatoire de manière matérielle. Cela peut servir pour sélectionner une ligne de cache à remplacer lors d'un défaut de cache, pour implémenter des circuits cryptographiques, pour calculer la durée d'émission sur un bus Ethernet à la suite d'une collision, et j'en passe. Les méthodes que nous allons voir produisent un nombre pseudo-aléatoire un bit à la fois, à quelques exceptions près. Les circuits que nous allons voir fournissent un bit sur leur sortie et ce bit varie de manière assez aléatoire. Les bits en sortie du circuit sont accumulés dans un registre à décalage normal, pour former un nombre aléatoire. Nous appellerons ce registre : l'accumulateur. ===L'usage de registres à décalage à rétroaction=== [[File:Nonlinear-combo-generator.png|thumb|Nonlinear-combo-generator]] La première solution utilise des ''registres à décalages à rétroaction'', les fameux LSFR du chapitre précédent. Un LSFR seul ne fournit pas un aléatoire digne de ce nom, mais il est possible de combiner plusieurs LSFR pour obtenir une meilleure approximation de l'aléatoire. Avec cette technique, plusieurs registres à décalages à rétroaction sont reliés à un circuit combinatoire non-linéaire. Ce circuit prendra en entrée un (ou plusieurs) bit de chaque registre à décalage à rétroaction, et combinera ces bits pour fournir un bit de sortie. [[File:A5-1 GSM cipher.svg|centre|thumb|upright=2|Exemple avec trois LSFR différents, de tailles différentes : le bit envoyé à l'accumulateur est un XOR du bit sortant des trois LSFR.]] Pour rendre le tout encore plus aléatoire, il est possible de cadencer les LSFR à des fréquences différentes. Cette technique est utilisée dans les générateurs ''stop-and-go'', ''alternative step'', et à ''shrinking''. * Le générateur ''alternative step'' utilise trois LSFR. Le premier commande un multiplexeur qui choisit la sortie parmi les deux restants. * Le générateur ''stop-and-go'' utilise deux LSFR. Le premier est relié à l'entrée d'horloge du second et le bit de sortie du second est utilisé comme résultat. Une technique similaire était utilisée dans les processeurs VIA C3, pour l'implémentation de leurs instructions cryptographiques. * Le ''shrinking generator'' utilise deux LSFR cadencés à des vitesses différentes. Si le bit de sortie du premier vaut 1, alors le bit de sortie du second est utilisé comme résultat. Par contre, si le bit de sortie du premier vaut 0, aucun bit n'est fourni en sortie, le bit de sortie du second registre est oublié. ===L'aléatoire généré par des ''timers'' ou des compteurs d'horloge=== Au-delà des LSFR, il est possible d'utiliser des compteurs pour générer du pseudo-aléatoire. Par exemple, une technique très simple utilise un simple ''timer''. Si on a besoin d'un nombre pseudo-aléatoire, il suffit de lire le ''timer'' et d'utiliser le nombre lu comme nombre pseudo-aléatoire. Si le délai entre deux demandes est irrégulier, le résultat semblera aléatoire. Mais il s'agit là d'une technique assez peu fiable dans le monde réel et seules quelques applications bien spécifiques se satisfont de cette méthode. Une solution un peu plus fiable utilise ce qu'on appelle la '''dérive de l'horloge'''. Il faut savoir qu'un signal d'horloge n'est jamais vraiment très précis. Une horloge censée tourner à 1 Ghz ne tournera pas en permanence à 1Ghz exactement, mais verra sa fréquence varier de quelques Hz ou Khz de manière irrégulière. Ces variations peuvent venir de variations aléatoires de température, des variations de tension, des perturbations électromagnétiques, ou à des phénomènes assez compliqués qui peuvent se produire dans tout circuit électrique (comme le ''shot noise''). L'idée la plus simple utilise deux horloges : une horloge lente et une horloge rapide, dont la fréquence est un multiple de l'autre. Par exemple, on peut choisir une fréquence de 1 Mhz et une autre de 100 Hz : la fréquence la plus grande est égale à 10000 fois l'autre. La dérive d'horloge fera son œuvre, les deux horloges seront très légèrement désynchronisées en permanence, et cette désynchronisation peut être utilisée pour produire des nombres aléatoires. Par exemple, on peut compter le nombre de cycles d'horloge produit par l'horloge rapide durant une période de l'horloge lente. Si ce nombre est pair, on produit un bit aléatoire qui vaut 1 , il vaut 0 si ce nombre est pair. Pour information, c'est exactement cette technique qui était utilisée dans l'''Intel 82802 Firmware Hub''. ===L'aléatoire généré par la tension d'alimentation=== Il existe d'autres solutions matérielles qui utilisent le bruit thermique. Tous les circuits électroniques de l'univers sont soumis à de microscopiques variations de température, dues à l'agitation thermique des atomes. Plus la température est élevée, plus les atomes qui composent les fils métalliques des circuits s'agitent. Vu que les particules d'un métal contiennent des charges électriques, ces vibrations font naître des variations de tensions assez infimes. Il suffit d'amplifier ces variations pour obtenir un résultat capable de représenter un zéro ou un 1. Ce principe a été utilisé sur des anciens processeurs Intel qui géraient l'instruction RDRAND, une instruction qui produisait un nombre aléatoire. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les compteurs et timers | prevText=Les compteurs et timers | next=Les circuits de décalage et de rotation | nextText=Les circuits de décalage et de rotation }} </noinclude> jua9jlai26vwb9zuuko6hsoej9nxf9z 768140 768139 2026-06-19T01:25:43Z Mewtow 31375 /* Les généralités sur les LSFRs */ 768140 wikitext text/x-wiki Les '''registres à décalage à rétroaction linéaire''' sont des registres à décalages un peu particuliers. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage. À rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. L'idée est qu'entre la sortie et l'entrée, il y a un circuit combinatoire qui s'intercale entre la sortie et l'entrée, qui calcule ce qu'il faut mettre sur l'entrée, à partir du contenu du registre Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un '''''LFSR de Fibonacci''''', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''LSFR de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] ==Les généralités sur les LSFRs == Quelques propriétés sont communes à tous les LSFRs. Un LSFR est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs. Et ces deux propriétés sont source de comportements qu'on va détailler ci-dessous. Certains LSFRs ont des '''valeurs interdites''', qui bloquent le compteur. Concrètement, une fois que le décompte arrive sur cette valeur, le compteur reste bloqué sur cette valeur. La valeur suivante, calculée par le compteur, est cette valeur elle-même. Tous les compteurs ne sont pas dans ce cas, de nombreux compteurs n'ont pas de valeur interdite. ===L'initialisation d'un LSFR=== Les LSFR ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une valeur interdite qui bloque le compteur, sans compter que les débordements d'entiers y sont impossibles. Pour ce qui est de l'initialisation, tous les LSFR ne sont pas égaux : soit le compteur peut être initialisé avec zéro sans que cela pose problème, soit ce n'est pas le cas. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. Sur de tels LSFRs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celui des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ===La période d'un LSFR=== Si le compteur est initialisé correctement, il passera d'une valeur à l'autre et finira par repasser par une valeur qu'il aura déjà parcourue et son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. La période d'un LSFR dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le LSFR passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un LSFR passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les LSFR dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ==La génération de nombres pseudo-aléatoires== Les compteurs peuvent aussi être utilisés pour générer des nombres "aléatoires". Je dis aléatoires entre guillemets, car ils ne sont pas vraiment aléatoires, mais s'en rapprochent suffisamment pour être considérés comme tels. Pour mettre en avant cela, on parle aussi de nombres "pseudo-aléatoires". De nombreuses situations demandent de générer des nombres pseudo-aléatoire de manière matérielle. Cela peut servir pour sélectionner une ligne de cache à remplacer lors d'un défaut de cache, pour implémenter des circuits cryptographiques, pour calculer la durée d'émission sur un bus Ethernet à la suite d'une collision, et j'en passe. Les méthodes que nous allons voir produisent un nombre pseudo-aléatoire un bit à la fois, à quelques exceptions près. Les circuits que nous allons voir fournissent un bit sur leur sortie et ce bit varie de manière assez aléatoire. Les bits en sortie du circuit sont accumulés dans un registre à décalage normal, pour former un nombre aléatoire. Nous appellerons ce registre : l'accumulateur. ===L'usage de registres à décalage à rétroaction=== [[File:Nonlinear-combo-generator.png|thumb|Nonlinear-combo-generator]] La première solution utilise des ''registres à décalages à rétroaction'', les fameux LSFR du chapitre précédent. Un LSFR seul ne fournit pas un aléatoire digne de ce nom, mais il est possible de combiner plusieurs LSFR pour obtenir une meilleure approximation de l'aléatoire. Avec cette technique, plusieurs registres à décalages à rétroaction sont reliés à un circuit combinatoire non-linéaire. Ce circuit prendra en entrée un (ou plusieurs) bit de chaque registre à décalage à rétroaction, et combinera ces bits pour fournir un bit de sortie. [[File:A5-1 GSM cipher.svg|centre|thumb|upright=2|Exemple avec trois LSFR différents, de tailles différentes : le bit envoyé à l'accumulateur est un XOR du bit sortant des trois LSFR.]] Pour rendre le tout encore plus aléatoire, il est possible de cadencer les LSFR à des fréquences différentes. Cette technique est utilisée dans les générateurs ''stop-and-go'', ''alternative step'', et à ''shrinking''. * Le générateur ''alternative step'' utilise trois LSFR. Le premier commande un multiplexeur qui choisit la sortie parmi les deux restants. * Le générateur ''stop-and-go'' utilise deux LSFR. Le premier est relié à l'entrée d'horloge du second et le bit de sortie du second est utilisé comme résultat. Une technique similaire était utilisée dans les processeurs VIA C3, pour l'implémentation de leurs instructions cryptographiques. * Le ''shrinking generator'' utilise deux LSFR cadencés à des vitesses différentes. Si le bit de sortie du premier vaut 1, alors le bit de sortie du second est utilisé comme résultat. Par contre, si le bit de sortie du premier vaut 0, aucun bit n'est fourni en sortie, le bit de sortie du second registre est oublié. ===L'aléatoire généré par des ''timers'' ou des compteurs d'horloge=== Au-delà des LSFR, il est possible d'utiliser des compteurs pour générer du pseudo-aléatoire. Par exemple, une technique très simple utilise un simple ''timer''. Si on a besoin d'un nombre pseudo-aléatoire, il suffit de lire le ''timer'' et d'utiliser le nombre lu comme nombre pseudo-aléatoire. Si le délai entre deux demandes est irrégulier, le résultat semblera aléatoire. Mais il s'agit là d'une technique assez peu fiable dans le monde réel et seules quelques applications bien spécifiques se satisfont de cette méthode. Une solution un peu plus fiable utilise ce qu'on appelle la '''dérive de l'horloge'''. Il faut savoir qu'un signal d'horloge n'est jamais vraiment très précis. Une horloge censée tourner à 1 Ghz ne tournera pas en permanence à 1Ghz exactement, mais verra sa fréquence varier de quelques Hz ou Khz de manière irrégulière. Ces variations peuvent venir de variations aléatoires de température, des variations de tension, des perturbations électromagnétiques, ou à des phénomènes assez compliqués qui peuvent se produire dans tout circuit électrique (comme le ''shot noise''). L'idée la plus simple utilise deux horloges : une horloge lente et une horloge rapide, dont la fréquence est un multiple de l'autre. Par exemple, on peut choisir une fréquence de 1 Mhz et une autre de 100 Hz : la fréquence la plus grande est égale à 10000 fois l'autre. La dérive d'horloge fera son œuvre, les deux horloges seront très légèrement désynchronisées en permanence, et cette désynchronisation peut être utilisée pour produire des nombres aléatoires. Par exemple, on peut compter le nombre de cycles d'horloge produit par l'horloge rapide durant une période de l'horloge lente. Si ce nombre est pair, on produit un bit aléatoire qui vaut 1 , il vaut 0 si ce nombre est pair. Pour information, c'est exactement cette technique qui était utilisée dans l'''Intel 82802 Firmware Hub''. ===L'aléatoire généré par la tension d'alimentation=== Il existe d'autres solutions matérielles qui utilisent le bruit thermique. Tous les circuits électroniques de l'univers sont soumis à de microscopiques variations de température, dues à l'agitation thermique des atomes. Plus la température est élevée, plus les atomes qui composent les fils métalliques des circuits s'agitent. Vu que les particules d'un métal contiennent des charges électriques, ces vibrations font naître des variations de tensions assez infimes. Il suffit d'amplifier ces variations pour obtenir un résultat capable de représenter un zéro ou un 1. Ce principe a été utilisé sur des anciens processeurs Intel qui géraient l'instruction RDRAND, une instruction qui produisait un nombre aléatoire. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les compteurs et timers | prevText=Les compteurs et timers | next=Les circuits de décalage et de rotation | nextText=Les circuits de décalage et de rotation }} </noinclude> jjmqy6f0brq8a51nmlxnicnhoxwiwey 768141 768140 2026-06-19T01:26:46Z Mewtow 31375 /* Les généralités sur les LSFRs */ 768141 wikitext text/x-wiki Les '''registres à décalage à rétroaction linéaire''' sont des registres à décalages un peu particuliers. Le terme anglais pour de tels registres est ''Linear Feedback Shift Register'', ce qui s’abrège en LFSR. Nous utiliserons cette abréviation dans ce qui suit pour simplifier grandement l'écriture. Les LFSR sont appelés ainsi pour plusieurs raisons. Déjà, registre à décalage implique qu'ils sont fabriqués avec un registre à décalage. À rétroaction indique que l'on boucle la sortie sur l'entrée. Le terme combinaison linéaire demande quelques explications. L'idée est qu'entre la sortie et l'entrée, il y a un circuit combinatoire qui s'intercale entre la sortie et l'entrée, qui calcule ce qu'il faut mettre sur l'entrée, à partir du contenu du registre Pour simplifier, cela veut dire qu'on multiplie chaque bit par 0 ou 1, avant d'additionner le tout. Dans ce calcul, on ne garde qu'un seul bit du résultat, vu que l'entrée du registre à décalage ne fait qu'un bit. Par simplicité, on ne garde que le bit de poids faible. Or, il s'avère que cela simplifie grandement les calculs, car cela permet de remplacer les additions par une simple opération XOR. : <math>1 \times a_n \oplus ... + 1 \oplus a_3 + 1 \oplus a_1</math> Le résultat est ce que l'on appelle un '''''LFSR de Fibonacci''''', ou encore un LFSR classique, qui celui qui colle le mieux avec la définition. [[File:LFSR-F16.gif|centre|vignette|upright=2|Registre à décalage à rétroaction de Fibonnaci.]] Les '''registres à décalages à rétroaction affine''' sont identique aux précédents à une différence près : le bit calculé est inversé avant d'être inséré dans le registre. Un tel circuit est donc composé de portes NXOR, comparé à son comparse linéaire, composé à partir de portes XOR. Petite remarque : si je prends un registre à rétroaction linéaire et un registre à rétroaction affine avec les mêmes coefficients sur les mêmes bits, le résultat du premier sera égal à l'inverse de l'autre. Les '''LSFR de Gallois''' sont un peu l'inverse des LFSR vus juste avant. Au lieu d'utiliser un registre à décalage SIPO, ils utilisent un registre à décalage PISO. Pour faire la différence, nous appellerons ces derniers les LFSR PISO, et les premiers LFSR SIPO. Avec les LFSR PISO, on prend le bit sortant et on en déduit plusieurs bits à partir d'un circuit combinatoire, qui sont chacun insérés dans le registre à décalage à un endroit bien précis. Bien sûr, la fonction qui calcule des différents bits à partir du bit d'entrée conserve les mêmes propriétés que celle utilisée pour les LFSR : elle se calcule avec uniquement des portes XOR, ou NXOR pour leur variante affine. Leur avantage est qu'ils sont plus rapides, car il n'y a qu'une seule porte logique entre la sortie et une entrée du registre à décalage, contre potentiellement plusieurs avec les LFSR SIPO. Notons que tout comme les LFSR qui ne peuvent pas mémoriser un 0, de tels registres à décalage à rétroaction ne peuvent pas avoir la valeur maximale stockable dans le registre. Cette valeur gèle le registre à cette valeur, dans le sens où le résultat au cycle suivant sera identique. Mais cela ne pose pas de problèmes pour l'initialisation du compteur. [[File:LFSR-G16.svg|centre|vignette|upright=2|Registre à décalage à rétroaction de Galois.]] ==Les généralités sur les LSFRs == Quelques propriétés sont communes à tous les LSFRs. Un LSFR est déterministe : pour le même résultat en entrée, il donnera toujours le même résultat en sortie. De plus, il ne peut contenir qu'un nombre fini de valeurs. Et ces deux propriétés sont source de comportements qu'on va détailler ci-dessous. ===L'initialisation d'un LSFR=== Les LSFR ne peuvent pas être initialisés à une valeur arbitraire, en raison de la présence d'une '''valeur interdite'''. Concrètement, une fois que le décompte arrive sur une valeur interdite, le compteur reste bloqué sur cette valeur. La valeur suivante, calculée par le compteur, est cette valeur elle-même. Le premier cas est celui où le compteur peut être initialisé avec zéro sans que cela ne pose problème. Sur de tels LSFRs, la réinitialisation se fait comme pour n'importe quel registre/compteur. A savoir que les entrées de reset des bascules sont toutes connectées ensemble, au même signal de reset. [[File:Johnson Counter 4bit.svg|centre|vignette|upright=2|Compteur de Johnson de 4 bits]] Le second cas est celui des LFSR non-affine. Lors de la réinitialisation, il faut que toutes les bascules soient réinitialisées à 0, sauf une qui est mise à 1. La bascule en question doit disposer d'une entrée S (''Set'') qui met la bascule à 1 quand elle est activée. Cela garantit que le registre est réinitialisé avec un zéro codé en ''one-hot''. [[File:Overbeck Counter 4bit.svg|centre|vignette|upright=2|Compteur en anneau de 4 bits]] Une autre solution est de mettre un multiplexeur juste avant l'entrée du registre à décalage. Cette solution marché bien dans le sens où elle permet d'initialiser le registre avec une valeur arbitraire, qui est insérée dans le registre en plusieurs cycles. Pour les LFSR, le multiplexeur est connecté soit au bit calculé par les portes XOR, soit par une entrée servant uniquement de l'initialisation. [[File:Initialisation d'un LFSR.jpg|centre|vignette|upright=2|Initialisation d'un LFSR]] ===La période d'un LSFR=== Si le compteur est initialisé correctement, il passera d'une valeur à l'autre et finira par repasser par une valeur qu'il aura déjà parcourue et son fonctionnement se reproduira à l'identique comparé à son passage antérieur, il bouclera. Il parcourt un nombre N de valeurs à chaque cycle, ce nombre étant appelé la '''période du compteur'''. La période d'un LSFR dépend fortement de la fonction utilisée pour calculer le bit de sortie. Dans le meilleur des cas, le LSFR passera par toutes les valeurs que le registre peut prendre, sauf une : suivant le registre, le zéro ou sa valeur maximale sont interdits. Si un LSFR passe par zéro, il y reste bloqué définitivement. La raison à cela est simple : un XOR sur des zéros donnera toujours 0. Le même raisonnement peut être tenu pour les registres à rétroaction affine, sauf que cette fois-ci, c'est la valeur maximale stockable dans le registre qui est fautive. Tout le chalenge consiste donc à trouver quels sont les LSFR dont la période est maximale : ceux dont la période vaut <math>2^n - 1</math>. Qu'on se rassure, quelle que soit la longueur du registre, il en existe au moins un : cela se prouve mathématiquement. <noinclude>[[File:LFSR-F4.GIF|centre|vignette|upright=2|Exemple avec un registre à rétroaction linéaire de 4 bits.]]</noinclude> ==La génération de nombres pseudo-aléatoires== Les compteurs peuvent aussi être utilisés pour générer des nombres "aléatoires". Je dis aléatoires entre guillemets, car ils ne sont pas vraiment aléatoires, mais s'en rapprochent suffisamment pour être considérés comme tels. Pour mettre en avant cela, on parle aussi de nombres "pseudo-aléatoires". De nombreuses situations demandent de générer des nombres pseudo-aléatoire de manière matérielle. Cela peut servir pour sélectionner une ligne de cache à remplacer lors d'un défaut de cache, pour implémenter des circuits cryptographiques, pour calculer la durée d'émission sur un bus Ethernet à la suite d'une collision, et j'en passe. Les méthodes que nous allons voir produisent un nombre pseudo-aléatoire un bit à la fois, à quelques exceptions près. Les circuits que nous allons voir fournissent un bit sur leur sortie et ce bit varie de manière assez aléatoire. Les bits en sortie du circuit sont accumulés dans un registre à décalage normal, pour former un nombre aléatoire. Nous appellerons ce registre : l'accumulateur. ===L'usage de registres à décalage à rétroaction=== [[File:Nonlinear-combo-generator.png|thumb|Nonlinear-combo-generator]] La première solution utilise des ''registres à décalages à rétroaction'', les fameux LSFR du chapitre précédent. Un LSFR seul ne fournit pas un aléatoire digne de ce nom, mais il est possible de combiner plusieurs LSFR pour obtenir une meilleure approximation de l'aléatoire. Avec cette technique, plusieurs registres à décalages à rétroaction sont reliés à un circuit combinatoire non-linéaire. Ce circuit prendra en entrée un (ou plusieurs) bit de chaque registre à décalage à rétroaction, et combinera ces bits pour fournir un bit de sortie. [[File:A5-1 GSM cipher.svg|centre|thumb|upright=2|Exemple avec trois LSFR différents, de tailles différentes : le bit envoyé à l'accumulateur est un XOR du bit sortant des trois LSFR.]] Pour rendre le tout encore plus aléatoire, il est possible de cadencer les LSFR à des fréquences différentes. Cette technique est utilisée dans les générateurs ''stop-and-go'', ''alternative step'', et à ''shrinking''. * Le générateur ''alternative step'' utilise trois LSFR. Le premier commande un multiplexeur qui choisit la sortie parmi les deux restants. * Le générateur ''stop-and-go'' utilise deux LSFR. Le premier est relié à l'entrée d'horloge du second et le bit de sortie du second est utilisé comme résultat. Une technique similaire était utilisée dans les processeurs VIA C3, pour l'implémentation de leurs instructions cryptographiques. * Le ''shrinking generator'' utilise deux LSFR cadencés à des vitesses différentes. Si le bit de sortie du premier vaut 1, alors le bit de sortie du second est utilisé comme résultat. Par contre, si le bit de sortie du premier vaut 0, aucun bit n'est fourni en sortie, le bit de sortie du second registre est oublié. ===L'aléatoire généré par des ''timers'' ou des compteurs d'horloge=== Au-delà des LSFR, il est possible d'utiliser des compteurs pour générer du pseudo-aléatoire. Par exemple, une technique très simple utilise un simple ''timer''. Si on a besoin d'un nombre pseudo-aléatoire, il suffit de lire le ''timer'' et d'utiliser le nombre lu comme nombre pseudo-aléatoire. Si le délai entre deux demandes est irrégulier, le résultat semblera aléatoire. Mais il s'agit là d'une technique assez peu fiable dans le monde réel et seules quelques applications bien spécifiques se satisfont de cette méthode. Une solution un peu plus fiable utilise ce qu'on appelle la '''dérive de l'horloge'''. Il faut savoir qu'un signal d'horloge n'est jamais vraiment très précis. Une horloge censée tourner à 1 Ghz ne tournera pas en permanence à 1Ghz exactement, mais verra sa fréquence varier de quelques Hz ou Khz de manière irrégulière. Ces variations peuvent venir de variations aléatoires de température, des variations de tension, des perturbations électromagnétiques, ou à des phénomènes assez compliqués qui peuvent se produire dans tout circuit électrique (comme le ''shot noise''). L'idée la plus simple utilise deux horloges : une horloge lente et une horloge rapide, dont la fréquence est un multiple de l'autre. Par exemple, on peut choisir une fréquence de 1 Mhz et une autre de 100 Hz : la fréquence la plus grande est égale à 10000 fois l'autre. La dérive d'horloge fera son œuvre, les deux horloges seront très légèrement désynchronisées en permanence, et cette désynchronisation peut être utilisée pour produire des nombres aléatoires. Par exemple, on peut compter le nombre de cycles d'horloge produit par l'horloge rapide durant une période de l'horloge lente. Si ce nombre est pair, on produit un bit aléatoire qui vaut 1 , il vaut 0 si ce nombre est pair. Pour information, c'est exactement cette technique qui était utilisée dans l'''Intel 82802 Firmware Hub''. ===L'aléatoire généré par la tension d'alimentation=== Il existe d'autres solutions matérielles qui utilisent le bruit thermique. Tous les circuits électroniques de l'univers sont soumis à de microscopiques variations de température, dues à l'agitation thermique des atomes. Plus la température est élevée, plus les atomes qui composent les fils métalliques des circuits s'agitent. Vu que les particules d'un métal contiennent des charges électriques, ces vibrations font naître des variations de tensions assez infimes. Il suffit d'amplifier ces variations pour obtenir un résultat capable de représenter un zéro ou un 1. Ce principe a été utilisé sur des anciens processeurs Intel qui géraient l'instruction RDRAND, une instruction qui produisait un nombre aléatoire. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les compteurs et timers | prevText=Les compteurs et timers | next=Les circuits de décalage et de rotation | nextText=Les circuits de décalage et de rotation }} </noinclude> 6dgjua9v7j1ncebvajcxilrxp0gn8i2 Recherches sur les naissances « physiologique » et « naturelle »/Quelques généralités évolutives 0 81155 767983 721617 2026-06-18T13:22:33Z ~2026-35455-08 124038 Mise en forme de la première entrée de liste à puce d'une note sur les placentations. 767983 wikitext text/x-wiki <noinclude>{{Recherches sur les naissances « physiologique » et « naturelle »}}</noinclude> La gestation (appelée grossesse chez les Humains) est un phénomène physiologique lié à la reproduction chez les femelles des animaux vivipares (exception faites des ''Syngnathidae'', la famille de poissons osseux qui contient les hippocampes, et chez qui c'est le mâle qui vit la gestation). Presque tous les mammifères ont une phase de gestation, mis à part les Protothériens (échidnés, ornithorinques) qui sont ovipares. Les Mammifères qui effectuent une gestation de type placentaire forment la sous-classe des Thériens, incluant Euthériens et Marsupiaux. Pour la petite histoire, ''Euthérien'' est un clade regroupant les ''Placentalia'', les espèces placentaires, et les taxons fossiles plus proches des placentaires que des marsupiaux. Pour faire simple, c’est ''presque'' la même chose que ''Placentalia''. La gestation est une période pendant laquelle la progéniture se développe à l'intérieur du corps de la future mère dans une matrice spécialisée, comme l’utérus chez les Humains, débutant avec la nidation de l'œuf et destinée à se terminer avec la parturition / mise-bas / accouchement. La différence majeure d'avec l'incubation ovovivipare tient à la matrotrophie ''in utero'', c’est-à-dire le fait pour un embryon ''in utero'' de recevoir une alimentation extra-vitelline (c'est-à-dire en plus de la réserve de nutriments appelée vésicule vitelline, ou lecithocèle, qui apparaît au troisième jour) fournie par la mère durant le développement. Il existe également des formes de matrotrophies extra-utérines (l’allaitement par exemple), et même des cas de cannibalisme post-partum chez certaines araignées. La gestation correspond au temps qui s’écoule entre la fécondation et la naissance. Certaines espèces sont cependant capables de moduler cette durée : il y a « diapause » par exemple chez le kangourou, chez la femelle chevreuil, ''etc''. ‒ durée par ailleurs très variable selon les espèces, et même selon les individus au sein d'une même espèce. Une femelle portant une progéniture en gestation est dite gravide, gestante, ou enceinte chez les Humains. La divergence de notre mode de gestation très particulier, même avec les autres primates non humains, et comme le développent Pavličev et al. (2020) est probablement due à l’augmentation de la taille du cerveau<ref>Pavličev M, Romero R, Mitteroecker P. Evolution of the human pelvis and obstructed labor: new explanations of an old obstetrical dilemma. Am J Obstet Gynecol. 2020 Jan;222(1):3-16. DOI : 10.1016/j.ajog.2019.06.043. </ref>. Il semble que le cadre conceptuel pour décrire les processus communs à tous les mammifères euthériens le plus élaboré actuellement soit celui de Rokas & ''al''. (2020)<ref>Antonis Rokas, Sam Mesiano, Ortal Tamam, Abigail LaBella, Ge Zhang, Louis Muglia (2020) Developing a theoretical evolutionary framework to solve the mystery of parturition initiation eLife 9:e58343 https://doi.org/10.7554/eLife.58343.</ref>. * La grossesse est un état temporaire qui comporte un risque de mortalité pour les femmes enceintes et leur fœtus/nouveau-nés et donc doit se terminer par l'expulsion ou la résorption du conceptus. Le conceptus désigne l’embryon accompagné de ses appendices, placenta, amnio, chorion, vésicule vitelline, cordon. La rétention du ''conceptus'' nécessite que le processus de parturition soit en sommeil ou activement bloqué pendant une durée de gestation spécifique. L'hormone stéroïde progestérone (cf. ''[[progéstérone]]'') est un signal endocrinien qui sert à cette fin<ref>Rothchild I (2003) The yolkless egg and the evolution of eutherian viviparity ''Biology of Reproduction'' 68:337–357. https://doi.org/10.1095/biolreprod.102.004531 et Young IR & al. (2010) The comparative physiology of parturition in mammals: Hormones and parturition in mammals In: Norris D, Lopez K, editors. ''Hormones and Reproduction in Vertebrates''. London: Academic Press. pp. 95–116. https://doi.org/10.1016/B978-0-12-374928-4.10006-9.</ref>, et qui a été conservé chez les espèces vivipares ; notons que la viviparité reste relativement rare ‒ les scorpions et les mammifères thériens étant de rares exemples de taxons majeurs entièrement vivipares. Comme l’écrit non sans humour [[wikipedia:David_Bainbridge_(scientist)|David Bainbridge]], « ''La viviparité est une forme spécialisée de parasitisme qui oriente l'investissement parental vers les œufs fécondés, étale temporairement cet investissement et protège également temporairement la progéniture de nombreuses pressions de sélection'' »<ref>Bainbridge David RJ, The evolution of pregnancy, Early Human Development Volume 90, Issue 11, November 2014, Pages 741-745).</ref>. * La parturition peut être déclenchée par plusieurs voies, dont certaines font partie du processus de synchronisation normal et fournissent des mécanismes complémentaires qui se chevauchent partiellement, tandis que d'autres (par exemple, les voies associées à la réponse à l'infection) peuvent remplacer les signaux de maintien de la grossesse pour fournir des mécanismes de sécurité qui servent les intérêts de survie de la mère (et de son potentiel reproducteur futur) et du fœtus/nouveau-né<ref>Mitchell BF Taggart MJ (2009) Are animal models relevant to key aspects of human parturition? American Journal of Physiology-Regulatory, Integrative and Comparative Physiology 297:R525–R545. https://doi.org/10.1152/ajpregu.00153.2009)</ref>. * Chaque espèce de mammifère a développé sa propre « stratégie » de parturition, qui peut ou non être conservée chez d'autres espèces (stratégie s’entend ici sans volonté, au sens évolutif). Il fait consensus que par rapport à d'autres organes ou systèmes, les organes reproducteurs (par exemple l'utérus et le placenta) ont évolué plus récemment. * Les traits associés à la grossesse, y compris la parturition, ont évolué « sur » les systèmes cardiovasculaire, métabolique et immunitaire préexistants, et la « stratégie » de reproduction se coordonne avec ces systèmes. La viviparité des mammifères étant apparue à un stade relativement tardif du processus d'évolution des vertébrés, elle s'est en quelque sorte « superposée » aux systèmes cardiovasculaire, respiratoire, métabolique et immunitaire complexes préexistants, et les a considérablement modifiés. La lactation, quant à elle, est probablement antérieure à la viviparité dans l'évolution des mammifères, et a co-évolué avec la grossesse en tant que « stratégie » alternative de nutrition de la progéniture<ref>Gibson G, Lacek KA. Canalization and Robustness in Human Genetics and Disease. Annu Rev Genet. 2020 Nov 23;54:189-211. doi: 10.1146/annurev-genet-022020-022327. Epub 2020 Aug 31. PMID: 32867542.</ref>. * Le contrôle polygénique des traits associés à la grossesse, très complexes et comportant de nombreuses variantes (''<u>qui échappent à mon entendement</u>''<!-- qui échappent à mon entendement -->) peut faciliter l'adaptation et la robustesse évolutives. L'évolution des traits associés à la grossesse peut avoir divers effets sur d'autres systèmes et, inversement, devrait être contrainte par des corrélations génétiques avec d'autres traits. * Les traits associés à la grossesse, y compris la parturition, sont influencés à la fois par les génomes maternel et fœtal et par les effets environnementaux parentaux. L'implication des génomes maternel et fœtal et les effets intergénérationnels environnementaux et épigénétiques des parents ont de profondes implications évolutives, qui ne sont pas toutes comprises, loin de là, et ont probablement connu à la fois des conflits et une coadaptation (On pourra lire Miska et Ferguson-Smith (2016)<ref>Miska EA et Ferguson-Smith AC, (2016) Transgenerational inheritance: Models and mechanisms of non-DNA sequence-based inheritance ''Science'' 354:59–63.</ref> qui dépasse largement mes compétences d’analyse). Par exemple, comme en témoignent les conséquences de la famine hollandaise analysée par Roseboom ''& al.'', les issues de grossesse des générations suivantes ont été négativement affectées<ref>Tessa J. Roseboom & al, Hungry in the womb: What are the consequences? Lessons from the Dutch famine, Maturitas, Volume 70, N°2, pp.141-145, Octobre 2011 DOI : https://doi.org/10.1016/j.maturitas.2011.06.017.</ref>. En résumé, l<span style="color:#000000;">es traits caractéristiques de la viviparité euthérienne sont : </span> <div style="color:#000000;">1) la rétention et la gestation du ou des œufs fécondés dans l'utérus ; 2) le développement d'un placenta qui facilite le transfert d'oxygène et de nutriments du compartiment maternel au conceptus, et 3) l'accouchement du fœtus et de son placenta via le processus de parturition à un stade spécifique de la gestation.</div> <span style="color:#000000;">Chaque trait est essentiel au succès de la viviparité et a donc probablement été soumis à une forte pression sélective </span><span style="color:#000000;">afin d’</span><span style="color:#000000;">optimiser la capacité de reproduction</span><span style="color:#000000;"><ref name="ftn9">Mitteroecker P, Windhager S, Pavlicev M. Cliff-edge model predicts intergenerational predisposition to dystocia and Caesarean delivery. Proc Natl Acad Sci U S A. 2017 Oct 31;114(44):11669-11672. doi: 10.1073/pnas.1712203114. Epub 2017 Oct 16. PMID: 29078368; PMCID: PMC5676923. </ref></span><span style="color:#000000;">. Le cours de l'évolution des espèces de mammifères vivipares, qui a été influencé à la fois par des processus sélectifs et neutres, a produit des variations considérables dans divers traits reproducteurs, tels que le nombre d'œufs ovulés et retenus, la structure de l'utérus, l'anatomie du l'interface mère-placentaire, la structure et la fonction du placenta et son effet sur la physiologie maternelle, le taux de développement embryonnaire/fœtal et la maturité fonctionnelle du nouveau-né, ainsi que les signaux qui conduisent à la parturition</span><span style="color:#000000;"><ref name="ftn10"><span style="color:#000000;">Par exemple chez Swaggart KA, Pavlicev M, Muglia LJ. Genomics of preterm birth. Cold Spring Harb Perspect Med. 2015 Feb 2;5(2):a023127. doi: 10.1101/cshperspect.a023127. PMID: 25646385; PMCID: PMC4315919.</span></ref></span><span style="color:#000000;">. </span> Ce qui suit n’est pas un détail&nbsp;: les analyses phylogénétiques suggèrent actuellement que la viviparité provient de l'oviparité, cad expulsion de l'œuf peu après la fécondation et son développement indépendant dans l'environnement externe, dans au moins 150 lignées (y compris chez les mammifères, les «&nbsp;poissons&nbsp;» et les «&nbsp;reptiles&nbsp;», entre parenthèses car ils ne forment pas des clades<ref name="ftn11">Sur ce point, on pourra lire mon article introductif «&nbsp;Entre polyphonie polyphyle et paraphilie paraphyle&nbsp;», Espèces n°36, Juin 2020, ici https://www.monvoisin.xyz/entre-polyphonie-polyphyle-et-paraphilie-paraphyle-especes-n36-juin-2020/. </ref>). L'évolution de la viviparité avec l'établissement et le maintien d'une gestation prolongée est caractéristique des euthériens. L'évolution de la placentation invasive chez les euthériens qui a permis une gestation intra-utérine prolongée les différencie des marsupiaux, qui développent des placentas très transitoires, et des monotrèmes (comme les ornithorynques), qui sont ovipares. Des études élégantes menées par Wagner et ses collègues ont montré que l'implantation euthérienne a évolué à partir de la réaction d'attachement marsupial, avec des signatures d'expression génique pro-inflammatoire similaires<ref name="ftn12">Griffith OW & al, (2017) Embryo implantation evolved from an ancestral inflammatory attachment reaction ''PNAS'' '''114''':E6566–E6575.</ref>. Une innovation chez les euthériens était la régulation à la baisse de l'inflammation après l'attachement de l'embryon à l'endomètre maternel, reflétée dans semble-t’il (car je ne sais pas évaluer ça) par leurs profils transcriptomiques de fibroblastes stromaux endométriaux par rapport aux marsupiaux<ref name="ftn13">Kin K & al, (2016) The transcriptomic evolution of mammalian pregnancy: gene expression innovations in endometrial stromal fibroblasts ''Genome Biology and Evolution'' '''8''':2459–2473. [https://doi.org/10.1093/gbe/evw168 https://doi.org/10.1093/gbe/evw168 ].</ref>. Des mécanismes anti-inflammatoires supplémentaires ont probablement évolué chez le fœtus ou le placenta, comme le suggèrent l'expansion de la famille de gènes à motif tripartite et leur capacité à régler finement l'inflammation pendant la placentation, ce que défendent Zhang ''& al''., mais point sur lequel je ne peux avoir d’avis par incompétence<ref name="ftn14">Zhang X, Pavlicev M, Jones HN, Muglia LJ, (2020) Eutherian-Specific Gene TRIML2 Attenuates Inflammation in the Evolution of Placentation, ''Molecular Biology and Evolution'' '''37''':507–523. </ref>. Compte tenu de ces innovations évolutives qui ont permis l'établissement d'une prolongation euthérienne de la gestation, cela suggère deux stratégies potentielles différentes que la sélection naturelle pourrait influencer pour déterminer le moment de la naissance&nbsp;: * une «&nbsp;stratégie&nbsp;» consisterait à supprimer les signaux anti-inflammatoires spécifiques qui ont permis d'établir la placentation. * L'autre «&nbsp;stratégie&nbsp;»&nbsp;: que la sélection ait agi sur d'autres cibles moléculaires, lesquelles surmonteraient les signaux anti-inflammatoires qui régulent à la baisse les signaux pro-inflammatoires nécessaires à la réaction d'attachement. Les gènes médiateurs de ces effets seraient eux-mêmes soumis aux diverses pressions évolutives, comme le suggèrent de récentes études d'association à l'échelle du génome pour la durée de gestation humaine. J’ai lu les travaux qui défendent ça (comme Labella ''& al''. 2020<ref name="ftn15">LaBella AL Abraham A Pichkar Y Fong SL Zhang G Muglia LJ Abbot P Rokas A Capra JA (2020) Accounting for diverse evolutionary forces reveals mosaic patterns of selection on human preterm birth loci Nature Communications 11:3731. https://doi.org/10.1038/s41467-020-17258-6. </ref>), mais mes compétences sont limitées pour me faire un avis objectif. <span style="color:#000000;">Les mécanismes de synchronisation de la parturition ont probablement été sélectionnés «&nbsp;pour&nbsp;» optimiser la capacité de reproduction en fonction des avantages pour la mère et le fœtus pour la grossesse en cours, et des avantages pour la survie de la mère et le futur potentiel de reproduction (not</span><span style="color:#000000;">ons</span><span style="color:#000000;"> que ces deux ne sont pas toujours alignés). </span><span style="color:#000000;">On sait depuis Phillips ''& al.'' 2015</span><span style="color:#000000;"><ref name="ftn16">Phillips JB Abbot P Rokas A (2015) Is preterm birth a human-specific syndrome? Evolution, Medicine, and Public Health 2015:136–148. https://doi.org/10.1093/emph/eov010. </ref></span><span style="color:#000000;"> qu’il y a corrélation entre</span><span style="color:#000000;"> le moment de la naissance </span><span style="color:#000000;">et </span><span style="color:#000000;">la taille corporelle à la naissance. </span><span style="color:#000000;">Mais il </span><span style="color:#000000;">n’est pas clair (pour moi) si c</span><span style="color:#000000;">ette </span><span style="color:#000000;">corrélation </span><span style="color:#000000;">refl</span><span style="color:#000000;">ète</span><span style="color:#000000;"> </span><span style="color:#000000;">des problématiques de d</span><span style="color:#000000;">éveloppement du cerveau fœtal ou </span><span style="color:#000000;">bien </span><span style="color:#000000;">des contraintes physiques liée</span><span style="color:#000000;">s</span><span style="color:#000000;"> à la taille du canal de naissance, </span><span style="color:#000000;">ou les deux.</span><span style="color:#000000;"> </span> <span style="color:#000000;">Rokas ''& al''. 2020 indiquent&nbsp;: «&nbsp;Les traits associés à la grossesse sont influencés à la fois par la génétique maternelle et fœtale. Un cadre pour étudier les effets génétiques maternels et fœtaux pendant la grossesse consiste à considérer le couple mère/fœtus comme une unité avec trois haplotype</span><span style="color:#000000;">s</span><span style="color:#000000;">. Le génome composé materno-fœtal de la grossesse contribue génétiquement aux phénotypes maternels par les actions des haplotypes maternels transmis et non transmis. </span><span style="color:#000000;">(…) </span><span style="color:#000000;">L'environnement maternel in</span><span style="color:#000000;">fluence également les résultats de la grossesse, y compris la durée de la grossesse par le biais des effets maternels&nbsp;». </span> <span style="color:#000000;">O</span><span style="color:#000000;">n reviendra un peu sur cela dans la partie «&nbsp;Terme&nbsp;».</span> '''Note&nbsp;''': les placentas de mammifères peuvent être classés en fonction du nombre de tissus séparant le sang maternel du sang fœtal. * placentation endothéliochorale&nbsp;: les villosités choriales sont en contact avec l'endothélium des vaisseaux sanguins maternels (par exemple chez la plupart des carnivores comme les chats et les chiens). * placentation épithéliochorale&nbsp;: les villosités choriales, poussent dans les ouvertures des glandes utérines (épithélium) (par exemple chez les ruminants, les chevaux, les baleines, certains singes, les dugongs). * placentation hémochoriale&nbsp;: le sang maternel entre en contact direct avec le chorion fœtal, ce qui n'est pas le cas dans les deux autres types. Cela peut être utile pour un transfert plus efficace des nutriments, etc., mais il est également plus difficile pour les systèmes de tolérance immunitaire gestationnelle d'éviter le rejet du fœtus (par exemple chez les grands primates, les Catarrhini, y compris les humains, ainsi que chez les lapins, les cobayes, les souris et les rats). = Vers un cadre évolutif de la parturition = Poursuivons un peu avec les travaux qui semblent les plus aboutis à ma connaissance, ceux d’Antonis Rokas ''& al.'' (2020). Que nous apprennent-ils&nbsp;? Les connaissances tirées des analyses génomiques évolutives récentes de la grossesse chez les mammifères, associées aux analyses pangénomiques des populations humaines et l'identification des gènes impliqués dans la durée de la gestation montrent à la fois une grande quantité de connaissances sur la parturition des mammifères, et une forte opacité sur une partie de ses mécanismes, en partie due à nos possibilités limitées (et c’est tant mieux) à interroger expérimentalement la grossesse humaine pour des raisons éthiques (et technologiques d’ailleurs). Rokas ''& al.'' ont alors proposé <span style="color:#000000;">quatre modèles visent à expliquer le maintien de la grossesse et le déclenchement de la parturition, </span><span style="color:#000000;">modèles qui seront sûrement testables dans le futur. Ils précisent cependant ce point&nbsp;: ils n’abordent pas le </span><span style="color:#000000;">mécanisme contractile d'expulsion du fœtus, </span><span style="color:#000000;">qui vient après les</span><span style="color:#000000;"> signa</span><span style="color:#000000;">ux</span><span style="color:#000000;"> d'initiation </span><span style="color:#000000;">de l’accouchement. Et comme il est probable que ce mécanisme </span><span style="color:#000000;">implique des voies utérotoniques redondantes, </span><span style="color:#000000;">il sera </span><span style="color:#000000;">beaucoup plus difficile à cibler efficacement </span><span style="color:#000000;">en vue de la prévention </span><span style="color:#000000;">des naissances prématurées. </span> == Modèle à horloge fixe == Dans ce modèle, le début de la parturition est déterminé par la mère ou le fœtus sur la base d'une «&nbsp;horloge&nbsp;». L'hypothèse de l'horloge de gestation postule un processus de mesure ou de comptage du temps qui s'accumule à partir du point de fécondation. Dans ce modèle, la parturition commence lorsqu'un certain temps est atteint. Le mécanisme de synchronisation peut résider dans le ''- ''ça pourrait être'' ''par exemple le nombre de divisions cellulaires après la syngamie, et/ou impliquer une mesure isochrone liée aux signaux circadiens, ou à la photopériode. Des polymorphismes génétiques et épigénétiques entre individus ou différentes expositions environnementales peuvent modifier l'horloge, entraînant une variation de la durée de la gestation et du moment de la parturition. Le modèle d'horloge fixe serait sélectivement avantageux si le moment de la naissance est lié au programme de développement fœtal. Pour survivre en tant que nouveau-né, le fœtus doit avoir la capacité d'établir et de maintenir l'homéostasie immédiatement après l'accouchement. La principale cause de mortalité et de morbidité néonatales chez les prématurés est l'immaturité du système organique. Le coût reproductif de l'immaturité néonatale aurait exercé une forte pression sélective sur le fait de favoriser des traits garantissant que le fœtus ne naît pas avant qu'il ne soit prêt pour la vie hors de l'utérus. Existe-t-il des preuves suggérant que le moment de la naissance humaine dépend d’une telle horloge&nbsp;? Oui, chez les brebis, la parturition est déclenchée exclusivement par une poussée de cortisol produite par l'axe hypothalamo-hypophyso-surrénalien (HPA) du fœtus en fin de grossesse. Le cortisol stimule également la maturation fonctionnelle des systèmes d'organes fœtaux, en particulier les poumons, le tractus gastro-intestinal et le foie, garantissant ainsi que l'agneau nouveau-né est équipé pour la vie en dehors de l'utérus. Cependant, des études sur plusieurs espèces montrent que bien que l'effet du cortisol fœtal semble être conservé d'une espèce à l'autre (par exemple, la corticothérapie pré-partum pour accélérer le développement pulmonaire fœtal en cas de menace de naissance prématurée a considérablement amélioré les résultats pour les prématurés humains), son rôle de moteur de parturition n'est pas conservé chez les humains. == Modèle de blocage de parturition == L'existence d'un blocage de parturition a été reconnue pour la première fois à la fin des années 1800 à partir de l'observation que la grossesse chez les lapins dépend d'un facteur sécrété par le corps jaune maternel et que l'élimination du corps jaune (''corpus luetum'', ou CL) a déclenché la parturition à tous les stades de la grossesse. Le facteur de blocage de la parturition pro-gestation a finalement été identifié comme étant le Δ5-céto-stéroïde et nommé progestérone (appelée P4, voir plus loin). Des études sur des modèles animaux ont ensuite montré que P4 prévient la parturition induite par l'ovariectomie et que le retrait de P4 seul induit la parturition. Le modèle du blocage de de parturition poserait qu'un système bloquant domine pendant la majeure partie de la grossesse pour empêcher activement la parturition, et que le travail et l'accouchement s'ensuivent lorsque le blocage s’arrête. Sans ledit blocage, l'utérus expulserait son contenu. On pense que P4 maintient la grossesse en exerçant des effets anti-inflammatoires sur les tissus utérins, empêchant ainsi la vidange utérine associée à l'inflammation. Dans ce scénario, l'utérus gravide est prêt et préparé pour la parturition tout au long de la grossesse, mais est retenu par un bloc P4 anti-inflammatoire. Si je comprends bien les travaux de De Cure ''& al.''<ref name="ftn17">De Cure N Sullivan T Robertson M Hallam L Whale K (2013) Spontaneous expulsion of large submucosal uterine fibroid without embolisation - a case study Australasian Journal of Ultrasound in Medicine 16:37–40. https://doi.org/10.1002/j.2205-0140.2013.tb00096.x. </ref> et de Sagoo ''& al''.<ref name="ftn18">Sagoo B Ng KY Ghaleb G Brown H (2015) Spontaneous expulsion of intramural fibroid six weeks after emergency caesarean section Case Reports in Obstetrics and Gynecology 2015:1–4. https://doi.org/10.1155/2015/640570 </ref>, l’utérus ne se «&nbsp;vide&nbsp;» pas que pour la parturition. Les gros fibromes utérins peuvent être expulsés spontanément par un processus qui comprend la contraction myométriale et la dilatation du col de l'utérus. En cas d'expulsion de fibrome utérin, la masse de fibrome est nécrotique et les patientes présentent des signes d'infection et d'inflammation intra-utérines. Il est plausible que le même mécanisme associé à l'inflammation puisse fonctionner à la parturition pour surmonter le blocage du travail. Il y a des arguments solides pour défendre un modèle de blocage lié à la progéstérone P4. Le modèle du blocage de parturition refléterait l'équilibre entre les intérêts génétiques maternels et fœtaux/paternels dans l'état de la grossesse. La sélection naturelle favoriserait un conceptus capable de maintenir la grossesse et d'extraire les ressources de la mère le plus longtemps possible. Des études de gènes à empreinte suggèrent que ce trait est en partie conféré par des gènes à empreinte paternelle (ce qui est logique, mais peu flatteur). En revanche, les intérêts de la mère comprennent la survie de la grossesse en cours et le maintien de sa capacité reproductive pour les grossesses futures et les soins à la progéniture dépendante actuelle. Dans ce contexte, il serait logique qu'un signal de blocage parturition provienne du fœtus. Cependant, le blocage ne peut pas être total et devrait être contrebalancé par des signaux maternels pour stimuler la parturition lorsque les intérêts maternels et/ou la viabilité fœtale sont compromis. Par conséquent on s'attendrait à ce qu'un blocage de parturition venant du fœtus diminue éventuellement et/ou soit surmonté par un signal de stimulateur de parturition basé sur la mère. En effet, un trait conservé chez les espèces de mammifères euthériens est que la parturition est favorisée par le retrait du blocage P4 au travail, ce qui suggère que le ou les signaux de stimulation de la parturition convergent vers l'annulation du blocage P4. == Modèle de stimulation de la parturition == Ce modèle postule que l'état de travail est activement induit par des signaux aigus ou qui s'accumulent progressivement. Les signaux pourraient être liés * à la taille du conceptus et à la quantité de paroi utérine et de distension cervicale * aux facteurs de stress d'origine fœtale ou maternelle lorsque le taux de croissance fœtale dépasse la disponibilité énergétique * à des signaux dérivés de la maturation des systèmes d'organes fœtaux * à des signaux dérivés de la charge de stress maternelle. La parturition est associée à une inflammation au niveau du tissu utérin, en particulier à l'interface ente le chorion et la caduque. Des études cliniques montrent que la parturition humaine peut être induite par une inflammation/infection et que près de 50 % des naissances prématurées sont associées à une inflammation ou une infection intra-utérine<ref name="ftn19">Reviennent souvent ces deux papiers&nbsp;: Goldenberg RL Culhane JF Iams JD Romero R (2008) Epidemiology and causes of preterm birth The Lancet 371:75–84. https://doi.org/10.1016/S0140-6736(08)60074-4 et Romero R Espinoza J Gonçalves LF Kusanovic JP Friel LA Nien JK (2006) Inflammation in preterm and term labour and delivery Seminars in Fetal and Neonatal Medicine 11:317–326. https://doi.org/10.1016/j.siny.2006.05.001. </ref>. De plus, des études animales montrent que les cytokines inflammatoires pro-travail et les infections bactériennes induisent la parturition. Il est donc probable qu'un élément fort du modèle de stimulation de la parturition soit la signalisation inflammatoire maternelle/fœtale. On pense d’ailleurs que l'action P4/Récepteurs P4 bloque la parturition en exerçant un effet anti-inflammatoire sur les tissus utérins. Des études récentes comme celles d’Amini ''& al''. 2016<ref name="ftn20">Amini P Michniuk D Kuo K Yi L Skomorovska-Prokvolit Y Peters GA Tan H Wang J Malemud CJ Mesiano S (2016) Human parturition involves phosphorylation of progesterone Receptor-A at Serine-345 in myometrial cells Endocrinology 157:4434–4445. https://doi.org/10.1210/en.2016-1654.</ref> suggèrent que les stimuli inflammatoires modulent la signalisation PR dans les cellules myométriales humaines et induisent un retrait de P4/RP4. Ceci suggère que l'activité anti-inflammatoire P4/RP4 peut être surmontée par des stimuli inflammatoires. Bien que contre-intuitif, un tel mécanisme pourrait fonctionner s'il existe un seuil de stress inflammatoire au-dessus duquel le blocage P4/RP4 est supprimé. Ce modèle défend un mécanisme à seuil limité qui équilibre les actions pro-gestationnelles du blocage P4/RP4 par rapport à l'ampleur des signaux de parturition liés au stress maternel/fœtal. == Modèle combiné croisé == Ce modèle postule qu'une combinaison de signaux de restriction et de promotion conduirait à la parturition lorsqu'un seuil est atteint pour les actions dominantes favorisant le travail, comme suggéré de manière plus spécifique pour la relation entre P4 et les signaux d'inflammation. Ce modèle inclut en quelque sorte l'horloge de gestation, le blocage de parturition et les modèles de stimulation de la parturition, dans une coexistence qui se chevauche et qui possède une sorte de sécurité intégrée pour «&nbsp;contrôler&nbsp;» le moment de la naissance. Ainsi, on voit cela chez la souris, dont le terme dépend des conditions physiologiques et environnementales. Bien que la parturition à terme chez la souris soit chronométrée par une horloge de gestation qui provoque un retrait systémique de P4 secondaire à la régression de CL, elle peut également se produire sans retrait systémique de P4 en réponse à un problème inflammatoire. Donc plusieurs mécanismes de retrait de P4 peuvent coexister. Le croisement entre les modèles pourrait être limité par un seuil. L'efficacité du bloc P4/RP4 peut être progressivement perdue en réponse à un signal d'horloge de gestation ou à l'augmentation progressive de la charge de stress maternelle. À différents stades de gestation, les divers mécanismes peuvent avoir un impact différent sur le début de la partition. == Tester les quatre modèles == Peut-on distinguer expérimentalement les quatre modèles proposés ? Un exercice de départ utile consiste à déterminer si les données existantes réfutent un ou plusieurs des modèles. Des divergences importantes dans les mécanismes peuvent exister entre les espèces, de sorte qu'une espèce suit un modèle spécifique ne peut pas être complètement comprise par les découvertes d'une autre. Par exemple, un élément de preuve clair qui plaide contre le modèle d'horloge maternelle fixe provient de l'examen du moment de la naissance chez les hybrides inter-espèces. Les accouplements entre chevaux femelles et ânes mâles produisent des mules. Selon le modèle d'horloge maternelle fixe, l'heure de l'accouchement dans de telles grossesses devrait refléter l'horloge de la mère. Cependant, les mulets naissent en moyenne à 11,4 mois, contre 11,2 pour un cheval et 12 pour un âne. Chez les brebis, l'activation de l'axe hypothalamo-hypophyso-surrénalien fœtal est essentielle pour la parturition et peut suggérer une horloge fœtale fixe, mais il est possible que cette activation découle d’autre chose. La pseudo-grossesse des rongeurs, qui survient lorsque des femelles réceptives sont accouplées à des mâles stériles, dure environ la moitié de la durée d'une grossesse normale contenant un fœtus, ce qui suggère que les signaux fœtaux contribuent au maintien de la grossesse jusqu'au point final normal. Bref, Rokas ''& al.'' soulignent que ces différents modèles pourraient répondre à des contextes différents. Le modèle d'horloge fixe, par exemple, pourrait être plus résistant aux perturbations environnementales ou biologiques transitoires. Les modèles de bloc de parturition et de stimulation de parturition pourraient alternativement permettre la détection des changements pendant la grossesse et une réponse immédiate par des boucles de rétroaction pour optimiser la grossesse de manière plus dynamique. <span style="color:#000000;">En tout cas il semble bien qu’il y a des contrôles génétiques de </span>durée de gestation dans le génome maternel humain, avec un rôle pressenti comme crucial de la caduque. Mais La caduque mesure-t-elle un signal fœtal régulé par le développement ou est-ce le mécanisme maternel de l'horloge qui est activé peut-être dès l'implantation, demande Rokas&nbsp;? Quel est le rôle du microbiome vaginal, que discute l’étude de Callahan et ''al''., 2017<ref name="ftn21">Callahan BJ DiGiulio DB Goltsman DSA Sun CL Costello EK Jeganathan P Biggio JR Wong RJ Druzin ML Shaw GM Stevenson DK Holmes SP Relman DA (2017) Replication and refinement of a vaginal microbial signature of preterm birth in two racially distinct cohorts of US women PNAS 114:9966–9971. https://doi.org/10.1073/pnas.1705899114. </ref>&nbsp;? Quel est le rôle de la modulation du système immunitaire de la grossesse (qu’a brillamment documenté l’équipe d’Aghaeepour & ''al''., 2017<ref name="ftn22">Aghaeepour N Ganio EA Mcilwain D Tsai AS Tingle M Van Gassen S Gaudilliere DK Baca Q McNeil L Okada R Ghaemi MS Furman D Wong RJ Winn VD Druzin ML El-Sayed YY Quaintance C Gibbs R Darmstadt GL Shaw GM Stevenson DK Tibshirani R Nolan GP Lewis DB Angst MS Gaudilliere B (2017) An immune clock of human pregnancy Science Immunology 2:eaan2946. https://doi.org/10.1126/sciimmunol.aan2946. </ref>). == Notes et références == {{AutoCat}} 0p9kwgy8umtljlqvoewsyzwhuro9ybr Chanter les psaumes/Sommaire 0 81307 767984 767408 2026-06-18T13:29:11Z Sicarov 109010 Annulation de la modification [[Special:Diff/767408|767408]] de [[Special:Contributions/Sicarov|Sicarov]] ([[User talk:Sicarov|discussion]]) 767984 wikitext text/x-wiki [https://www.aelf.org/ Suivre les Heures sur AELF.fr] - [[Chanter les psaumes/Brouillon|Brouillon]] ==Divers tons simples == ====''Méditations'' n°11-15==== ''rém/FaM'' 11. '''Ps5 Ps42''' <poem><small>5,2 Écoute mes par<u>o</u>les, Seigneur, compr<u>e</u>nds ma plainte;* 3 entends ma v<u>o</u>ix qui t'appelle, ô mon R<u>o</u>i et mon Dieu!</small></poem> <score sound="1" lang="lilypond"> \language "français" \relative { \key fa \major \tempo "Méd. 11." \set Score.tempoHideNote = ##t \tempo 4 = 200 \cadenzaOn \override Score.TimeSignature.stencil = ##f \override Score.SpacingSpanner.common-shortest-duration = #(ly:make-moment 1 2) ^\markup {\small Gouzes} \tweak duration-log #-1 \tweak Stem.stencil ##f la'2 sib2 la4 sol4 la4 s4.^"*"\bar "|" \tweak duration-log #-1 \tweak Stem.stencil ##f la2 sol2 la4 re,4 s4.\bar "||" \tweak duration-log #-1 \tweak Stem.stencil ##f la'2 sol4 s4.^"+"\bar "|" \cadenzaOff } </score> 12. '''Ps 28, Ps 69, Ps 96, Ps120,''' <poem><small>28,1 Rendez au Seigneur, vo<u>u</u>s, les dieux, rendez au Seigneur gl<u>o</u>ire et puissance.</small></poem> <score sound="1" lang="lilypond"> \language "français" \relative { \key fa \major \tempo "Méd. 12." \set Score.tempoHideNote = ##t \tempo 4 = 200 \cadenzaOn \override Score.TimeSignature.stencil = ##f \override Score.SpacingSpanner.common-shortest-duration = #(ly:make-moment 1 2) ^\markup {\small Tassin} \tweak duration-log #-1 \tweak Stem.stencil ##f la'2 do2 sib4 s4.^"*"\bar "|" \tweak duration-log #-1 \tweak Stem.stencil ##f la2 sol2 la4 s4.\bar "||" \tweak duration-log #-1 \tweak Stem.stencil ##f la2 sol2 s4.^"+"\bar "|" \cadenzaOff } </score> {| class="mw-collapsible mw-collapsed wikitable" |+ style=white-space:nowrap | ''plus grave do -> la'' |- | <score sound="1" lang="lilypond"> \language "français" \relative { \key fa \major \tempo "Méd. 12." \set Score.tempoHideNote = ##t \tempo 4 = 200 \cadenzaOn \override Score.TimeSignature.stencil = ##f \override Score.SpacingSpanner.common-shortest-duration = #(ly:make-moment 1 2) ^\markup {\small Tassin} \transpose do la { \tweak duration-log #-1 \tweak Stem.stencil ##f la2 do'2 sib4 s4.^"*"\bar "|" \tweak duration-log #-1 \tweak Stem.stencil ##f la2 sol2 la4 s4.\bar "||" \tweak duration-log #-1 \tweak Stem.stencil ##f la2 sol2 s4.^"+"\bar "|" \cadenzaOff } } </score> |} 13. '''Ps 59, Ps 74, Ps76''' <poem><small>59,3 Dieu, tu nous as rejet<u>é</u>s, brisés; tu étais en col<u>è</u>re, reviens-nous!</small></poem> <score sound="1" lang="lilypond"> \language "français" \relative { \key fa \major \tempo "Méd. 13." \set Score.tempoHideNote = ##t \tempo 4 = 200 \cadenzaOn \override Score.TimeSignature.stencil = ##f \override Score.SpacingSpanner.common-shortest-duration = #(ly:make-moment 1 2) ^\markup {\small Gouzes} \tweak duration-log #-1 \tweak Stem.stencil ##f la'2 sol4 sib4 fa4 s4.^"*"\bar "|" \tweak duration-log #-1 \tweak Stem.stencil ##f la2 fa2 la4 sol4 s4.\bar "||" \tweak duration-log #-1 \tweak Stem.stencil ##f la2 sol4 s4.^"+"\bar "|" \cadenzaOff } </score> '''14. [https://www.clerus.org/bibliaclerusonline/fr/jif.htm#ch Ps. 70. Prière d'un vieillard]''' <poem><small>70,1 En toi, Seigne<u>u</u>r, j'ai mon refuge: garde-moi d'être humili<u>é</u> pour toujours.</small></poem> <score sound="1" lang="lilypond"> \language "français" \relative { \key fa \major \tempo "Méd. 14." \set Score.tempoHideNote = ##t \tempo 4 = 200 \cadenzaOn \override Score.TimeSignature.stencil = ##f \override Score.SpacingSpanner.common-shortest-duration = #(ly:make-moment 1 2) ^\markup {\small B.B.} \tweak duration-log #-1 \tweak Stem.stencil ##f fa'2 sol4 la4 mi4 s4.^"*"\bar "|" \tweak duration-log #-1 \tweak Stem.stencil ##f mi2 fa4 mi4 re4 s4.\bar "||" \tweak duration-log #-1 \tweak Stem.stencil ##f fa2 re4 s4.^"+"\bar "|" \cadenzaOff } </score> 15. '''Ps 24, Ps 138''' <poem><small>138,1 Tu me scrutes, Seigneur, et tu sais!+ Tu sais quand je m'ass<u>o</u>is, quand je me lève; de très loin, tu pén<u>è</u>tres mes pensées.</small></poem> <score sound="1" lang="lilypond"> \language "français" \relative { \key fa \major \tempo "Méd. 15." \set Score.tempoHideNote = ##t \tempo 4 = 200 \cadenzaOn \override Score.TimeSignature.stencil = ##f \override Score.SpacingSpanner.common-shortest-duration = #(ly:make-moment 1 2) ^\markup {\small B.B.} \tweak duration-log #-1 \tweak Stem.stencil ##f la'2 sol4 la4 sib4 s4.^"*"\bar "|" \tweak duration-log #-1 \tweak Stem.stencil ##f sol2 fa4 mi4 re4 s4.\bar "||" \tweak duration-log #-1 \tweak Stem.stencil ##f la'2 sol4 s4.^"+"\bar "|" \cadenzaOff } </score> [[Chanter les psaumes/Tons à deux stiques|=> '''Voir les 30 tons de l'Assomption''']] ==L'art de psalmodier== [https://www.diocese-annecy.fr/grandir-dans-la-foi/liturgie/musique-liturgique/le-psaume/le-chant-du-psaume-diocese-de-lyon.pdf Le chant du psaume diocese de lyon.pdf] #[[Chanter les psaumes/Introduction|Introduction]] #[[Chanter les psaumes/Le psaume dans la liturgie dominicale|Le psaume dans la liturgie dominicale]] #[[Chanter les psaumes/Présentation Générale de la Liturgie des Heures (extraits)|Présentation Générale de la Liturgie des Heures (extraits)]] #[[Chanter les psaumes/Catéchisme de l’Église Catholique (extraits)|Catéchisme de l’Église Catholique (extraits)]] #La Psalmodie en pratique #Quelques tons simples de psalmodie ==Choisir un style== Louange, Méditation, Supplication<br> [[Chanter les psaumes/Tons à deux stiques|Tons à deux stiques]] {{4/4}} : 1-20, 60-70<br> [[Chanter les psaumes/Tons à trois et six stiques|Tons à trois et six stiques]] : 21-25; 31-40<br> [[Chanter les psaumes/Tons à quatre stiques|Tons à quatre stiques]] : 26-30, 31-40, 41-45<br> [[Chanter les psaumes/Tons à trois et six stiques|Tons à six stiques]] : 46-50<br> [[Chanter les psaumes/Tons 2-4 Benedictus ou Magnificat|Tons 2-4 Benedictus ou Magnificat]] : 51-56<br> [[Chanter les psaumes/Tons spécifiques |Tons spécifiques]] : 57-56 (Ps 118, Ps 149, Seigneur ouvre mes lèvres, Conclusion, Ps 147, Ps 66, Ps 8) ==Tons de psaume simples== 28 [[Chanter les psaumes/Tons de psaume simples|Tons de psaume simples de psautier.com]] {{4/4}} 10 [[Chanter les psaumes/Tons monastiques bénédictins|Tons monastiques bénédictins]] {{3/4}} [[Chanter les psaumes/Cantiques évangéliques|Cantiques évangéliques]] : Benedictus - Magnificat - Nunc Dimitis [[File:Circolo delle quinte-minus.png|thumb|Circolo_delle_quinte-minus]] [https://www.apprendrelesolfege.com/_cache/img_responsive/380/_dl/images/cercle-du-cycle-des-quintes.webp Cercle du cycle des quintes] ''Psaumes'' 1–2–3–4–5–6–7–8–9ab–10–11–12–13–14–15–16–17–18–19–20–21–22–23–24–25–26–27–28–29–30–31–32–33–34–35–36–37–38–39–40–41–42–43–44–45–46–47–48–49–50–51–52–53–54–55–56-57-58–59–60–61–62–63–64–65–66–67–68–69–70–71–72–73–74–75–76–77–78–79–80–81–82–83–84–85–86–87–88–89–90–91–92–93–94–95–96–97–98–99–100–101–102–103–104–105–106–107–108–109–110–111–112–113A–113 B–114–115–116–117–118–119–120–121–122–123–124–125–126–127–128–129–130–131–132–133–134–135–136–137–138–139–140–141–142–143–144–145–146–147–148–149–150 Ps. 118 : 1-2-3-4-5–6-7-8-9-10–11-12-13-14-15–16-17-18-19-20–21-22 ''Cantique du A.T.'': 1–2–3–4–5–6–7–9a-b–10–11–13–14-15–17–19–20–22–23–25–26–27–30–32–33–34–35–36– 38–39–40–41–43 ''Cantique du N.T.'': 1–2–3–4–5–6–7–8–9–10–11–12 {{AutoCat}} 5679c4o1kr9k8q1o2d2er1updna25g3 Chanter les psaumes/Complie 0 81694 767982 749538 2026-06-18T13:20:00Z Sicarov 109010 Ajout samedi 767982 wikitext text/x-wiki <center>{{:Chanter les psaumes/Psautier de Saint Irénée}}<br> <big>'''COMPLIES'''</big></center> ==Les Complies ''<small>avant le repos de la nuit</small>''== Dieu vient à mon aide ! Seigneur à notre secours... En tes mains Seigneur, je remets mon esprit. Nunc Dimitis ==Samedi ''<small>soir et la veilles des solennités</small>''== ''Ferme mes yeux pour revoir tes merveilles'' '''Psaume 4 Action de grâce du soir''' Quand je crie réponds moi, Dieu ma justice ! <score sound="1" lang="lilypond"> \language "français" \relative { \key sol \minor \tempo "Sup. 16." \set Score.tempoHideNote = ##t \tempo 4 = 200 \cadenzaOn \override Score.TimeSignature.stencil = ##f \override Score.SpacingSpanner.common-shortest-duration = #(ly:make-moment 1 2) ^\markup {\small Gouzes} \tweak duration-log #-1 \tweak Stem.stencil ##f sib'2 la4 sib4 sol4 s4.^"*"\bar "|" \tweak duration-log #-1 \tweak Stem.stencil ##f la2 fa2 sol4 s4.\bar "||" \tweak duration-log #-1 \tweak Stem.stencil ##f sib2 sol4 s4.^"+"\bar "|" \cadenzaOff } </score> Ou <score sound="1" lang="lilypond"> \language "français" \relative { \key sol \minor \tempo "Mode III" \set Score.tempoHideNote = ##t \tempo 4 = 200 \cadenzaOn \override Score.TimeSignature.stencil = ##f \override Score.SpacingSpanner.common-shortest-duration = #(ly:make-moment 1 2) ^\markup {\small Gouzes} \tweak duration-log #-1 \tweak Stem.stencil ##f si'2 la8 do4 s4.^"*"\bar "|" \tweak duration-log #-1 \tweak Stem.stencil ##f si2 sol2 si8 la4 s4.\bar "||" \tweak duration-log #-1 \tweak Stem.stencil ##f si2 sol4 s4.^"+"\bar "|" \cadenzaOff } </score> '''Psaume 133 Bénédictions pour la nuit''' Vous tous bénissez le Seigneur, vous qui servez le Seigneur, qui veillez dans la maison du Seigneur au long des nuits. <score sound="1" lang="lilypond"> \language "français" \relative { \key sol \minor \tempo "Mode II" \set Score.tempoHideNote = ##t \tempo 4 = 200 \cadenzaOn \override Score.TimeSignature.stencil = ##f \override Score.SpacingSpanner.common-shortest-duration = #(ly:make-moment 1 2) ^\markup {\small Gouzes} \tweak duration-log #-1 \tweak Stem.stencil ##f sol'2 la4 s4.^"*"\bar "|" \tweak duration-log #-1 \tweak Stem.stencil ##f la2 do4 s4.\bar "||" \tweak duration-log #-1 \tweak Stem.stencil ##f do2 si4 s4.\bar "|" \tweak duration-log #-1 \tweak Stem.stencil ##f si2 la2 sol4 s4.\bar "|" \cadenzaOff } </score> ==Dimanche ''<small>soir et soir des solennités</small>''== ''Avant la fin de la lumière,'' '''Psaume 90 Dieu, protecteur des justes''' Quand je me tiens sous l'abri du Trés-Haut ==Lundi== ''En toi Seigneur nos vie reposent'' '''Psaume 85 Plainte dans la souffrance et la persécution''' Ecoute, Seigneur, réponds-moi, car je suis pauvre et malheureux. ==Mardi== ''Vienne la nuit de Dieu,'' '''Psaume 142 Plainte et prière dans l'angoisse''' <poem><small>Seigneur, ent<u>e</u>nds ma prière ; + dans ta justice, éco<u>u</u>te mes appels, dans ta fidélit<u>é</u> réponds-moi.</small></poem> <score sound="1" lang="lilypond"> \language "français" \relative { \key re \minor \tempo "1. St Lambert" \set Score.tempoHideNote = ##t \tempo 4 = 200 \cadenzaOn \override Score.TimeSignature.stencil = ##f \override Score.SpacingSpanner.common-shortest-duration = #(ly:make-moment 1 2) ^"Humble et confiant" \transpose do la { \tweak duration-log #-1 \tweak Stem.stencil ##f la2 sol4 s4.^"+"\bar "|" \tweak duration-log #-1 \tweak Stem.stencil ##f la2 sol2 fa4 s4.^"*"\bar "|" \tweak duration-log #-1 \tweak Stem.stencil ##f la2 sib2 sol4 sib4 la4 s4.\bar "||" \cadenzaOff } } </score> ==Mercredi== ''Avant la fin de la lumière,'' '''Psaume 30 Supplication confiante''' En toi Seigneur j'ai mon refuge; garde moi d'étre humilié pour toujours. '''Psaume 129 Pénitence et confiance en Dieu''' <score sound="1" lang="lilypond"> \language "français" % pour avoir du sol, la etc... \relative { \key fa \major \tempo "Méd. 14." \set Score.tempoHideNote = ##t \tempo 4 = 200 \cadenzaOn \override Score.TimeSignature.stencil = ##f \override Score.SpacingSpanner.common-shortest-duration = #(ly:make-moment 1 2) ^\markup {\small B.B.} \tweak duration-log #-1 \tweak Stem.stencil ##f fa'2 sol4 la4 mi4 s4.^"*"\bar "|" \tweak duration-log #-1 \tweak Stem.stencil ##f mi2 fa4 mi4 re4 s4.\bar "||" \tweak duration-log #-1 \tweak Stem.stencil ##f fa2 re4 s4.^"+"\bar "|" \cadenzaOff } </score> Des profondeurs je crie vers toi, Seigneur, Seigneur, écoute mon appel ! ==Jeudi== ''En toi Seigneur, nos vie reposent'' '''Psaume 15 Dieu, source de vie et de bonheur''' ==Vendredi== ''L'heure s'avance fait nous grâce,'' '''Psaume 87 Lamentation et supplication dans un péril extrême''' Seigneur, mon Dieu et mon salut, dans cette nuit où je crie en ta présence, ==Antiennes finales à la Sainte Vierge Marie== {{AutoCat}} 3tl6p4uhnlrbwd77jq5p7yya51n96me 767985 767982 2026-06-18T13:29:56Z Sicarov 109010 767985 wikitext text/x-wiki <center>{{:Chanter les psaumes/Psautier de Saint Irénée}}<br> <big>'''COMPLIES'''</big></center> ==Les Complies ''<small>avant le repos de la nuit</small>''== Dieu vient à mon aide ! Seigneur à notre secours... En tes mains Seigneur, je remets mon esprit. Nunc Dimitis ==Samedi ''<small>soir et la veilles des solennités</small>''== ''Ferme mes yeux pour revoir tes merveilles'' '''Psaume 4 Action de grâce du soir''' Quand je crie réponds moi, Dieu ma justice ! <score sound="1" lang="lilypond"> \language "français" \relative { \key sol \minor \tempo "Sup. 16." \set Score.tempoHideNote = ##t \tempo 4 = 200 \cadenzaOn \override Score.TimeSignature.stencil = ##f \override Score.SpacingSpanner.common-shortest-duration = #(ly:make-moment 1 2) ^\markup {\small Gouzes} \tweak duration-log #-1 \tweak Stem.stencil ##f sib'2 la4 sib4 sol4 s4.^"*"\bar "|" \tweak duration-log #-1 \tweak Stem.stencil ##f la2 fa2 sol4 s4.\bar "||" \tweak duration-log #-1 \tweak Stem.stencil ##f sib2 sol4 s4.^"+"\bar "|" \cadenzaOff } </score> Ou <score sound="1" lang="lilypond"> \language "français" \relative { \key do \major \tempo "Mode III" \set Score.tempoHideNote = ##t \tempo 4 = 200 \cadenzaOn \override Score.TimeSignature.stencil = ##f \override Score.SpacingSpanner.common-shortest-duration = #(ly:make-moment 1 2) ^\markup {\small Gouzes} \tweak duration-log #-1 \tweak Stem.stencil ##f si'2 la8 do4 s4.^"*"\bar "|" \tweak duration-log #-1 \tweak Stem.stencil ##f si2 sol2 si8 la4 s4.\bar "||" \tweak duration-log #-1 \tweak Stem.stencil ##f si2 sol4 s4.^"+"\bar "|" \cadenzaOff } </score> '''Psaume 133 Bénédictions pour la nuit''' Vous tous bénissez le Seigneur, vous qui servez le Seigneur, qui veillez dans la maison du Seigneur au long des nuits. <score sound="1" lang="lilypond"> \language "français" \relative { \key do \major \tempo "Mode II" \set Score.tempoHideNote = ##t \tempo 4 = 200 \cadenzaOn \override Score.TimeSignature.stencil = ##f \override Score.SpacingSpanner.common-shortest-duration = #(ly:make-moment 1 2) ^\markup {\small Gouzes} \tweak duration-log #-1 \tweak Stem.stencil ##f sol'2 la4 s4.^"*"\bar "|" \tweak duration-log #-1 \tweak Stem.stencil ##f la2 do4 s4.\bar "||" \tweak duration-log #-1 \tweak Stem.stencil ##f do2 si4 s4.\bar "|" \tweak duration-log #-1 \tweak Stem.stencil ##f si2 la2 sol4 s4.\bar "|" \cadenzaOff } </score> ==Dimanche ''<small>soir et soir des solennités</small>''== ''Avant la fin de la lumière,'' '''Psaume 90 Dieu, protecteur des justes''' Quand je me tiens sous l'abri du Trés-Haut ==Lundi== ''En toi Seigneur nos vie reposent'' '''Psaume 85 Plainte dans la souffrance et la persécution''' Ecoute, Seigneur, réponds-moi, car je suis pauvre et malheureux. ==Mardi== ''Vienne la nuit de Dieu,'' '''Psaume 142 Plainte et prière dans l'angoisse''' <poem><small>Seigneur, ent<u>e</u>nds ma prière ; + dans ta justice, éco<u>u</u>te mes appels, dans ta fidélit<u>é</u> réponds-moi.</small></poem> <score sound="1" lang="lilypond"> \language "français" \relative { \key re \minor \tempo "1. St Lambert" \set Score.tempoHideNote = ##t \tempo 4 = 200 \cadenzaOn \override Score.TimeSignature.stencil = ##f \override Score.SpacingSpanner.common-shortest-duration = #(ly:make-moment 1 2) ^"Humble et confiant" \transpose do la { \tweak duration-log #-1 \tweak Stem.stencil ##f la2 sol4 s4.^"+"\bar "|" \tweak duration-log #-1 \tweak Stem.stencil ##f la2 sol2 fa4 s4.^"*"\bar "|" \tweak duration-log #-1 \tweak Stem.stencil ##f la2 sib2 sol4 sib4 la4 s4.\bar "||" \cadenzaOff } } </score> ==Mercredi== ''Avant la fin de la lumière,'' '''Psaume 30 Supplication confiante''' En toi Seigneur j'ai mon refuge; garde moi d'étre humilié pour toujours. '''Psaume 129 Pénitence et confiance en Dieu''' <score sound="1" lang="lilypond"> \language "français" % pour avoir du sol, la etc... \relative { \key fa \major \tempo "Méd. 14." \set Score.tempoHideNote = ##t \tempo 4 = 200 \cadenzaOn \override Score.TimeSignature.stencil = ##f \override Score.SpacingSpanner.common-shortest-duration = #(ly:make-moment 1 2) ^\markup {\small B.B.} \tweak duration-log #-1 \tweak Stem.stencil ##f fa'2 sol4 la4 mi4 s4.^"*"\bar "|" \tweak duration-log #-1 \tweak Stem.stencil ##f mi2 fa4 mi4 re4 s4.\bar "||" \tweak duration-log #-1 \tweak Stem.stencil ##f fa2 re4 s4.^"+"\bar "|" \cadenzaOff } </score> Des profondeurs je crie vers toi, Seigneur, Seigneur, écoute mon appel ! ==Jeudi== ''En toi Seigneur, nos vie reposent'' '''Psaume 15 Dieu, source de vie et de bonheur''' ==Vendredi== ''L'heure s'avance fait nous grâce,'' '''Psaume 87 Lamentation et supplication dans un péril extrême''' Seigneur, mon Dieu et mon salut, dans cette nuit où je crie en ta présence, ==Antiennes finales à la Sainte Vierge Marie== {{AutoCat}} 6vsri0563meiv694zhknazdxwreyla8 767986 767985 2026-06-18T13:31:57Z Sicarov 109010 /* Samedi soir et la veilles des solennités */ 767986 wikitext text/x-wiki <center>{{:Chanter les psaumes/Psautier de Saint Irénée}}<br> <big>'''COMPLIES'''</big></center> ==Les Complies ''<small>avant le repos de la nuit</small>''== Dieu vient à mon aide ! Seigneur à notre secours... En tes mains Seigneur, je remets mon esprit. Nunc Dimitis ==Samedi ''<small>soir et la veilles des solennités</small>''== ''Ferme mes yeux pour revoir tes merveilles'' '''Psaume 4 Action de grâce du soir''' Quand je crie réponds moi, Dieu ma justice ! <score sound="1" lang="lilypond"> \language "français" \relative { \key sol \minor \tempo "Sup. 16." \set Score.tempoHideNote = ##t \tempo 4 = 200 \cadenzaOn \override Score.TimeSignature.stencil = ##f \override Score.SpacingSpanner.common-shortest-duration = #(ly:make-moment 1 2) ^\markup {\small Gouzes} \tweak duration-log #-1 \tweak Stem.stencil ##f sib'2 la4 sib4 sol4 s4.^"*"\bar "|" \tweak duration-log #-1 \tweak Stem.stencil ##f la2 fa2 sol4 s4.\bar "||" \tweak duration-log #-1 \tweak Stem.stencil ##f sib2 sol4 s4.^"+"\bar "|" \cadenzaOff } </score> Ou <score sound="1" lang="lilypond"> \language "français" \relative { \key do \major \tempo "Mode III" \set Score.tempoHideNote = ##t \tempo 4 = 200 \cadenzaOn \override Score.TimeSignature.stencil = ##f \override Score.SpacingSpanner.common-shortest-duration = #(ly:make-moment 1 2) \tweak duration-log #-1 \tweak Stem.stencil ##f si'2 la8 do4 s4.^"*"\bar "|" \tweak duration-log #-1 \tweak Stem.stencil ##f si2 sol2 si8 la4 s4.\bar "||" \tweak duration-log #-1 \tweak Stem.stencil ##f si2 sol4 s4.^"+"\bar "|" \cadenzaOff } </score> '''Psaume 133 Bénédictions pour la nuit''' Vous tous bénissez le Seigneur, vous qui servez le Seigneur, qui veillez dans la maison du Seigneur au long des nuits. <score sound="1" lang="lilypond"> \language "français" \relative { \key do \major \tempo "Mode II" \set Score.tempoHideNote = ##t \tempo 4 = 200 \cadenzaOn \override Score.TimeSignature.stencil = ##f \override Score.SpacingSpanner.common-shortest-duration = #(ly:make-moment 1 2) \tweak duration-log #-1 \tweak Stem.stencil ##f sol'2 la4 s4.^"*"\bar "|" \tweak duration-log #-1 \tweak Stem.stencil ##f la2 do4 s4.\bar "||" \tweak duration-log #-1 \tweak Stem.stencil ##f do2 si4 s4.\bar "|" \tweak duration-log #-1 \tweak Stem.stencil ##f si2 la2 sol4 s4.\bar "|" \cadenzaOff } </score> ==Dimanche ''<small>soir et soir des solennités</small>''== ''Avant la fin de la lumière,'' '''Psaume 90 Dieu, protecteur des justes''' Quand je me tiens sous l'abri du Trés-Haut ==Lundi== ''En toi Seigneur nos vie reposent'' '''Psaume 85 Plainte dans la souffrance et la persécution''' Ecoute, Seigneur, réponds-moi, car je suis pauvre et malheureux. ==Mardi== ''Vienne la nuit de Dieu,'' '''Psaume 142 Plainte et prière dans l'angoisse''' <poem><small>Seigneur, ent<u>e</u>nds ma prière ; + dans ta justice, éco<u>u</u>te mes appels, dans ta fidélit<u>é</u> réponds-moi.</small></poem> <score sound="1" lang="lilypond"> \language "français" \relative { \key re \minor \tempo "1. St Lambert" \set Score.tempoHideNote = ##t \tempo 4 = 200 \cadenzaOn \override Score.TimeSignature.stencil = ##f \override Score.SpacingSpanner.common-shortest-duration = #(ly:make-moment 1 2) ^"Humble et confiant" \transpose do la { \tweak duration-log #-1 \tweak Stem.stencil ##f la2 sol4 s4.^"+"\bar "|" \tweak duration-log #-1 \tweak Stem.stencil ##f la2 sol2 fa4 s4.^"*"\bar "|" \tweak duration-log #-1 \tweak Stem.stencil ##f la2 sib2 sol4 sib4 la4 s4.\bar "||" \cadenzaOff } } </score> ==Mercredi== ''Avant la fin de la lumière,'' '''Psaume 30 Supplication confiante''' En toi Seigneur j'ai mon refuge; garde moi d'étre humilié pour toujours. '''Psaume 129 Pénitence et confiance en Dieu''' <score sound="1" lang="lilypond"> \language "français" % pour avoir du sol, la etc... \relative { \key fa \major \tempo "Méd. 14." \set Score.tempoHideNote = ##t \tempo 4 = 200 \cadenzaOn \override Score.TimeSignature.stencil = ##f \override Score.SpacingSpanner.common-shortest-duration = #(ly:make-moment 1 2) ^\markup {\small B.B.} \tweak duration-log #-1 \tweak Stem.stencil ##f fa'2 sol4 la4 mi4 s4.^"*"\bar "|" \tweak duration-log #-1 \tweak Stem.stencil ##f mi2 fa4 mi4 re4 s4.\bar "||" \tweak duration-log #-1 \tweak Stem.stencil ##f fa2 re4 s4.^"+"\bar "|" \cadenzaOff } </score> Des profondeurs je crie vers toi, Seigneur, Seigneur, écoute mon appel ! ==Jeudi== ''En toi Seigneur, nos vie reposent'' '''Psaume 15 Dieu, source de vie et de bonheur''' ==Vendredi== ''L'heure s'avance fait nous grâce,'' '''Psaume 87 Lamentation et supplication dans un péril extrême''' Seigneur, mon Dieu et mon salut, dans cette nuit où je crie en ta présence, ==Antiennes finales à la Sainte Vierge Marie== {{AutoCat}} q2zjqatqoe4d29uk213rkz2pm8dz2y9 Fonctionnement d'un ordinateur/Les circuits pour la population count 0 82213 768005 749127 2026-06-18T14:23:57Z Mewtow 31375 Suppression du contenu pour transformer ce chapitre en un chapitre sur un autre sujet 768005 wikitext text/x-wiki phoiac9h4m842xq45sp7s6u21eteeq1 Dictionnaire de philosophie/Angoisse 0 83005 768155 767700 2026-06-19T04:15:03Z PandaMystique 119061 Bot : ajout du paramètre lecture=oui au modèle {{DicoPhilo}} 768155 wikitext text/x-wiki {{DicoPhilo|Angoisse|lecture=oui}} [[Fichier:Edvard Munch, 1893, The Scream, oil, tempera and pastel on cardboard, 91 x 73 cm, National Gallery of Norway.jpg|vignette|''Le Cri'' d'Edvard Munch (1893), image devenue emblématique de l'angoisse.]] L'angoisse occupe une place singulière dans l'histoire de la philosophie. Loin d'être seulement un état psychologique désagréable que l'on chercherait à éviter, elle constitue une expérience qui met à nu la condition humaine. Avant de devenir une catégorie centrale de la pensée existentialiste au vingtième siècle, l'angoisse traverse l'histoire de la philosophie sous différentes formes, des inquiétudes métaphysiques de la pensée antique et médiévale jusqu'aux analyses contemporaines qui en font le symptôme de notre modernité en crise. == Distinguer l'angoisse de la peur et de l'anxiété == Une première clarification s'impose : l'angoisse n'est pas la peur. Cette distinction, devenue classique dans la tradition philosophique, remonte aux analyses de Søren Kierkegaard et trouve son développement le plus systématique chez Martin Heidegger<ref>Kierkegaard, ''Le Concept de l'angoisse'' (1844), trad. K. Ferlov et J.-J. Gateau, chap. III.</ref><ref>Heidegger, ''Être et Temps'' (1927), § 40, trad. E. Martineau.</ref>. La peur possède toujours un objet déterminé : on a peur de quelque chose, d'une menace précise, d'un danger identifiable dans le monde. L'araignée qui descend du plafond, la voiture qui fonce vers nous, l'examen qui approche sont autant d'objets concrets qui suscitent la peur. Cette dernière s'inscrit dans une logique défensive : elle nous prépare à fuir ou à combattre une menace localisée. L'angoisse, au contraire, ne possède pas d'objet déterminé<ref>Heidegger, ''Qu'est-ce que la métaphysique ?'' (1929).</ref>. Quand elle nous saisit, explique Heidegger, ce devant quoi nous nous angoissons n'est aucun étant particulier, mais l'être-au-monde lui-même, le « rien et nulle part ». L'angoisse surgit sans que nous puissions pointer du doigt sa cause. Elle ne se dirige vers rien de précis et pourtant elle nous envahit tout entiers. Lorsqu'elle nous étreint, ce n'est pas telle ou telle chose qui nous menace, mais notre existence même qui vacille. Cette indétermination la sépare de la peur : là où la peur mobilise nos défenses face à un danger externe, l'angoisse nous met face à nous-mêmes<ref>Sartre, ''L'Être et le Néant'' (1943), I{{re}} partie, chap. 1.</ref>. Le terme d'anxiété, plus courant dans le langage psychologique et médical contemporain, désigne souvent un état d'inquiétude diffuse qui peut se rapprocher de l'angoisse philosophique<ref>''Manuel diagnostique et statistique des troubles mentaux'' (DSM-5), American Psychiatric Association, 2013.</ref>. Cependant, l'anxiété telle que la définissent la psychiatrie et la psychologie modernes se concentre sur ses manifestations cliniques, les troubles anxieux, les attaques de panique, tandis que l'angoisse philosophique désigne une structure existentielle, un mode d'être qui révèle notre condition. Cette distinction ne signifie pas que l'angoisse philosophique soit détachée de l'expérience concrète : elle en constitue au contraire le sens. == L'angoisse comme vertige de la liberté : Kierkegaard == [[Fichier:Kierkegaard portrait.jpg|vignette|Søren Kierkegaard (1813-1855), qui fait de l'angoisse le vertige de la liberté.]] Dans ''Le Concept de l'angoisse'' (1844), le philosophe danois Søren Kierkegaard, sous le masque de Vigilius Haufniensis, propose la première analyse systématique de ce phénomène<ref>Kierkegaard, ''Le Concept de l'angoisse'' (1844), trad. K. Ferlov et J.-J. Gateau.</ref>. Pour lui, l'angoisse est liée à la liberté humaine et en constitue le « vertige ». Cette formule énigmatique mérite d'être déployée. Kierkegaard part d'une méditation sur le péché originel. Adam, devant l'arbre de la connaissance du bien et du mal, fait l'expérience de l'angoisse avant même de commettre la faute<ref>Kierkegaard, ''Le Concept de l'angoisse'', chap. I, « L'angoisse comme présupposition du péché originel ».</ref>. Cette angoisse naît de la découverte vertigineuse qu'il possède la liberté de transgresser l'interdit divin. L'angoisse d'Adam ne porte pas sur l'objet de l'interdiction, le fruit défendu, mais sur sa propre capacité de choisir, sur le pouvoir qu'il découvre en lui de désobéir. Kierkegaard la définit par une formule restée célèbre : l'angoisse est « une antipathie sympathisante et une sympathie antipathisante »<ref>Kierkegaard, ''Le Concept de l'angoisse'', chap. I : « L'angoisse est une antipathie sympathisante et une sympathie antipathisante. » Le langage, ajoute-t-il, en porte la trace, qui parle de « douce angoisse » ou de « douce anxiété ».</ref>. L'angoisse attire et repousse à la fois ; on la fuit et on s'y complaît, dans un même mouvement. Le vertige éclaire la structure de l'angoisse. Quand l'œil plonge dans un abîme, écrit Kierkegaard, le vertige vient « autant de l'œil que de l'abîme, car on aurait pu ne pas y regarder »<ref>Kierkegaard, ''Le Concept de l'angoisse'', chap. V : « On peut comparer l'angoisse au vertige. […] De même l'angoisse est le vertige de la liberté, qui naît parce que l'esprit veut poser la synthèse et que la liberté, plongeant alors dans son propre possible, saisit à cet instant la finitude et s'y accroche. »</ref>. Ce n'est pas le gouffre seul qui produit le vertige, mais notre liberté : la conscience que rien ne nous empêche de sauter, que nous pourrions nous jeter dans le vide. Le vertige de la liberté, c'est cette découverte effrayante et fascinante que nous sommes capables de tout, y compris de nous détruire. Ce que l'angoisse a devant elle, précise Kierkegaard, c'est un « néant » : non pas une menace déterminée, mais l'ouverture vide du possible<ref>Kierkegaard, ''Le Concept de l'angoisse'', chap. I : « L'angoisse est la réalité de la liberté comme possibilité pour la possibilité. » Son objet est désigné comme un néant qui « met au monde » l'individu en le rendant coupable.</ref>. L'angoisse révèle ainsi la liberté comme fardeau et comme possibilité. Elle surgit lorsque l'individu prend conscience qu'il n'est pas déterminé, qu'aucune essence préétablie ne dicte ses actes, qu'il doit se choisir lui-même à chaque instant. Cette responsabilité écrasante engendre l'angoisse : comment choisir quand tous les possibles s'ouvrent devant nous ? Comment supporter le poids de décisions qui nous engagent pour l'éternité, car, pour Kierkegaard penseur chrétien, nos choix temporels engagent notre salut éternel<ref>Sur le « salut éternel » noué à l'instant de la décision, voir Kierkegaard, ''Riens philosophiques'' (1844, trad. Ferlov et Gateau des ''Miettes philosophiques''), où le « point de départ temporel » de la vérité devient « la condition » du rapport de l'individu à l'éternel.</ref> ? L'angoisse n'est donc pas seulement négative. Elle est ambiguë : elle fait souffrir, mais elle est aussi la marque de notre grandeur, le signe que nous ne sommes pas des choses déterminées mais des êtres libres. Sans angoisse, pas de liberté, et réciproquement. L'angoisse est l'expérience même de la liberté qui se découvre. Kierkegaard prolongera cette analyse dans ''La Maladie à la mort'' (1849), traduite en français sous le titre ''Traité du désespoir'', où le désespoir, « la maladie mortelle », nomme le rapport manqué du moi à lui-même et à l'éternel<ref>Kierkegaard, ''La Maladie à la mort'' (1849), trad. Ferlov et Gateau (''Traité du désespoir'') : « Que le désespoir est la maladie mortelle. »</ref>. == Heidegger : l'angoisse qui révèle l'être-au-monde == Martin Heidegger reprend et transforme l'analyse kierkegaardienne dans ''Être et Temps'' (1927) et dans sa conférence ''Qu'est-ce que la métaphysique ?'' (1929)<ref>Heidegger, ''Être et Temps'' (1927), trad. E. Martineau ; ''Qu'est-ce que la métaphysique ?'' (1929).</ref>. Pour le philosophe allemand, l'angoisse n'est pas d'abord liée à la liberté morale : elle est une « affection fondamentale » (''Grundbefindlichkeit''), une manière dont le [[Dictionnaire de philosophie/Dasein|Dasein]] se trouve disposé et qui dévoile la structure de son être-au-monde<ref>Heidegger, ''Être et Temps'', § 40, intitulé chez Martineau « L'affection fondamentale de l'angoisse comme ouverture privilégiée du Dasein ». Le terme ''Befindlichkeit'' (« affection ») désigne la façon dont le Dasein « se trouve » disposé ; il ne se confond pas avec ''Stimmung'', la « tonalité » ou humeur.</ref>. Dans l'existence quotidienne, le Dasein, l'être humain compris comme « être-là », se perd dans le « On » (''das Man''), dans l'anonymat de la vie sociale<ref>Heidegger, ''Être et Temps'', § 27, « L'être-Soi-même quotidien et le On ».</ref>. Nous nous occupons de nos affaires, nous bavardons, nous suivons les conventions, nous nous préoccupons de ceci et de cela. Cette existence moyenne nous rassure : tout semble avoir un sens, une place, une fonction. Les choses sont « à portée de main », utilisables et familières. Nous sommes « chez nous » dans le monde. L'angoisse vient briser cette familiarité. Quand elle surgit, le monde entier bascule. Les choses perdent leur signification habituelle, elles deviennent étrangères, inquiétantes. Plus rien ne fait sens. Ce devant quoi nous nous angoissons, écrit Heidegger, n'est aucun objet intramondain mais l'être-au-monde en tant que tel, qui se révèle soudain dans son « étrangeté » (''Unheimlichkeit''), littéralement dans le « ne-pas-être-chez-soi »<ref>Heidegger, ''Être et Temps'', § 40 : dans l'angoisse, « c'est inquiétant, c'est étrange ». L{{'}}''Unheimlichkeit'' se dit du « hors-de-chez-soi » que la quotidienneté recouvre.</ref>. Cette expérience compte pour l'analyse, car elle arrache le Dasein à sa dispersion dans le On. L'angoisse « isole », elle nous ramène à nous-mêmes : « L'angoisse isole et ouvre ainsi le Dasein comme ''solus ipse'' », un solipsisme qui, loin d'enfermer un sujet sans monde, place au contraire le Dasein « devant son monde comme monde, et lui-même devant soi-même comme être-au-monde »<ref>Heidegger, ''Être et Temps'', § 40, trad. Martineau.</ref>. Elle nous découvre que nous ne sommes pas un élément du monde parmi d'autres, occupé à ses tâches, mais un être qui a à être, qui doit assumer son existence, libre « pour la liberté de se choisir et de se saisir lui-même ». Surtout, l'angoisse nous met face au néant. Non pas le néant comme simple absence ou négation, mais comme dimension de notre être : nous ne sommes pas des êtres achevés, mais des êtres marqués par la possibilité, donc par le manque. L'angoisse nous confronte à notre [[Dictionnaire de philosophie/Finitude|finitude]], à notre être-pour-la-mort<ref>Heidegger, ''Être et Temps'', § 50-53 ; « L'être pour la mort est essentiellement angoisse » (§ 53). L'être-jeté dans la mort, ajoute Heidegger, « se dévoile […] dans l'affection de l'angoisse ».</ref>. Elle nous révèle que nous ne pouvons compter sur rien de stable, que nos certitudes peuvent s'effondrer, que la mort est la possibilité la plus propre et la plus certaine. Cette révélation n'est pas morbide. Au contraire, elle ouvre la possibilité d'une [[Dictionnaire de philosophie/Authenticité|existence authentique]]<ref>Heidegger, ''Être et Temps'', § 60-62.</ref>. Tant que nous fuyons dans le bavardage et les préoccupations quotidiennes, nous demeurons dans l'inauthenticité. L'angoisse, en nous confrontant à notre être-pour-la-mort, nous permet d'assumer notre existence comme la nôtre, de nous choisir au lieu de nous laisser porter par le courant du On. == Sartre : l'angoisse face à la liberté == [[Fichier:Caspar David Friedrich - Wanderer above the Sea of Fog.jpeg|vignette|gauche|''Le Voyageur contemplant une mer de nuages'', de Caspar David Friedrich (vers 1818).]] Jean-Paul Sartre prolonge la conception kierkegaardienne et heideggérienne de l'angoisse dans ''L'Être et le Néant'' (1943) et dans ''L'existentialisme est un humanisme'' (1945)<ref>Sartre, ''L'Être et le Néant'' (1943) ; ''L'existentialisme est un humanisme'' (1945).</ref>. Pour lui, l'angoisse est l'expérience de notre liberté et de notre responsabilité. La thèse centrale de Sartre est que « l'existence précède l'essence »<ref>Sartre, ''L'existentialisme est un humanisme''.</ref>. Contrairement aux objets fabriqués dont l'essence est fixée avant leur existence, un coupe-papier est conçu pour couper le papier, l'être humain existe d'abord sans essence préétablie. Il n'y a pas de nature humaine, pas de programme inscrit en nous qui nous dirait ce que nous devons être. Nous sommes « condamnés à être libres ». Cette formule paradoxale signifie que nous n'avons pas choisi d'être libres, mais que nous le sommes nécessairement, et que cette liberté est un fardeau dont nous ne pouvons nous défaire. L'angoisse surgit précisément de cette découverte de notre liberté sans appui<ref>Sartre, ''L'Être et le Néant'', I{{re}} partie, chap. 1, section « L'angoisse ».</ref>. Reprenant Kierkegaard, Sartre écrit : « l'angoisse est angoisse devant moi », conscience que rien ne me détermine, qu'aucun mobile ne me pousse nécessairement à agir d'une façon plutôt qu'une autre. Il reprend l'exemple du vertige au bord du précipice et en déplace le sens : « Le vertige est angoisse dans la mesure où je redoute non de tomber dans le précipice mais de m'y jeter. » Ce qui m'angoisse, ce n'est pas la peur de la chute, mais la conscience que je pourrais aussi bien sauter que ne pas sauter, et que rien ne garantit que je ne sauterai pas. Cette angoisse révèle que nous sommes séparés de notre passé et de notre avenir par un néant<ref>Sartre, ''L'Être et le Néant'', I{{re}} partie, chap. 1 : Sartre distingue l'« angoisse devant l'avenir » et l'« angoisse devant le passé ».</ref>. Sartre l'illustre par la figure du joueur qui a sincèrement résolu de ne plus jouer et qui, devant le tapis vert, voit « fondre » toutes ses résolutions : la décision de la veille est bien là, mais « figée, inefficace, dépassée », et il s'aperçoit avec angoisse que rien ne l'empêche de jouer. Mon passé ne me détermine pas : je peux toujours m'en détacher, le réinterpréter, choisir de ne plus être ce que j'ai été. Mon avenir n'est pas écrit : il dépend de mes choix présents. Entre le passé qui ne me retient plus et l'avenir qui n'existe pas encore, je suis suspendu dans le présent, libre et sans excuse. Sartre ajoute une dimension morale : quand je choisis, je ne choisis pas seulement pour moi mais pour toute l'humanité<ref>Sartre, ''L'existentialisme est un humanisme''.</ref>. En choisissant de me marier ou de rester célibataire, de m'engager ou de rester neutre, je définis implicitement ce que doit être un être humain. Je ne peux pas dire « c'est bon pour moi mais pas pour les autres » : en agissant, je déclare que mon action mérite d'être universalisée. Cette responsabilité immense est source d'angoisse. Pourtant, la plupart des hommes fuient cette angoisse dans ce que Sartre nomme la « mauvaise foi »<ref>Sartre, ''L'Être et le Néant'', I{{re}} partie, chap. 2, « La mauvaise foi ».</ref>. Ils se mentent à eux-mêmes, se dissimulent leur liberté en se réfugiant derrière des excuses : « je suis comme ça », « c'est ma nature », « je n'ai pas le choix », « la société m'oblige ». Toutes ces formules sont des stratégies pour échapper à l'angoisse de la liberté. L'homme authentique, au contraire, assume son angoisse et sa responsabilité. == L'angoisse existentielle et la condition humaine : Pascal == [[Fichier:Anonymous - Portrait présumé de Blaise Pascal (1623-1662), savant et écrivain. - P1800 - Musée Carnavalet.jpg|vignette|Portrait présumé de Blaise Pascal (1623-1662), musée Carnavalet.]] Si l'angoisse devient une notion philosophique centrale avec Kierkegaard, elle traverse déjà la pensée classique sous d'autres noms. [[s:Auteur:Blaise Pascal|Blaise Pascal]], dans les ''Pensées'' (1670), offre une méditation sur l'inquiétude et l'angoisse humaines<ref>Pascal, ''Pensées'', éd. posthume de 1670. Les références sont données ci-après selon les éditions Brunschvicg (Br.) et Lafuma (Laf.).</ref>. Pascal part d'un constat : l'homme est un être suspendu entre deux infinis, « un milieu entre rien et tout »<ref>Pascal, ''Pensées'', fragment Br. 72 / Laf. 199, « Disproportion de l'homme ».</ref>. Pris entre l'infiniment grand de l'univers qui le dépasse et l'infiniment petit qui le constitue, il découvre sa disproportion. Il est trop petit pour embrasser l'univers, trop grand pour se satisfaire de son existence limitée. Cette position intermédiaire engendre une inquiétude existentielle. Cet état de dénuement, écrit Pascal, conduit l'homme qui le considère sans secours à un sentiment proche de l'effroi : « le silence éternel de ces espaces infinis m'effraie »<ref>Pascal, ''Pensées'', fragment Br. 206 / Laf. 201.</ref>. La condition humaine, selon Pascal, mêle la misère et la grandeur. Misère, car l'homme est faible, mortel, exposé à la souffrance et à la mort. Grandeur, car il pense, et par la pensée il comprend sa propre misère : « L'homme n'est qu'un roseau, le plus faible de la nature ; mais c'est un roseau pensant »<ref>Pascal, ''Pensées'', fragment Br. 347 / Laf. 200.</ref>. Cette conscience de sa condition misérable fait sa dignité. Face à cette inquiétude, l'homme développe selon Pascal une stratégie d'évitement : le [[Dictionnaire de philosophie/Divertissement|divertissement]]. Incapable de supporter le face-à-face avec lui-même, avec la pensée de sa mort et de son néant, il se jette dans toutes sortes d'occupations, la chasse, le jeu, les affaires, les honneurs. « Tout le malheur des hommes vient d'une seule chose, qui est de ne savoir pas demeurer en repos dans une chambre »<ref>Pascal, ''Pensées'', fragment Br. 139 / Laf. 136, « Divertissement ».</ref>. Le divertissement n'est pas seulement le loisir frivole : c'est toute activité qui nous détourne de penser à notre condition, qui nous empêche de nous retrouver seuls face à nous-mêmes. Cette fuite n'est pas seulement négative : elle est nécessaire à la vie. L'homme ne pourrait supporter de contempler sans relâche son néant. Mais elle l'empêche aussi d'accéder à la vérité sur lui-même. Seule l'inquiétude assumée, qui ne se cache pas derrière les divertissements, peut ouvrir la voie vers la quête de sens et, pour Pascal penseur chrétien, vers Dieu. == Angoisse et affects chez Spinoza : une philosophie de la joie == [[Fichier:Spinoza.jpg|vignette|Baruch Spinoza (1632-1677), penseur de la joie.]] Face aux philosophies de l'angoisse, la pensée de [[s:Auteur:Baruch Spinoza|Baruch Spinoza]] (1632-1677) propose un contraste marqué<ref>Spinoza, ''Éthique'' (1677), trad. de référence : Charles Appuhn, Garnier-Flammarion.</ref>. Dans l{{'}}''Éthique'', Spinoza développe une théorie des affects qui ne place pas l'angoisse au centre, mais qui offre des outils pour la comprendre et la dépasser. Pour Spinoza, les affects primitifs sont au nombre de trois : le [[Dictionnaire de philosophie/Désir|désir]], la joie et la tristesse<ref>Spinoza, ''Éthique'', III{{e}} partie, définitions des affects ; le désir (''cupiditas''), la joie (''laetitia'') et la tristesse (''tristitia'') sont posés comme affects premiers dont dérivent les autres.</ref>. La joie désigne le passage à une plus grande perfection, l'affect qui augmente notre puissance d'agir ; la tristesse désigne le passage à une moindre perfection, l'affect qui la diminue. L'angoisse, dans ce cadre, relève de la tristesse : elle est une passion qui nous affaiblit, qui réduit notre capacité d'agir et de penser. Spinoza la rapproche de la crainte, « une tristesse inconstante, née de l'idée d'une chose future ou passée dont l'issue nous paraît douteuse »<ref>Spinoza, ''Éthique'', III{{e}} partie, scolie de la proposition XVIII et définition XIII des affects.</ref>. Mais Spinoza va plus loin en proposant une thérapeutique des affects<ref>Spinoza, ''Éthique'', V{{e}} partie, « De la puissance de l'entendement ou de la liberté humaine ».</ref>. Nous ne sommes pas condamnés à subir passivement nos passions. Par la connaissance, nous pouvons les transformer en affects actifs. Comprendre les causes de nos affects, c'est déjà s'en délier en partie. La connaissance vraie produit la joie. Cette philosophie de la joie ne nie pas la souffrance ou l'angoisse, mais refuse de leur accorder une valeur métaphysique ultime<ref>Deleuze, Gilles, ''Spinoza. Philosophie pratique'', Minuit, 1981.</ref>. Contrairement aux penseurs de l'existence qui font de l'angoisse un révélateur de notre condition, Spinoza cherche à nous en libérer par la connaissance rationnelle. La béatitude, pour lui, n'est pas la fuite de l'angoisse mais sa transformation par la compréhension de notre place dans l'ordre éternel de la Nature. == Les stoïciens : l'apatheia contre l'angoisse == Bien avant les existentialistes, les philosophes stoïciens, [[s:Auteur:Épictète|Épictète]], [[s:Auteur:Marc Aurèle|Marc Aurèle]], [[s:Auteur:Sénèque|Sénèque]], avaient développé une philosophie pratique pour faire face à l'inquiétude<ref>Épictète, ''Manuel'', trad. de référence : Émile Bréhier, dans ''Les Stoïciens'', Gallimard, « Bibliothèque de la Pléiade ».</ref>. Leur objectif n'était pas de théoriser l'angoisse mais de proposer des exercices spirituels pour l'apaiser et accéder à la sérénité du sage. Cet état, les stoïciens le nomment ''apatheia'', l'absence des passions qui troublent l'âme. Le terme appartient en propre à leur école : il se distingue de l{{'}}''ataraxia'', l'absence de trouble que recherchent surtout les épicuriens et les [[Dictionnaire de philosophie/Scepticisme|sceptiques]], même si l'une et l'autre désignent la paix que conquiert celui qui ne se laisse plus dominer par ses émotions. Le principe premier du stoïcisme est la distinction entre ce qui dépend de nous et ce qui n'en dépend pas<ref>Épictète, ''Manuel'', I : « Parmi les choses qui existent, les unes dépendent de nous, les autres ne dépendent pas de nous. »</ref>. Dépendent de nous nos jugements, nos désirs, nos aversions, en un mot toutes nos œuvres intérieures. Ne dépendent pas de nous notre corps, la richesse, la réputation, le pouvoir, toutes les choses extérieures. L'angoisse naît quand nous attachons notre bonheur à ce qui ne dépend pas de nous, quand nous désirons contrôler l'incontrôlable. La solution stoïcienne consiste à concentrer nos efforts sur ce qui dépend de nous : nos représentations et nos jugements<ref>Hadot, Pierre, ''Exercices spirituels et philosophie antique'', Albin Michel, 1981 (nouvelle éd. 2002).</ref>. « Ce qui trouble les hommes, ce ne sont pas les choses, mais les opinions qu'ils en ont », enseigne Épictète<ref>Épictète, ''Manuel'', V.</ref>. La mort, la maladie, la pauvreté ne sont pas des maux en soi : ce sont nos jugements qui les rendent terrifiants. En transformant nos jugements, en accueillant ce qui arrive comme nécessaire, nous pouvons atteindre la paix intérieure. Marc Aurèle, empereur philosophe, propose dans ses ''Pensées pour moi-même'' une méditation constante sur la [[Dictionnaire de philosophie/Mort|mort]] et l'impermanence<ref>Marc Aurèle, ''Pensées pour moi-même'' (''Tà eis heautón''), trad. de référence : Mario Meunier ou Émile Bréhier (Pléiade).</ref>. Loin d'engendrer l'angoisse, cette méditation doit nous libérer de la peur en nous familiarisant avec notre finitude. Le stoïcien ne fuit pas l'idée de la mort : il l'accueille, il y pense chaque jour, et par cette pensée même il se délie de son emprise. == L'inquiétude spirituelle : Augustin, la mystique et Luther == [[Fichier:Augustine of Hippo Sandro Botticelli.jpg|vignette|Saint Augustin, par Sandro Botticelli (vers 1480).]] Avant que la modernité ne fasse de l'angoisse un concept philosophique, la tradition chrétienne en explore une forme spirituelle : l'inquiétude de l'âme privée de Dieu. Augustin en donne la formule au début des ''Confessions'' (397-401) : « tu nous as faits pour toi, et notre cœur est sans repos tant qu'il ne repose pas en toi »<ref>Augustin, ''Confessions'', livre I, chap. 1, trad. Pierre de Labriolle, Paris, Les Belles Lettres : « fecisti nos ad te et inquietum est cor nostrum donec requiescat in te. »</ref>. Cette ''inquietudo'' n'est pas la peur d'un danger : c'est une tension intérieure, le sentiment d'un manque que rien de fini ne comble. L'homme se découvre étranger à lui-même, divisé, en quête d'un repos qui le fuit. On reconnaît là, sous un vocabulaire religieux, une structure proche de l'angoisse : un trouble sans objet déterminé, qui porte sur l'existence entière. La mystique médiévale prolonge cette exploration. Les moines du désert avaient décrit l'acédie, ce dégoût de vivre et cette torpeur que la tradition nomme « le démon de midi », découragement qui défait le sens des actes et vide les journées<ref>Sur l'acédie comme « démon de midi », voir la tradition monastique issue d'Évagre le Pontique et de Jean Cassien.</ref>. Plus tard, Jean de la Croix décrit la « nuit obscure » de l'âme, état de désolation où le croyant, privé de toute consolation sensible, traverse une épreuve d'absence et d'abandon<ref>Jean de la Croix, ''La Nuit obscure'' (''Noche oscura''), vers 1578-1585.</ref>. Ces expériences ne se réduisent pas à la tristesse : elles confrontent le sujet au vide et à la perte de ses repères, comme le fera plus tard l'angoisse existentielle. Avec la Réforme, cette inquiétude prend un tour aigu chez Luther. Le terme allemand d{{'}}''Anfechtung'', que l'on traduit mal par « tentation » et qui désigne plutôt un assaut intérieur, une épreuve où l'âme se sent écrasée sous le jugement de Dieu, occupe le centre de son expérience<ref>Sur l{{'}}''Anfechtung'' luthérienne, voir Delumeau, ''Le Péché et la peur. La culpabilisation en Occident (XIII{{e}}-XVIII{{e}} siècle)'', Paris, Fayard, 1983.</ref>. Devant un Dieu juge, le pécheur éprouve l'effroi de sa propre indignité et l'impossibilité de se sauver par ses œuvres. C'est cette angoisse, selon les historiens, qui conduit Luther à la doctrine de la justification par la foi seule : seule la grâce, et non l'effort humain, peut apaiser le tourment de la conscience<ref>Delumeau, ''La Peur en Occident (XIV{{e}}-XVIII{{e}} siècle). Une cité assiégée'', Paris, Fayard, 1978.</ref>. La tradition chrétienne offre ainsi, bien avant Kierkegaard, une longue méditation sur l'angoisse comme épreuve du rapport à soi et à l'absolu. == Schopenhauer et Nietzsche : le vouloir-vivre et le nihilisme == [[Fichier:Arthur Schopenhauer by J Schäfer, 1859b.jpg|vignette|Arthur Schopenhauer (1788-1860), photographié en 1859.]] Au XIX{{e}} siècle, deux penseurs allemands donnent à l'inquiétude une portée métaphysique nouvelle. Ils ne la nomment pas toujours angoisse, mais ils préparent les analyses du siècle suivant. [[s:Auteur:Arthur Schopenhauer|Arthur Schopenhauer]] voit dans la volonté, qu'il nomme aussi vouloir-vivre (''Wille zum Leben''), l'essence de toute chose : un effort aveugle, sans but ni repos, qui se manifeste en nous comme désir<ref>Schopenhauer, ''Le Monde comme volonté et comme représentation'' (1818), livre IV, trad. Auguste Burdeau, Paris, PUF.</ref>. Or tout désir naît d'un manque, donc d'une souffrance ; et la satisfaction, sitôt obtenue, laisse place à l'ennui. « La vie oscille, comme un pendule, de droite à gauche, de la souffrance à l'ennui »<ref>Schopenhauer, ''Le Monde comme volonté et comme représentation'', livre IV, § 57, trad. Burdeau : la vie humaine « oscille, comme un pendule, de droite à gauche, de la souffrance à l'ennui ».</ref>. Ce balancement perpétuel, où l'on n'échappe au tourment du désir que pour tomber dans le vide, décrit une insatisfaction sans terme. L'inquiétude n'est plus ici l'effet d'une circonstance : elle est la forme même de l'existence vouée à vouloir. Schopenhauer annonce un thème que reprendront les penseurs de l'[[Dictionnaire de philosophie/Absurde|absurde]] : la disproportion entre notre soif de sens et un monde qui n'en offre pas. [[Fichier:Nietzsche1882.jpg|vignette|gauche|Friedrich Nietzsche en 1882.]] [[s:Auteur:Friedrich Nietzsche|Friedrich Nietzsche]] pousse plus loin le diagnostic en l'inscrivant dans l'histoire. Ce qu'il nomme nihilisme désigne l'effondrement des valeurs supérieures qui donnaient sens au monde : « Que signifie le nihilisme ? Que les valeurs suprêmes se dévalorisent »<ref>Nietzsche, ''Fragments posthumes'' (1885-1888), regroupés par les éditeurs sous le titre ''La Volonté de puissance'', livre I : « Que signifie le nihilisme ? Que les valeurs suprêmes se dévalorisent. »</ref>. La formule « Dieu est mort » résume cette perte : les repères transcendants qui orientaient l'existence se sont effondrés, et l'homme se retrouve devant un univers privé de sens préétabli<ref>Nietzsche, ''Le Gai Savoir'' (1882), § 125, « L'insensé ».</ref>. Cette expérience peut engendrer le vertige et le désespoir, mais Nietzsche refuse de s'y arrêter. Le nihilisme est pour lui une crise à traverser, non un état où demeurer : à l'homme de créer de nouvelles valeurs, d'affirmer la vie telle qu'elle est, dans ce qu'il appelle l{{'}}''amor fati'', l'amour du destin. L'angoisse devant le néant des anciennes certitudes devient l'occasion d'une transformation de soi. == La psychanalyse : Freud et Lacan face à l'angoisse == [[Fichier:Sigmund Freud LIFE.jpg|vignette|Sigmund Freud (1856-1939).]] La psychanalyse apporte une autre perspective sur l'angoisse. Sigmund Freud lui consacre plusieurs théories successives, dont la dernière s'expose dans ''Inhibition, symptôme et angoisse'' (1926)<ref>Freud, ''Inhibition, symptôme et angoisse'' (1926), trad. de référence et présentation par Jérôme Lecœur, Payot, 2014.</ref>. Dans sa première conception, exposée dès 1895, Freud fait du refoulement le préalable de l'angoisse : l'énergie libidinale refoulée se transformerait en angoisse. L'ouvrage de 1926 renverse ce rapport. Ce n'est plus le refoulement qui produit l'angoisse, c'est l'angoisse qui déclenche le refoulement<ref>Freud, ''Inhibition, symptôme et angoisse'' : « L'ouvrage de 1926 renverse complètement le rapport de la cause et de l'effet : l'angoisse précède le refoulement. » Le moi, alerté par le signal d'angoisse, procède alors au refoulement du danger.</ref>. L'angoisse devient un signal d'alarme : un « signal d'affect » par lequel le moi s'avertit lui-même d'un danger pulsionnel interne et anticipe une situation périlleuse au lieu de la subir<ref>Freud, ''Inhibition, symptôme et angoisse'' : la formation du symptôme phobique fonctionne « comme si l'advenue de l'angoisse dans le moi exerçait la fonction d'un signal d'affect, celui d'un danger inconscient ». Le symptôme « permet de supprimer une situation de danger susceptible d'engendrer de l'angoisse ».</ref>. Freud ordonne ensuite les sources de l'angoisse selon le développement de l'enfant<ref>Freud, ''Inhibition, symptôme et angoisse'' : « l'acte de naissance, en tant que première expérience individuelle de l'angoisse », fournit le modèle de l'affect ; viennent ensuite la perte de l'objet, l'angoisse de castration, puis l'angoisse devant le surmoi.</ref>. La naissance fournit le premier modèle de l'affect ; puis vient l'angoisse de séparation, liée à la perte de l'objet aimé, la mère ; puis l'angoisse de castration, où l'enfant redoute pour son intégrité physique et où, dans l'analyse du petit Hans, la peur d'être châtré par le père se déguise en peur d'être mordu par le cheval ; enfin l'angoisse devant le surmoi, la culpabilité morale, et l'angoisse de mort. Toutes ces figures ont en commun la menace d'une perte : perte de l'objet d'amour, perte d'une partie du corps, perte de l'estime de soi. Jacques Lacan propose une relecture de Freud dans son ''Séminaire, Livre X : L'angoisse'' (1962-1963)<ref>Lacan, ''Le Séminaire, Livre X : L'angoisse'' (1962-1963), texte établi par Jacques-Alain Miller, Seuil, 2004.</ref>. Pour Lacan, l'angoisse « n'est pas sans objet », formule qui retourne la tradition psychiatrique faisant de l'angoisse une peur sans objet. Elle a bien un objet, mais un objet particulier qu'il nomme l'objet petit a : un objet partiel, un reste qui échappe à la symbolisation et qui se dérobe à l'image. Lacan affirme encore que « l'angoisse ne trompe pas »<ref>Lacan, ''Le Séminaire, Livre X : L'angoisse'', texte établi par J.-A. Miller, Seuil, 2004 : l'angoisse est rapportée au registre du réel, ce qui justifie qu'elle « ne trompe pas ».</ref>. Contrairement aux autres affects, qui peuvent se déplacer et nous égarer sur leur cause, l'angoisse est le signal du réel. Elle surgit quand le désir de l'Autre menace de nous annuler comme sujet désirant. Sa condition est, selon une autre formule de Lacan, « le manque du manque » : l'angoisse survient non pas quand quelque chose nous manque, mais quand le manque vient lui-même à manquer, quand l'Autre semble combler tous nos désirs au point de nous étouffer. Cette conception éclaire l'angoisse dans sa dimension relationnelle : elle surgit dans ces moments où nous nous sentons l'objet du désir de l'Autre sans savoir ce qu'il veut de nous, sans pouvoir maintenir la distance nécessaire au désir. == Janet : l'angoisse dans la psychopathologie française == Parallèlement à Freud, la tradition clinique française aborde l'angoisse par une autre voie. Pierre Janet, dans ''De l'angoisse à l'extase'' (1926), l'inscrit dans une psychologie des conduites et de l'énergie mentale<ref>Janet, Pierre, ''De l'angoisse à l'extase. Études sur les croyances et les sentiments'', tome I, Félix Alcan, 1926.</ref>. Là où la psychanalyse interprète l'angoisse comme signal d'un conflit pulsionnel, Janet la décrit comme un trouble de la régulation de l'action. Sa notion centrale est celle de tension psychologique : le degré d'énergie qui permet au sujet de hiérarchiser ses tendances et d'accomplir les actes les plus élaborés<ref>Janet, ''De l'angoisse à l'extase'', t. I : la « tension psychologique » désigne le niveau auquel un sujet peut maintenir et coordonner ses tendances ; son abaissement libère des conduites inférieures.</ref>. Quand cette tension s'abaisse, le sujet ne peut plus mener à terme l'action adaptée au présent, ce que Janet nomme la fonction du réel. L'énergie disponible se décharge alors en agitations, en ruminations et en angoisses, qui sont les signes d'un acte qui ne s'achève pas<ref>Janet, ''De l'angoisse à l'extase'', t. I : la délibération sans fin et l'invocation répétée « deviennent épuisants et amènent des agitations et des angoisses. C'est le caractère de l'aboulie, de l'incapacité de conclure une délibération qui crée l'état obsédant. »</ref>. L'[[Dictionnaire de philosophie/Aboulie|aboulie]], l'incapacité de conclure une délibération, illustre ce mécanisme : faute de pouvoir trancher, le sujet s'épuise et s'angoisse. Le titre de l'ouvrage indique une trajectoire. À partir de l'étude d'une patiente désignée sous le nom de Madeleine, Janet suit le passage des états d'angoisse aux états d'extase, deux régimes extrêmes de la tension intérieure<ref>Janet, ''De l'angoisse à l'extase'', t. I : le cas de Madeleine sert de fil conducteur, de ses crises d'angoisse à ses états extatiques accompagnés de stigmates.</ref>. L'analyse de Janet ancre ainsi l'angoisse dans une clinique de l'effort et de la fatigue, distincte de l'interprétation freudienne comme de la lecture lacanienne. == L'absurde et l'angoisse : Camus == Albert Camus, dans ''Le Mythe de Sisyphe'' (1942), propose une philosophie de l'absurde qui dialogue avec les pensées de l'angoisse<ref>Camus, ''Le Mythe de Sisyphe'', Gallimard, 1942.</ref>. Pour Camus, la question philosophique première est celle du suicide : juger que la vie vaut ou ne vaut pas la peine d'être vécue, c'est répondre à la question fondamentale de la philosophie. L'absurde naît de la confrontation entre notre besoin de sens et le silence du monde<ref>Camus, ''Le Mythe de Sisyphe''.</ref>. Nous cherchons à comprendre le monde, à lui trouver une signification, mais le monde reste muet, étranger, indifférent à nos attentes. Cette expérience de l'étrangeté engendre une forme d'angoisse existentielle : comment vivre dans un monde dépourvu de sens ? La réponse de Camus n'est ni le suicide ni le « suicide philosophique », la fuite dans l'espérance religieuse ou métaphysique, mais la révolte. Sisyphe, condamné à rouler éternellement son rocher en haut de la montagne pour le voir retomber, devient le héros de l'absurde. Sa grandeur vient de sa lucidité : il sait que sa tâche est vaine, mais il continue. « Il faut imaginer Sisyphe heureux », conclut Camus. Dans ''L'Homme révolté'' (1951), Camus précise que l'absurde n'est pas une fin mais un commencement<ref>Camus, ''L'Homme révolté'', Gallimard, 1951 : l'absurde y est défini comme « un passage vécu, un point de départ, l'équivalent, en existence, du doute méthodique de Descartes ».</ref>. Le sentiment de l'absurde, comme le [[Dictionnaire de philosophie/Doute|doute]] cartésien, n'a de valeur que s'il est dépassé. Ce dépassement s'appelle la révolte : « Qu'est-ce qu'un homme révolté ? Un homme qui dit non », mais qui, dans le même mouvement, dit oui à une valeur qu'il juge inviolable<ref>Camus, ''L'Homme révolté'' : « Qu'est-ce qu'un homme révolté ? Un homme qui dit non. Mais s'il refuse, il ne renonce pas : c'est aussi un homme qui dit oui, dès son premier mouvement. »</ref>. Ce passage transforme l'angoisse en l'arrachant à la solitude. Dans l'épreuve de l'absurde, écrit Camus, la souffrance est individuelle ; dans le mouvement de révolte, elle se découvre collective<ref>Camus, ''L'Homme révolté'' : « Dans l'expérience absurde, la souffrance est individuelle. À partir du mouvement de révolte, elle a conscience d'être collective, elle est l'aventure de tous. »</ref>. La révolte joue ici le rôle que le ''[[Dictionnaire de philosophie/Cogito|cogito]]'' tient dans l'ordre de la pensée : elle est la première évidence, mais une évidence qui tire l'individu de son isolement. À la formule de [[Dictionnaire de philosophie/René Descartes|Descartes]], Camus substitue la sienne : « je me révolte, donc nous sommes »<ref>Camus, ''L'Homme révolté'' : « la révolte joue le même rôle que le “cogito” dans l'ordre de la pensée : elle est la première évidence. Mais cette évidence tire l'individu de sa solitude. […] Je me révolte, donc nous sommes. »</ref>. L'angoisse et le désespoir que l'absurde pourrait engendrer cèdent la place à une solidarité fondée et à une joie de vivre ce qui nous est donné, sans chercher de justification au-delà de la vie elle-même. == Levinas : la responsabilité contre l'angoisse == Emmanuel Levinas (1906-1995), qui avait suivi les cours de Husserl et de Heidegger à Fribourg en 1928-1929, propose un renversement de la philosophie existentialiste de l'angoisse<ref>Levinas, ''Totalité et Infini. Essai sur l'extériorité'', Martinus Nijhoff, 1961 ; ''Autrement qu'être ou au-delà de l'essence'', Martinus Nijhoff, 1974.</ref>. Pour lui, la philosophie première n'est pas l'ontologie mais l'éthique, et l'inquiétude ne révèle pas d'abord notre être-pour-la-mort mais notre responsabilité pour [[Dictionnaire de philosophie/Altérité|autrui]]. Levinas conteste l'analyse heideggérienne sur son propre terrain. Dans ''De l'existence à l'existant'', écrit en partie durant sa captivité en Allemagne, il décrit ce qu'il nomme l{{'}}« il y a » : le fait brut et impersonnel qu'il y a de l'être, « comme “il pleut” ou “il fait nuit” », un bruissement anonyme qui demeure même lorsqu'on imagine toute chose abolie<ref>Levinas, ''Éthique et Infini. Dialogues avec Philippe Nemo'', Fayard, 1982 : « J'insiste sur l'impersonnalité de l'“il y a” ; “il y a”, comme “il pleut” ou “il fait nuit”. Et il n'y a ni joie ni abondance. » Ni être ni néant, l'« il y a » est rapporté à l'expérience de l'insomnie.</ref>. À ce « il y a » Levinas oppose le « es gibt » de Heidegger, où le verbe ''geben'', donner, introduit une générosité de l'être ; pour Levinas, au contraire, il n'y a dans le « il y a » ni don ni générosité, mais une présence étouffante<ref>Levinas, ''Éthique et Infini'' : à Philippe Nemo qui évoque le « es gibt » heideggérien analysé « comme générosité », Levinas répond qu'il insiste au contraire sur l'impersonnalité et l'absence de générosité du « il y a ».</ref>. L'expérience qui répond à cet anonymat n'est pas, pour Levinas, l'angoisse, mais l'horreur. Il tient à l'en distinguer : le premier ouvrage où il décrit l'« il y a », précise-t-il, parut avec un bandeau portant la mention « Où il n'est pas question d'angoisse », au moment où l'on commençait à beaucoup parler d'angoisse à Paris, en 1947<ref>Levinas, ''Éthique et Infini'' : l'« il y a » est décrit « comme horreur et affolement » ; le bandeau de l'édition portait : « Où il n'est pas question d'angoisse ». L'analyse vise expressément à se démarquer du vocabulaire existentialiste de l'angoisse.</ref>. L'horreur n'isole pas un sujet souverain face à sa mort : elle le dépersonnalise, comme dans l'insomnie où ce n'est plus « je » qui veille, mais « ça » qui veille. La sortie de cet anonyme ne se fait pas par un retour à soi, mais par la rencontre d'autrui. Le visage d'autrui, dans sa nudité et sa fragilité, m'interpelle et me commande<ref>Levinas, ''Éthique et Infini'' : « Le “Tu ne tueras point” est la première parole du visage. Or c'est un ordre. » Le visage est en même temps celui du pauvre, « pour lequel je peux tout et à qui je dois tout ».</ref>. Son premier commandement est « tu ne tueras point ». Ce visage m'investit d'une responsabilité que je n'ai pas choisie, qui me précède et m'assigne à répondre de l'autre. Cette responsabilité est asymétrique : je suis responsable d'autrui sans attendre de réciprocité, et si autrui est aussi responsable à mon égard, « ceci est son affaire », non la mienne<ref>Levinas, ''Éthique et Infini'' : à la question de savoir si autrui a, envers moi, les mêmes devoirs que moi envers lui, Levinas répond : « Peut-être, mais ceci est son affaire. » La responsabilité éthique est posée comme non réciproque.</ref>. Levinas ne se contente pas de substituer la responsabilité à l'angoisse : il refonde à partir d'elle la question du [[Dictionnaire de philosophie/Sujet|sujet]]. Le moi n'est pas d'abord une conscience souveraine qui déciderait ensuite de se soucier d'autrui ; il se constitue comme sujet dans l'assignation même à répondre. « Il s'agit de dire l'identité même du moi humain à partir de la responsabilité », écrit Levinas, comme « déposition du moi souverain »<ref>Levinas, ''Éthique et Infini'' : « il s'agit de dire l'identité même du moi humain à partir de la responsabilité […], déposition du moi souverain dans la conscience de soi. » Et plus loin : « je suis moi dans la seule mesure où je suis responsable. »</ref>. La subjectivité dérive ainsi d'une hétéronomie, une loi qui vient de l'autre et me précède, et non d'une autonomie que je me donnerais. L'angoisse heideggérienne isolait un Dasein renvoyé à son pouvoir-être ; chez Levinas, le sujet est d'emblée décentré, ouvert et obligé par autrui avant tout retour sur soi. Cette pensée déplace la conception existentialiste de l'angoisse. Chez Heidegger et Sartre, l'angoisse révèle ma liberté et ma solitude. Chez Levinas, elle cède la place à une responsabilité qui me dépossède de ma souveraineté. Je ne suis pas d'abord un être angoissé face à mon propre néant, mais un être assigné à répondre de l'autre, « otage » de sa vulnérabilité<ref>Le terme d'« otage », qui désigne la substitution du sujet à autrui, est développé dans ''Autrement qu'être ou au-delà de l'essence'' (1974).</ref>. La responsabilité n'élimine pas toute inquiétude, mais elle la transforme : elle ne porte plus sur ma mort ou ma liberté, mais sur ma capacité à répondre à l'appel d'autrui et sur mon impuissance face à sa souffrance. == L'angoisse contemporaine : symptôme de la modernité en crise == L'angoisse ne cesse de hanter la conscience contemporaine. Bien au-delà du champ philosophique, elle devient un symptôme de notre modernité<ref>Beck, Ulrich, ''La Société du risque. Sur la voie d'une autre modernité'' (1986), trad. fr. Aubier, 2001 ; Bauman, Zygmunt, ''La Vie liquide'' (2005), trad. fr. Le Rouergue / Chambon, 2006.</ref>. Les angoisses contemporaines se multiplient : angoisse climatique (éco-anxiété), angoisse identitaire, angoisse face au terrorisme, angoisse face à la précarité, angoisse face à l'effondrement possible de notre civilisation<ref>Dupuy, Jean-Pierre, ''Pour un catastrophisme éclairé. Quand l'impossible est certain'', Seuil, 2002.</ref>. Ces angoisses collectives se distinguent peut-être des angoisses existentielles analysées par les philosophes en ce qu'elles possèdent des objets plus déterminés : le réchauffement climatique, la perte d'identité culturelle, l'insécurité économique<ref>Giddens, Anthony, ''Les Conséquences de la modernité'' (1990), trad. fr. L'Harmattan, 1994.</ref>. À la lettre, plusieurs de ces états relèvent donc moins de l'angoisse au sens strict, sans objet, que de la peur ou de l'inquiétude devant des menaces identifiables : on craint un réchauffement que l'on mesure, un déclassement social que l'on anticipe. La distinction posée au début de cet article garde ici sa pertinence. Pourtant, elles partagent avec l'angoisse philosophique une structure commune : elles révèlent notre incapacité à maîtriser l'avenir, notre impuissance face à des processus qui nous dépassent, notre vertige devant un monde devenu illisible. Sous l'objet déterminé de ces peurs nommées affleure souvent une angoisse plus sourde, celle d'un avenir dérobé et d'un monde dont la maîtrise nous échappe. La modernité elle-même peut être comprise comme une crise permanente, un état d'incertitude et de remise en question continuelle. La dissolution des structures traditionnelles (communauté, famille, religion, nation), la « liquidité » des relations sociales analysée par Zygmunt Bauman, la fragmentation de l'expérience décrite par Edgar Morin produisent un sentiment d'instabilité<ref>Bauman, Zygmunt, ''Modernité liquide'' (2000), trad. fr. Le Rouergue / Chambon, 2002 ; Morin, Edgar, ''La Voie. Pour l'avenir de l'humanité'', Fayard, 2011.</ref>. L'individu contemporain, sommé de se réinventer sans cesse sans pouvoir s'appuyer sur des repères stables, fait l'expérience d'une angoisse structurelle. Cette angoisse contemporaine appelle de nouvelles réponses philosophiques et pratiques<ref>Han, Byung-Chul, ''La Société de la fatigue'' (2010), trad. fr. Circé, 2014.</ref>. Comment penser et vivre l'angoisse à l'ère de la mondialisation, de la crise écologique et des bouleversements technologiques ? Faut-il chercher à l'apaiser par de nouvelles formes de spiritualité ou de communauté ? Doit-on au contraire l'assumer comme le prix de notre lucidité face aux dangers réels qui menacent notre monde ? Ces questions restent ouvertes et font de l'angoisse un enjeu philosophique vivant. == Une catégorie moderne ? Repères historiographiques == Au terme de ce parcours, une question d'histoire des idées se pose : l'angoisse est-elle une catégorie proprement moderne, ou bien une expérience de toujours que chaque époque a nommée à sa manière ? Les interprètes se partagent. Pour les uns, l'angoisse au sens fort, comme concept distinct de la peur, est une acquisition du XIX{{e}} siècle. Elle suppose un sujet individué, sommé de se choisir sans le secours d'un ordre cosmique ou divin garanti ; ce sujet serait le produit de la modernité, de la sécularisation et de la dissolution des communautés traditionnelles. Avant Kierkegaard, on trouverait des inquiétudes, des mélancolies, des craintes religieuses, mais non l'angoisse comme structure de l'existence libre. Pour les autres, des formes analogues traversent toute l'histoire : la recherche antique de l'[[Dictionnaire de philosophie/Ataraxie|ataraxie]] répondait déjà à un trouble de l'âme, l'acédie monastique et l{{'}}''Anfechtung'' luthérienne décrivaient des désolations sans objet précis, et l{{'}}''inquietudo'' augustinienne nommait un manque existentiel. L'historien Jean Delumeau a soutenu que l'Occident a connu, entre le XIV{{e}} et le XVIII{{e}} siècle, une « angoisse collective » diffuse que les institutions transformaient en peurs nommées et maîtrisables<ref>Delumeau, ''La Peur en Occident (XIV{{e}}-XVIII{{e}} siècle). Une cité assiégée'', Paris, Fayard, 1978 ; ''Le Péché et la peur'', Paris, Fayard, 1983.</ref>. Ce débat n'a pas de solution simple, et il importe moins de trancher que de le garder présent à l'esprit. Reconnaître la part de construction historique du concept évite d'en faire une donnée intemporelle ; repérer ses formes anciennes évite d'y voir une simple mode intellectuelle. L'angoisse apparaît alors comme une expérience humaine durable dont la formulation philosophique, elle, a une histoire datable. == Conclusion : l'angoisse comme révélation == À travers ces approches, l'angoisse apparaît moins comme un état psychologique à éviter que comme une expérience révélatrice de la condition humaine. Qu'elle révèle notre liberté (Kierkegaard, Sartre), notre être-pour-la-mort (Heidegger), notre finitude (Pascal), notre responsabilité (Levinas) ou l'absurdité du monde (Camus), l'angoisse nous arrache à nos illusions rassurantes et nous confronte à des vérités difficiles. Les philosophes ne s'accordent ni sur le sens ultime de cette révélation ni sur la réponse qu'elle appelle. Faut-il chercher l{{'}}''apatheia'' stoïcienne, la joie spinoziste, l'authenticité heideggérienne, la révolte camusienne ou la responsabilité lévinassienne ? Chaque penseur propose une voie différente. Mais tous s'accordent sur un point : l'angoisse ne peut être simplement éliminée ou niée. Elle fait partie intégrante de notre existence consciente et réflexive. Peut-être l'angoisse est-elle finalement le prix de notre humanité : seul un être capable de se projeter dans l'avenir, de questionner le sens de son existence, de se soucier de sa mort et de celle d'autrui peut angoisser. L'angoisse serait ainsi, paradoxalement, la marque de notre grandeur autant que de notre misère, le signe que nous ne sommes pas de simples choses déterminées mais des existences ouvertes, libres et responsables, tenues de donner sens à un monde qui n'en offre pas d'avance. Par là, l'angoisse occupe une position singulière dans la pensée : elle est l'un des rares lieux où convergent les grandes questions de la philosophie. La liberté et la responsabilité, la temporalité et la finitude, la quête de sens et l'énigme de l'identité s'y nouent en une seule expérience. Interroger l'angoisse, ce n'est donc pas s'arrêter à un sentiment parmi d'autres : c'est toucher au point où l'existence humaine se rassemble et se met elle-même en question. == Références == {{références|colonnes=2}} == Bibliographie == === Sources primaires === ==== Antiquité ==== * Épictète, ''Manuel'', dans ''Les Stoïciens'', trad. Émile Bréhier, Paris, Gallimard, « Bibliothèque de la Pléiade », 1962. * Marc Aurèle, ''Pensées pour moi-même'', trad. Mario Meunier, Paris, Garnier. * Sénèque, ''Lettres à Lucilius'', trad. Henri Noblot, Paris, Les Belles Lettres. ==== Tradition chrétienne ==== * Augustin, ''Confessions'' (397-401), trad. Pierre de Labriolle, Paris, Les Belles Lettres. * Jean de la Croix, ''La Nuit obscure'' (''Noche oscura'', vers 1578-1585), trad. fr. dans les ''Œuvres complètes'', Paris, Cerf. ==== Philosophie moderne ==== * Pascal, Blaise, ''Pensées'' (1670), éd. Léon Brunschvicg et éd. Louis Lafuma. * Spinoza, Baruch, ''Éthique'' (1677), trad. Charles Appuhn, Paris, Garnier-Flammarion. ==== XIX{{e}} siècle ==== * Kierkegaard, Søren, ''Le Concept de l'angoisse'' (1844), trad. Knud Ferlov et Jean-Jacques Gateau, Paris, Gallimard. * Kierkegaard, Søren, ''Riens philosophiques'' (1844), trad. Knud Ferlov et Jean-Jacques Gateau, Paris, Gallimard (traduction des ''Miettes philosophiques''). * Kierkegaard, Søren, ''Traité du désespoir'' (''La Maladie à la mort'', 1849), trad. Knud Ferlov et Jean-Jacques Gateau, Paris, Gallimard. * Schopenhauer, Arthur, ''Le Monde comme volonté et comme représentation'' (1818), trad. Auguste Burdeau, Paris, PUF. * Nietzsche, Friedrich, ''Le Gai Savoir'' (1882), trad. Patrick Wotling, Paris, Flammarion, « GF ». * Nietzsche, Friedrich, ''Fragments posthumes'' (1885-1888), dans les ''Œuvres philosophiques complètes'', éd. G. Colli et M. Montinari, Paris, Gallimard. ==== XX{{e}} siècle : phénoménologie et existentialisme ==== * Heidegger, Martin, ''Être et Temps'' (1927), trad. Emmanuel Martineau, Paris, Authentica, 1985. * Heidegger, Martin, ''Qu'est-ce que la métaphysique ?'' (1929), trad. Henry Corbin, dans ''Questions I et II'', Paris, Gallimard. * Levinas, Emmanuel, ''De l'existence à l'existant'' (1947), Paris, Vrin. * Levinas, Emmanuel, ''Le Temps et l'Autre'' (1948), Paris, PUF, « Quadrige ». * Levinas, Emmanuel, ''Totalité et Infini. Essai sur l'extériorité'' (1961), La Haye, Martinus Nijhoff. * Levinas, Emmanuel, ''Autrement qu'être ou au-delà de l'essence'' (1974), La Haye, Martinus Nijhoff. * Levinas, Emmanuel, ''Éthique et Infini. Dialogues avec Philippe Nemo'' (1982), Paris, Fayard. * Sartre, Jean-Paul, ''L'Être et le Néant'' (1943), Paris, Gallimard. * Sartre, Jean-Paul, ''L'existentialisme est un humanisme'' (1945), Paris, Nagel ; rééd. Gallimard, « Folio essais ». ==== Littérature philosophique ==== * Camus, Albert, ''Le Mythe de Sisyphe'' (1942), Paris, Gallimard. * Camus, Albert, ''L'Homme révolté'' (1951), Paris, Gallimard. ==== Psychologie et psychanalyse ==== * Janet, Pierre, ''De l'angoisse à l'extase. Études sur les croyances et les sentiments'' (1926), Paris, Félix Alcan. * Freud, Sigmund, ''Inhibition, symptôme et angoisse'' (1926), trad. et présentation Jérôme Lecœur, Paris, Payot, 2014. * Lacan, Jacques, ''Le Séminaire, Livre X : L'angoisse'' (1962-1963), texte établi par Jacques-Alain Miller, Paris, Seuil, 2004. === Études et commentaires === * Bauman, Zygmunt, ''Modernité liquide'' (2000), Paris, Le Rouergue / Chambon, 2002. * Bauman, Zygmunt, ''La Vie liquide'' (2005), Paris, Le Rouergue / Chambon, 2006. * Beck, Ulrich, ''La Société du risque'' (1986), Paris, Aubier, 2001. * Deleuze, Gilles, ''Spinoza. Philosophie pratique'', Paris, Minuit, 1981. * Delumeau, Jean, ''La Peur en Occident (XIV{{e}}-XVIII{{e}} siècle). Une cité assiégée'', Paris, Fayard, 1978. * Delumeau, Jean, ''Le Péché et la peur. La culpabilisation en Occident (XIII{{e}}-XVIII{{e}} siècle)'', Paris, Fayard, 1983. * Dupuy, Jean-Pierre, ''Pour un catastrophisme éclairé'', Paris, Seuil, 2002. * Giddens, Anthony, ''Les Conséquences de la modernité'' (1990), Paris, L'Harmattan, 1994. * Grøn, Arne, ''The Concept of Anxiety in Søren Kierkegaard'', trad. anglaise de Jeanette B. L. Knox, Macon, Mercer University Press, 2008. * Hadot, Pierre, ''Exercices spirituels et philosophie antique'', Paris, Albin Michel, 1981 (nouvelle éd. 2002). * Han, Byung-Chul, ''La Société de la fatigue'' (2010), Paris, Circé, 2014. * Horwitz, Allan V., ''Anxiety. A Short History'', Baltimore, Johns Hopkins University Press, 2013. * Morin, Edgar, ''La Voie'', Paris, Fayard, 2011. * Wahl, Jean, ''Études kierkegaardiennes'', Paris, Vrin, 1938. === Ouvrages de référence === * ''Manuel diagnostique et statistique des troubles mentaux'' (DSM-5), American Psychiatric Association, 2013 ; trad. fr. Elsevier Masson, 2015. {{Autocat}} ctxamd10gnuxown49go8h43q84vl9wk Dictionnaire de philosophie/Action 0 83017 768145 766683 2026-06-19T04:13:23Z PandaMystique 119061 Bot : ajout du paramètre lecture=oui au modèle {{DicoPhilo}} 768145 wikitext text/x-wiki {{DicoPhilo|Action|lecture=oui}} La notion d'action constitue l'un des concepts fondamentaux de la philosophie, au carrefour de l'éthique, de la métaphysique, de la philosophie de l'esprit et de la philosophie politique. Comprendre ce qu'est une action humaine, ce qui la distingue d'un simple mouvement ou d'un événement, comment elle se rapporte aux raisons, aux intentions et à la responsabilité morale - telles sont les interrogations qui ont animé la réflexion philosophique depuis l'Antiquité jusqu'à nos jours. == Définition et problématique générale == Au sens le plus fondamental, une action peut être définie comme l'exercice de la capacité d'un agent à produire intentionnellement des changements dans le monde<ref>Hornsby, J. (1980). ''Actions''. London: Routledge</ref>. Cependant, cette définition apparemment simple dissimule une profonde complexité conceptuelle. En effet, tous les mouvements d'un être humain ne constituent pas des actions au sens philosophique du terme. Un spasme musculaire involontaire, un tremblement dû à la peur, ou les battements de mon cœur sont des événements qui se produisent en moi ou par moi, mais ne sont pas des actions que j'accomplis<ref>Anscombe, G.E.M. (1957). ''Intention''. Oxford: Blackwell</ref>. La philosophie de l'action s'attache donc à distinguer les actions proprement dites - caractérisées par leur intentionnalité, leur lien aux raisons de l'agent, et leur relation à la responsabilité morale - des simples mouvements corporels ou des événements psychophysiques. Cette distinction soulève plusieurs questions fondamentales : Qu'est-ce qui fait qu'un mouvement corporel devient une action ? Comment les états mentaux de l'agent (croyances, désirs, intentions) se rapportent-ils à ses actions ? Les actions sont-elles causées par des raisons, ou existe-t-il un type d'explication spécifiquement distinct de l'explication causale ? Quelle est la relation entre l'agentivité (agency), la liberté et la responsabilité morale ? == La conception aristotélicienne : praxis et poièsis == La réflexion sur l'action trouve ses racines les plus profondes dans la pensée d'Aristote, qui établit une distinction fondamentale entre ''praxis'' (πρᾶξις) et ''poièsis'' (ποίησις)<ref>Aristote. ''Éthique à Nicomaque'', VI, 4-5, 1140a1-1140b30</ref>. Cette distinction n'est pas simplement terminologique, mais révèle deux modalités fondamentalement différentes de l'activité humaine. La ''praxis'', ou action au sens propre, est une activité dont la fin est immanente, c'est-à-dire qu'elle est accomplie pour elle-même et trouve sa perfection dans son propre exercice. L'activité contemplative (''théôria''), l'exercice des vertus éthiques, ou encore l'action politique au sens noble constituent des formes de ''praxis''. Comme l'écrit Aristote : « Le fait de bien agir est le but même de l'action »<ref>Aristote. ''Éthique à Nicomaque'', VI, 5, 1140b6-7</ref>. La ''praxis'' se caractérise donc par le fait qu'elle ne vise pas la production d'une œuvre extérieure à l'agent, mais l'excellence même de l'action et la perfection de celui qui agit. À l'inverse, la ''poièsis'', ou production, est une activité orientée vers la création d'une œuvre distincte de l'action elle-même. Le travail de l'artisan, la composition d'un poème, la construction d'une maison sont des exemples de ''poièsis''. Ici, l'activité tire sa valeur et sa signification de son résultat : l'objet produit. La ''poièsis'' relève de la ''technè'' (art, technique), tandis que la ''praxis'' authentique relève de la ''phronèsis'' (sagesse pratique) et s'inscrit dans le domaine de l'éthique<ref>Aristote. ''Éthique à Nicomaque'', VI, 1-13</ref>. Cette distinction aristotélicienne a exercé une influence considérable sur toute la tradition philosophique occidentale. Elle permet notamment de comprendre que toute action humaine ne se réduit pas à l'instrumentalité - certaines actions ont leur valeur en elles-mêmes, indépendamment de ce qu'elles produisent. Cette perspective s'oppose à une vision purement utilitariste ou conséquentialiste de l'action humaine, et ouvre la voie à une éthique centrée sur la vertu et l'excellence du caractère plutôt que sur les seuls résultats des actions. Pour Aristote, l'action volontaire (''hekousion'') se distingue de l'action involontaire par deux critères principaux : l'origine interne du principe moteur et la connaissance des circonstances particulières de l'action<ref>Aristote. ''Éthique à Nicomaque'', III, 1, 1110a1-1111b3</ref>. Une action est volontaire lorsque son principe se trouve dans l'agent lui-même et que celui-ci connaît les circonstances particulières dans lesquelles il agit. Cette analyse fonde la possibilité de l'imputation morale : nous sommes responsables de nos actions volontaires parce que nous en sommes la source (''archè''). == L'intentionnalité de l'action == La notion d'intentionnalité occupe une place centrale dans la philosophie contemporaine de l'action. Depuis les travaux pionniers d'Elizabeth Anscombe dans son ouvrage ''Intention'' (1957), les philosophes ont cherché à comprendre ce qui fait qu'une action est intentionnelle et comment l'intentionnalité se rapporte à l'explication de l'action<ref>Anscombe, G.E.M. (1957). ''Intention''. Oxford: Blackwell</ref>. Pour Anscombe, une action est intentionnelle sous une certaine description lorsqu'elle répond de manière appropriée à la question « Pourquoi ? » (« Why? »). Si je lève le bras pour saluer quelqu'un, mon action de lever le bras est intentionnelle sous la description « saluer », mais peut ne pas l'être sous d'autres descriptions (par exemple, « effrayer un oiseau »). Cette sensibilité aux descriptions sous lesquelles une action est intentionnelle révèle un trait fondamental de l'intentionnalité : elle est toujours aspectuelle, c'est-à-dire qu'elle dépend de la manière dont l'agent conçoit son action<ref>Anscombe, G.E.M. (1979). "Under a Description". ''Noûs'', 13, 219-233</ref>. L'analyse anscombienne de l'intentionnalité met également en lumière le rôle de la connaissance pratique (''practical knowledge'') dans l'action. L'agent qui agit intentionnellement possède une forme spécifique de connaissance de ce qu'il fait - non pas une connaissance observationnelle obtenue par la perception externe, mais une connaissance non-observationnelle qui est constitutive de l'action elle-même. Lorsque je tourne la poignée pour ouvrir la porte, je sais ce que je fais sans avoir besoin de m'observer en train de le faire. Cette connaissance pratique n'est pas un simple épiphénomène accompagnant l'action ; elle en est partie intégrante et contribue à déterminer ce qui compte comme une action réussie ou échouée. La question de savoir ce qui rend une action intentionnelle a donné lieu à différentes théories. Certains philosophes, dans la lignée d'Anscombe, soutiennent que l'intentionnalité de l'action ne requiert pas nécessairement une intention préalable distincte de l'action elle-même. D'autres, comme Michael Bratman, distinguent entre les intentions en action (''intentions-in-action'') et les intentions préalables (''prior intentions''), et soulignent le rôle crucial de la planification et de la structure temporelle de l'action<ref>Bratman, M. (1987). ''Intention, Plans, and Practical Reason''. Cambridge, MA: Harvard University Press</ref>. == Raisons et causes : le débat causaliste == L'une des controverses majeures de la philosophie contemporaine de l'action concerne la relation entre les raisons pour lesquelles un agent agit et les causes de son action. Cette question a été portée au premier plan par l'article célèbre de Donald Davidson, « Actions, Reasons, and Causes » (1963), qui défend une théorie causaliste de l'explication par les raisons<ref>Davidson, D. (1963). "Actions, Reasons, and Causes". ''The Journal of Philosophy'', 60(23), 685-700</ref>. Selon Davidson, lorsque nous expliquons une action intentionnelle en citant les raisons de l'agent, nous fournissons en réalité une explication causale. Une raison primaire (''primary reason'') d'agir consiste en la combinaison d'une pro-attitude (un désir, une volonté, un principe) envers des actions d'un certain type et d'une croyance selon laquelle l'action accomplie est de ce type. Cette raison primaire rationalise l'action en la rendant intelligible, mais elle la cause également au sens où elle est l'événement mental qui produit causalement l'action en question. Par exemple, si je retourne mon parapluie parce que je désire rester au sec et crois que retourner mon parapluie me permettra de rester au sec, alors mon désir et ma croyance constituent ensemble ma raison primaire d'agir. Cette raison primaire explique mon action en la rationalisant (elle montre pourquoi mon action avait du sens de mon point de vue), mais elle cause également mon action d'une manière appropriée<ref>Davidson, D. (1980). ''Essays on Actions and Events''. Oxford: Clarendon Press</ref>. La théorie davidsonienne se heurte toutefois à plusieurs difficultés. La plus importante est le problème des chaînes causales déviantes (''deviant causal chains''). Supposons qu'un grimpeur désire se libérer du poids et du danger de tenir un autre homme au bout d'une corde, et croit que lâcher la corde accomplira cela. Ce désir et cette croyance rendent le grimpeur si nerveux qu'il lâche involontairement la corde. Dans ce cas, le désir et la croyance du grimpeur causent bien l'action de lâcher la corde, mais pas de la manière appropriée - l'action n'est pas intentionnelle. Le défi pour le causaliste est de spécifier quelle forme de causation est la forme appropriée pour l'action intentionnelle<ref>Davidson, D. (1973). "Freedom to Act". In T. Honderich (ed.), ''Essays on Freedom of Action''. London: Routledge</ref>. Face à la théorie causaliste, certains philosophes, souvent inspirés par Wittgenstein, défendent une conception anti-causaliste selon laquelle les raisons d'agir ne sont pas des causes au sens d'événements mentaux qui produisent causalement des mouvements corporels. Pour ces penseurs, l'explication d'une action par les raisons de l'agent relève d'une forme de compréhension (''Verstehen'') distincte de l'explication causale propre aux sciences naturelles. Citer les raisons d'un agent, c'est rendre son action intelligible en la situant dans un contexte normatif de justification, non la rattacher à un mécanisme causal<ref>Melden, A.I. (1961). ''Free Action''. London: Routledge & Kegan Paul</ref>. Cette opposition entre causalistes et anti-causalistes structure encore largement le débat contemporain. Elle révèle des questions plus profondes concernant la nature de l'esprit, la relation entre raisons et causes, et la possibilité d'une science de l'action humaine qui respecterait la spécificité du domaine pratique sans renoncer à l'idée que les actions humaines s'inscrivent dans l'ordre causal naturel. == Action, liberté et responsabilité == La question de la relation entre l'action, la liberté et la responsabilité morale constitue l'un des problèmes les plus anciens et les plus persistants de la philosophie. Pour qu'un agent soit considéré comme moralement responsable de ses actions, il semble nécessaire qu'il ait agi librement. Mais qu'est-ce qu'agir librement ? Et cette liberté est-elle compatible avec l'idée que nos actions sont causalement déterminées par des facteurs antécédents (états cérébraux, désirs, croyances, histoire personnelle) ? Trois grandes positions se sont cristallisées dans ce débat. Le libertarisme (au sens métaphysique, à ne pas confondre avec le libertarisme politique) soutient que la liberté authentique requiert une forme d'indéterminisme : pour être libre, l'agent doit être la source ultime (''ultimate source'') de son action, ce qui implique que son choix ne soit pas entièrement déterminé par des facteurs antécédents. Cette conception s'appuie souvent sur l'idée d'une causalité par l'agent (''agent causation'') distincte de la causalité événementielle ordinaire<ref>Chisholm, R. (1976). ''Person and Object''. La Salle: Open Court</ref>. Le déterminisme dur (''hard determinism'') affirme au contraire que toutes nos actions sont causalement déterminées et que, par conséquent, la liberté au sens fort (la liberté de faire autrement dans des circonstances identiques) est une illusion. Dans cette perspective, la responsabilité morale telle que nous la concevons ordinairement serait elle aussi illusoire, ou du moins devrait être radicalement repensée<ref>Spinoza, B. (1677). ''Éthique'', Partie IV</ref>. Le compatibilisme propose une voie médiane en soutenant que la liberté pertinente pour la responsabilité morale est compatible avec le déterminisme causal. Pour les compatibilistes, être libre ne signifie pas que nos actions soient indéterminées, mais plutôt qu'elles procèdent de nos propres désirs, valeurs et délibérations, sans contrainte externe. Un agent agit librement lorsqu'il fait ce qu'il veut faire, lorsque ses actions expriment son caractère et ses engagements, même si ces désirs et ce caractère sont eux-mêmes causalement déterminés<ref>Frankfurt, H. (1971). "Freedom of the Will and the Concept of a Person". ''The Journal of Philosophy'', 68(1), 5-20</ref>. David Hume développa une forme classique de compatibilisme en arguant que la liberté n'est rien d'autre que l'absence de contrainte externe : « Par liberté, donc, nous ne pouvons entendre qu'un pouvoir d'agir ou de ne pas agir, conformément aux déterminations de la volonté »<ref>Hume, D. (1748). ''Enquête sur l'entendement humain'', Section VIII</ref>. Tant qu'un agent agit selon sa propre volonté, sans être contraint physiquement ou menacé, il agit librement au sens pertinent pour la moralité, que sa volonté soit elle-même déterminée ou non. Cette question de la liberté se rattache directement à celle de la responsabilité morale. Pour qu'un agent soit tenu pour moralement responsable d'une action, plusieurs conditions semblent nécessaires : (1) l'action doit être intentionnelle ou du moins volontaire ; (2) l'agent doit avoir eu la capacité d'agir autrement ou de s'abstenir ; (3) l'action doit procéder du caractère moral de l'agent d'une manière appropriée ; (4) l'agent doit posséder certaines capacités cognitives (comprendre ce qu'il fait, envisager les conséquences) et certaines capacités conatives (contrôler ses impulsions, délibérer rationnellement)<ref>Wallace, R.J. (1994). ''Responsibility and the Moral Sentiments''. Cambridge, MA: Harvard University Press</ref>. Ces conditions de la responsabilité sont l'objet de débats intenses. Le problème du contrôle demeure particulièrement difficile : en quel sens devons-nous avoir le contrôle de nos actions pour en être responsables ? Et comment concilier l'exigence de contrôle avec le fait que nos actions semblent déterminées par des facteurs - biologiques, psychologiques, sociaux - qui échappent largement à notre contrôle ? == L'éthique de la vertu et l'action == L'éthique de la vertu, dont les racines remontent à Aristote et qui connaît un renouveau important depuis les travaux d'Anscombe, de Philippa Foot et d'Alasdair MacIntyre, propose une approche de l'action morale fondamentalement différente de celles qui dominent la philosophie morale moderne (utilitarisme et déontologie kantienne)<ref>Anscombe, G.E.M. (1958). "Modern Moral Philosophy". ''Philosophy'', 33(124), 1-19</ref>. Plutôt que de se concentrer sur les principes ou les règles que doivent suivre les actions moralement correctes, l'éthique de la vertu met l'accent sur le caractère de l'agent et sur les dispositions stables (vertus) qui le constituent. Selon Rosalind Hursthouse, « une action est moralement correcte si et seulement si c'est ce qu'un agent vertueux ferait de manière caractéristique dans les circonstances »<ref>Hursthouse, R. (1999). ''On Virtue Ethics''. Oxford: Oxford University Press, p. 28</ref>. Cette approche transforme notre compréhension de l'action morale de plusieurs manières. Premièrement, elle insiste sur le fait que les actions ne peuvent être correctement évaluées indépendamment du caractère dont elles procèdent. Une action peut extérieurement ressembler à un acte de courage ou de générosité sans véritablement en être un si elle ne procède pas des dispositions vertueuses appropriées. Aristote distingue ainsi entre agir conformément à la vertu (faire ce que ferait une personne vertueuse) et agir à partir de la vertu (agir comme une personne vertueuse, avec les motivations et la sensibilité morale qui caractérisent la vertu)<ref>Aristote. ''Éthique à Nicomaque'', II, 4, 1105a28-1105b18</ref>. Deuxièmement, l'éthique de la vertu accorde une importance centrale à la formation du caractère moral à travers l'habituation (''hexis''). Les vertus ne sont pas des capacités innées, mais des excellences acquises par la pratique répétée d'actions vertueuses. Nous devenons justes en accomplissant des actes justes, courageux en accomplissant des actes courageux. Cette dimension éducative et développementale de l'éthique de la vertu contraste avec l'accent mis par d'autres théories éthiques sur l'application correcte de principes ou le calcul des conséquences dans des situations particulières. Troisièmement, l'éthique de la vertu souligne l'importance de la sagesse pratique (''phronèsis'') dans l'action morale. La ''phronèsis'' est la capacité à discerner, dans des situations concrètes et souvent complexes, ce qu'il convient de faire. Elle ne consiste pas simplement à appliquer mécaniquement des règles générales, mais à percevoir les traits moralement saillants d'une situation particulière et à répondre de manière appropriée. Cette capacité ne peut se réduire à une connaissance théorique ; elle requiert l'expérience, une sensibilité morale affinée, et une compréhension pratique que seule la vertu peut pleinement développer<ref>Aristote. ''Éthique à Nicomaque'', VI, 5-13</ref>. == L'action collective et l'agentivité partagée == Si la philosophie de l'action s'est longtemps concentrée sur l'action individuelle, les dernières décennies ont vu émerger un intérêt croissant pour l'action collective et l'agentivité partagée. Nous accomplissons quotidiennement des actions ensemble : jouer d'un orchestre symphonique, déplacer collectivement un meuble lourd, participer à une manifestation politique, ou simplement avoir une conversation. Ces actions collectives ne semblent pas réductibles à la simple somme des actions individuelles de leurs participants<ref>Gilbert, M. (1989). ''On Social Facts''. Princeton: Princeton University Press</ref>. Margaret Gilbert a développé le concept de « sujet pluriel » (''plural subject'') pour rendre compte de cette dimension collective de l'agentivité. Selon elle, lorsque plusieurs personnes accomplissent ensemble une action collective, elles forment un sujet pluriel caractérisé par un engagement conjoint (''joint commitment'') envers le but commun. Cet engagement conjoint crée des obligations particulières entre les participants : chacun doit non seulement faire sa part, mais est également en droit d'attendre des autres qu'ils fassent la leur<ref>Gilbert, M. (2006). ''A Theory of Political Obligation''. Oxford: Clarendon Press</ref>. Michael Bratman propose une analyse différente, fondée sur les intentions partagées (''shared intentions''). Pour lui, nous accomplissons ensemble une action lorsque nous avons des intentions individuelles d'agir qui sont interconnectées d'une manière spécifique : chacun a l'intention de faire sa part du plan commun, cette intention est subordonnée à nos intentions partagées concernant l'activité commune, et ces intentions forment ensemble un réseau d'intentions mutuellement responsives<ref>Bratman, M. (2014). ''Shared Agency: A Planning Theory of Acting Together''. Oxford: Oxford University Press</ref>. Ces analyses de l'action collective soulèvent des questions importantes pour la responsabilité morale. Qui est responsable des actions accomplies collectivement ? Les individus participants ? Le groupe en tant qu'entité distincte ? Comment attribuer la responsabilité lorsque chaque participant n'a accompli qu'une petite partie de l'action collective, mais que le résultat global est moralement significatif (pensons aux crimes collectifs, aux injustices structurelles, ou aux catastrophes écologiques) ? Ces questions sont d'une importance pratique considérable dans notre monde contemporain, où tant d'actions moralement significatives - pour le meilleur et pour le pire - ont un caractère profondément collectif<ref>French, P. (1984). ''Collective and Corporate Responsibility''. New York: Columbia University Press</ref>. == Action et structures sociales == La philosophie sociale et politique contemporaine a également exploré la relation complexe entre l'action individuelle et les structures sociales. Cette question se pose avec une acuité particulière dans les débats opposant l'individualisme méthodologique (qui cherche à expliquer les phénomènes sociaux en termes d'actions individuelles) et le holisme (qui accorde une réalité et un pouvoir causal aux structures sociales elles-mêmes). Les structures sociales - institutions, normes, pratiques, distributions de pouvoir et de ressources - façonnent profondément les possibilités d'action des individus. Elles déterminent quelles actions sont disponibles, lesquelles sont encouragées ou découragées, et comment les actions individuelles s'agrègent en résultats collectifs. En même temps, ces structures sont elles-mêmes le produit (souvent non intentionnel) d'actions humaines antérieures. Comprendre cette relation dialectique entre action et structure constitue un défi majeur pour la théorie sociale<ref>Giddens, A. (1984). ''The Constitution of Society''. Cambridge: Polity Press</ref>. Pierre Bourdieu a développé le concept d'habitus pour penser cette relation. L'habitus désigne un ensemble de dispositions durables, de schèmes de perception et d'action que les individus acquièrent à travers leur socialisation dans des conditions sociales particulières. Ces dispositions structurent les actions individuelles sans les déterminer entièrement, générant des pratiques « raisonnables » et « de sens commun » sans requérir une délibération consciente constante. L'habitus est à la fois structuré (par les conditions sociales passées) et structurant (des actions présentes)<ref>Bourdieu, P. (1980). ''Le sens pratique''. Paris : Éditions de Minuit</ref>. Cette perspective met en lumière les limites d'une conception purement individualiste de l'action. Nos actions ne sont jamais accomplies dans un vide social ; elles sont toujours situées dans des contextes structurés qui les rendent possibles, leur donnent sens, et orientent leur cours. Reconnaître cette dimension sociale de l'action n'implique pas nécessairement nier la réalité de l'agentivité individuelle, mais invite à une conception plus complexe et socialement informée de ce qu'est l'action humaine. == Conclusion == La notion d'action demeure au cœur de la réflexion philosophique contemporaine. Loin d'être un concept simple et transparent, elle révèle, à mesure qu'on l'examine, une richesse et une complexité considérables. De la distinction aristotélicienne entre ''praxis'' et ''poièsis'' aux débats contemporains sur la nature de l'intentionnalité, de la causalité par les raisons, de la liberté et de la responsabilité morale, la philosophie de l'action continue de susciter des controverses fécondes. Ces questions ne sont pas de simples curiosités théoriques. Elles touchent à la compréhension que nous avons de nous-mêmes comme agents responsables, capables de façonner nos vies et notre monde commun. Elles informent nos pratiques morales et juridiques d'attribution de la responsabilité, nos efforts éducatifs visant à former le caractère moral, et nos institutions sociales et politiques. Comprendre l'action humaine dans toute sa complexité - comme à la fois causée et libre, individuelle et sociale, intentionnelle et soumise aux structures - reste ainsi un enjeu philosophique majeur pour penser notre condition d'êtres agissants dans le monde. == Notes et références == <references /> == Bibliographie == * Anscombe, G.E.M. (1957). ''Intention''. Oxford: Basil Blackwell. * Anscombe, G.E.M. (1958). "Modern Moral Philosophy". ''Philosophy'', 33(124), 1-19. * Anscombe, G.E.M. (1979). "Under a Description". ''Noûs'', 13, 219-233. * Aristote. ''Éthique à Nicomaque''. Traduction, introduction et notes par J. Tricot. Paris : Vrin, 1990. * Bourdieu, P. (1980). ''Le sens pratique''. Paris : Éditions de Minuit. * Bratman, M. (1987). ''Intention, Plans, and Practical Reason''. Cambridge, MA: Harvard University Press. * Bratman, M. (2014). ''Shared Agency: A Planning Theory of Acting Together''. Oxford: Oxford University Press. * Chisholm, R. (1976). ''Person and Object''. La Salle: Open Court. * Davidson, D. (1963). "Actions, Reasons, and Causes". ''The Journal of Philosophy'', 60(23), 685-700. * Davidson, D. (1973). "Freedom to Act". In T. Honderich (ed.), ''Essays on Freedom of Action''. London: Routledge. * Davidson, D. (1980). ''Essays on Actions and Events''. Oxford: Clarendon Press. * Frankfurt, H. (1971). "Freedom of the Will and the Concept of a Person". ''The Journal of Philosophy'', 68(1), 5-20. * French, P. (1984). ''Collective and Corporate Responsibility''. New York: Columbia University Press. * Gilbert, M. (1989). ''On Social Facts''. Princeton: Princeton University Press. * Gilbert, M. (2006). ''A Theory of Political Obligation''. Oxford: Clarendon Press. * Giddens, A. (1984). ''The Constitution of Society''. Cambridge: Polity Press. * Hornsby, J. (1980). ''Actions''. London: Routledge. * Hume, D. (1748). ''Enquête sur l'entendement humain''. Traduction Lafleur, Paris : GF-Flammarion, 2000. Section VIII. * Hursthouse, R. (1999). ''On Virtue Ethics''. Oxford: Oxford University Press. * Melden, A.I. (1961). ''Free Action''. London: Routledge & Kegan Paul. * Spinoza, B. (1677). ''Éthique''. Paris : Éditions du Seuil, 1954. * Wallace, R.J. (1994). ''Responsibility and the Moral Sentiments''. Cambridge, MA: Harvard University Press. {{Autocat}} hkifysgrjs2f1qb1zhfeff0gedfnpxw Dictionnaire de philosophie/Anarchisme 0 83018 768153 767809 2026-06-19T04:14:43Z PandaMystique 119061 Bot : ajout du paramètre lecture=oui au modèle {{DicoPhilo}} 768153 wikitext text/x-wiki {{DicoPhilo|Anarchisme|lecture=oui}} [[Fichier:Anarchy-symbol.svg|vignette|redresse=0.6|Le « A cerclé », signe de ralliement du mouvement anarchiste, diffusé à partir des années 1960.]] L'anarchisme compte parmi les théories politiques et sociales les plus décriées et les plus mal comprises de la tradition intellectuelle occidentale. On le réduit souvent à une apologie du désordre ou à un individualisme égocentré, alors qu'il repose sur une critique argumentée des structures de domination et sur un projet d'organisation sociale. Son objet n'est pas l'autorité en tout sens, encore moins la compétence, mais l'autorité non consentie et dominatrice, ainsi que la hiérarchie qui l'accompagne<ref>Pelletier, Philippe, ''L'Anarchisme'', Paris, Le Cavalier Bleu, coll. « Idées reçues », 2010, chapitre « L'anarchie, c'est le chaos ».</ref>. À cette critique s'ajoute l'esquisse d'une société organisée sur des bases non hiérarchiques, sans État contraignant, fondée sur l'autonomie individuelle et collective, la coopération volontaire et la solidarité mutuelle. == Genèse historique et formulation théorique == [[Fichier:William Godwin cropped.jpg|vignette|gauche|redresse|William Godwin (1756-1836), dont l'{{'}}''Enquête sur la justice politique'' (1793) propose la première défense systématique des thèses anarchistes, avant même que le mot soit forgé.]] On a parfois cherché des préfigurations de l'anarchisme dans des traditions anciennes, du taoïsme attribué à Lao-tseu au VIe siècle avant notre ère à certaines communautés religieuses égalitaires comme les Esséniens ou des courants anabaptistes. Guérin met en garde contre cette quête de précurseurs, qui s'attache selon lui à des « ressemblances superficielles »<ref>Guérin, ''L'anarchisme'', avant-propos.</ref>. Pelletier déplace la question du terrain doctrinal vers celui de l'anthropologie : à la suite de Pierre Clastres, Harold Barclay et David Graeber, il décrit des sociétés sans pouvoir politique coercitif, qu'il qualifie d'« anarchisantes » tout en les disant « très imparfaites », la guerre et certaines croyances mystiques y introduisant des formes d'autorité et d'aliénation<ref>Pelletier, ''L'Anarchisme'', « Un anarchisme "primitif" ? ».</ref>. En tant que philosophie articulée, l'anarchisme se forme dans le contexte de la modernité européenne, sur le terrain de la désintégration de l'ordre médiéval, de la phase la plus contestataire de la Réformation et des premières formes d'organisation politique et économique moderne<ref>Fiala, Andrew, "Anarchism", in ''The Stanford Encyclopedia of Philosophy'', Edward N. Zalta (éd.), Stanford University, 2017.</ref><ref>Woodcock, George, ''Anarchism: A History of Libertarian Ideas and Movements'', Peterborough, Broadview Press, 2004 (édition originale 1962), p. 28-35.</ref>. Le premier auteur chez qui George Woodcock reconnaît les éléments d'une doctrine anarcho-communiste est Gerrard Winstanley, un négociant en tissus qui dirigea le petit mouvement des Diggers durant le Commonwealth anglais<ref>Woodcock, ''Anarchism'', 2004, p. 39-42.</ref>. Dans ses pamphlets de 1649 et 1650, notamment ''The New Law of Righteousnes'' (1649), Winstanley articulait une vision égalitaire fondée sur un christianisme rationnel : il identifiait le Christ à la liberté universelle et affirmait le caractère universellement corrupteur de l'autorité<ref>Winstanley, Gerrard, ''The New Law of Righteousnes'' [orthographe de l'édition originale de 1649], Londres, 1649, reproduit dans ''The Works of Gerrard Winstanley'', George H. Sabine (éd.), Ithaca, Cornell University Press, 1941, p. 149-200.</ref>. Il percevait un lien intime entre l'institution de la propriété et l'absence de liberté, et proposait une société où le travail serait effectué en commun et les produits partagés par un système d'entrepôts ouverts, sans commerce. Woodcock note toutefois que le dernier écrit de Winstanley, ''The Law of Freedom'' (1652) adressé à Cromwell, comporte des éléments autoritaires, dont le travail obligatoire et la peine de mort pour certains délits contre la collectivité, ce qui interdit d'en faire sans réserve un système anarchiste achevé<ref>Woodcock, ''L'Anarchisme. Une histoire des idées et mouvements libertaires'', Montréal, Lux, 2019, chapitre « L'arbre généalogique ».</ref>. C'est William Godwin qui, avec son ''Enquête sur la justice politique et son influence sur la vertu générale et le bonheur'' (''An Enquiry Concerning Political Justice, and its Influence on General Virtue and Happiness'') publié en 1793, fournit la première défense systématique de l'anarchisme, même si le terme lui-même n'était pas encore employé<ref>Godwin, William, ''An Enquiry Concerning Political Justice, and its Influence on General Virtue and Happiness'', Londres, G.G.J. et J. Robinson, 1793, 2 volumes.</ref><ref>Philp, Mark, ''Godwin's Political Justice'', Londres, Duckworth, 1986, p. 1-25.</ref>. Godwin, influencé par la dissidence protestante anglaise et la philosophie française des Lumières, développa les critiques anarchistes de l'État, de la propriété accumulée et de la délégation d'autorité à travers les procédures démocratiques. Il croyait en une moralité fixe, se manifestant par la bienveillance universelle, et soutenait que les individus devaient agir selon leur propre raison plutôt qu'en obéissance à l'autorité d'institutions positives, lesquelles constituent toujours des obstacles au progrès éclairé<ref>Godwin, ''Political Justice'', vol. 1, livre II, chapitre 6, p. 234-248.</ref>. C'est avec Pierre-Joseph Proudhon qu'apparaît le terme d'anarchisme comme désignation positive d'une philosophie<ref>Proudhon, Pierre-Joseph, ''Qu'est-ce que la propriété ? ou Recherche sur le principe du Droit et du Gouvernement'', Paris, J.-F. Brocard, 1840, p. 286.</ref>. En 1840, dans ''Qu'est-ce que la propriété ?'', Proudhon se décrivit lui-même comme anarchiste, considérant que l'organisation politique fondée sur l'autorité devait être remplacée par une organisation sociale et économique fondée sur l'accord contractuel volontaire. Avec cette formulation, un mot jusque-là péjoratif, synonyme de désordre, devient l'étiquette revendiquée d'une tradition cohérente. Pelletier rappelle que Proudhon emploie le mot ''anarchie'' dans un sens constructif dès les années 1840, et qu'il sera repris par dérision, à la manière des Gueux, par les socialistes « anti-autoritaires » des années 1880 que leurs adversaires marxistes et républicains désignaient ainsi<ref>Pelletier, ''L'Anarchisme'', « L'anarchie, c'est le chaos ».</ref>. == Diversité des courants anarchistes == L'anarchisme ne constitue pas un corpus doctrinal unifié, mais une constellation de positions partageant certaines ressemblances de famille<ref>Jun, Nathan J., ''Anarchism and Political Modernity'', New York, Continuum, 2012, p. 15-40.</ref>. Ses variantes s'étendent de l'individualisme de Max Stirner à l'anarcho-communisme de Pierre Kropotkine, en passant par le mutuellisme de Proudhon, le collectivisme de Michel Bakounine et l'anarcho-syndicalisme. Guérin souligne cependant que cette diversité recouvre un ensemble de conceptions relativement homogènes : la formule de Bakounine définissant l'anarchisme comme « le proudhonisme largement développé et poussé jusqu'à ses extrêmes conséquences » vaut, à ses yeux, pour l'essentiel du courant social<ref>Guérin, ''L'anarchisme'', avant-propos.</ref>. === L'anarchisme individualiste === [[Fichier:Max Stirner-k.jpg|vignette|Max Stirner (1806-1856), tel que l'a croqué de mémoire Friedrich Engels. Son livre ''L'Unique et sa propriété'' (1844) passe pour l'acte de naissance de l'anarchisme individualiste.]] Max Stirner, de son vrai nom Johann Kaspar Schmidt (1806-1856), représente la tendance la plus individualiste de la pensée anarchiste<ref>Stirner, Max, ''Der Einzige und sein Eigentum'', Leipzig, Otto Wigand, 1844 ; traduction française ''L'Unique et sa propriété'', Paris, Stock, 1900.</ref>. Son ouvrage ''L'Unique et sa propriété'' (''Der Einzige und sein Eigentum'', 1844), tenu pour un texte fondateur de l'anarchisme individualiste, défend une position où la liberté de l'individu est souveraine et où toute entrave à cette liberté est injustifiable. Stirner attaque non seulement l'État, le gouvernement, le droit et la propriété privée, mais aussi la religion, la famille, l'éthique et l'amour, toutes institutions qui imposent des limites à l'action individuelle<ref>Paterson, Ronald William Keith, ''The Nihilistic Egoist: Max Stirner'', Oxford, Oxford University Press, 1971, p. 97-135.</ref>. Pour lui, l'État, la propriété comme droit, les droits naturels et l'idée même de société sont des illusions, des « fantômes » (''Spuke'') dans l'esprit<ref>Stirner, ''L'Unique et sa propriété'', p. 43-67.</ref>. La propriété, écrit-il, résulte de la force : « Je ne recule pas timidement devant ta propriété, mais je la considère toujours comme ma propriété »<ref>Stirner, ''Der Einzige und sein Eigentum'', p. 251.</ref>. Cette philosophie, parfois qualifiée d'égoïsme, soutient que l'individu n'a pas à se dévouer à « une grande idée, une bonne cause, une doctrine, un système, une vocation élevée », mais qu'il « vit sa propre vie » sans égard à « comment l'humanité peut s'en tirer »<ref>Stirner, ''L'Unique et sa propriété'', p. 5-12.</ref>. Stirner préconisait l'auto-affirmation et envisageait l'Union des égoïstes (''Verein von Egoisten''), association non systématique destinée à remplacer l'État, comprise comme une relation continuellement renouvelée par le soutien volontaire de toutes les parties<ref>Clark, John P., ''Max Stirner's Egoism'', Londres, Freedom Press, 1976, p. 71-89.</ref>. Guérin relativise l'opposition entre cet individualisme et l'anarchisme social, observant que « l'anarchiste individualiste pourrait bien être un sociétaire qui n'ose pas dire son nom »<ref>Guérin, ''L'anarchisme'', avant-propos.</ref>. === Le mutuellisme proudhonien === [[Fichier:Portrait Pierre-Joseph Proudhon by Nadar – BNF(cropped).jpg|vignette|gauche|redresse|Pierre-Joseph Proudhon (1809-1865), photographié par Nadar. En 1840, il revendique le premier le mot « anarchie » dans un sens positif.]] Le mutuellisme, développé par Pierre-Joseph Proudhon (1809-1865), se distingue de l'anarchisme individualiste par son insistance sur la dimension sociale du comportement humain<ref>Vincent, K. Steven, ''Pierre-Joseph Proudhon and the Rise of French Republican Socialism'', Oxford, Oxford University Press, 1984, p. 145-178.</ref>. Proudhon rejetait l'action politique et la violence révolutionnaire, certains de ses disciples s'opposant même aux grèves comme forme de coercition, en faveur d'une réforme de la société par la propagation pacifique d'associations ouvrières consacrées notamment au crédit mutuel entre producteurs<ref>Proudhon, Pierre-Joseph, ''De la capacité politique des classes ouvrières'', Paris, E. Dentu, 1865, p. 89-124.</ref>. Un projet mutuelliste récurrent, jamais réalisé, était celui d'une banque populaire organisant l'échange de marchandises sur la base de bons de travail. Proudhon établit une distinction entre la possession et la propriété : la possession a une valeur d'usage directe pour celui qui en dispose, tandis que la propriété est entendue comme propriété productive<ref>Proudhon, ''Qu'est-ce que la propriété ?'', p. 1-45.</ref>. Contrairement aux défenseurs de la propriété capitaliste, il insistait sur l'égalité et soutenait que tous les travailleurs devraient posséder une part de la propriété et accéder au capital, écrivant que « chaque travailleur employé dans l'association doit avoir une part indivise de la propriété de la compagnie »<ref>Proudhon, Pierre-Joseph, ''Théorie de la propriété'', Paris, Lacroix et Verboeckhoven, 1866, p. 137.</ref>. Il considérait que « la propriété privée de privilège a appelé et commandé l'État », et qu'elle n'était maintenue que par ses lois, sa police et son armée. Les mutuellistes mettaient l'accent sur l'organisation fédéraliste, de la commune locale vers les échelons supérieurs, comme substitut à l'État national<ref>Proudhon, Pierre-Joseph, ''Du Principe fédératif et de la nécessité de reconstituer le parti de la révolution'', Paris, E. Dentu, 1863, p. 55-91.</ref>. Il convient toutefois de ne pas réduire le projet proudhonien au maintien de la petite propriété artisanale et paysanne. Guérin montre que la pensée économique de Proudhon est ambivalente : pour la grande industrie, il était délibérément collectiviste, écrivant que « la grande industrie et la grande culture, il faut à l'avenir les faire naître de l'association », et s'indignant qu'on le tînt pour un adversaire du progrès technique<ref>Guérin, ''L'anarchisme'', chapitre « L'autogestion ».</ref>. Guérin rappelle aussi que la « coterie soi-disant proudhonienne » formée autour du Proudhon des dernières années, qui tenta dans la Première Internationale d'opposer la propriété privée des moyens de production au collectivisme, était « mort-née », la plupart de ses membres se ralliant aux arguments de Bakounine<ref>Guérin, ''L'anarchisme'', chapitre « L'autogestion ».</ref>. === Le collectivisme bakouninien === [[Fichier:Mikhail Bakunin 1862 - Nadar (cropped).jpg|vignette|redresse|Michel Bakounine (1814-1876), photographié par Nadar en 1862. Théoricien du collectivisme, il anime l'opposition libertaire au marxisme au sein de la Première Internationale.]] Le collectivisme est la forme d'anarchisme associée à Michel Bakounine (1814-1876)<ref>Bakunin, Michel, ''Œuvres complètes'', édition établie par Arthur Lehning, 8 volumes, Paris, Champ libre, 1973-1982.</ref>. Cette philosophie fut développée par Bakounine à partir de 1864, lorsqu'il forma ses premières organisations internationales, la Fraternité internationale puis l'Alliance internationale de la démocratie socialiste (1868). C'est l'anarchisme collectiviste qui forma la principale opposition au marxisme dans l'Association internationale des travailleurs, ouvrant la rivalité historique entre les conceptions libertaires et autoritaires du socialisme<ref>Carr, E. H., ''Michael Bakunin'', Londres, Macmillan, 1937, p. 345-412.</ref>. Bakounine et les collectivistes s'accordaient avec les mutuellistes sur le rejet de l'État et des méthodes politiques, sur le fédéralisme et sur la rétribution du travailleur selon son travail. Ils en différaient en insistant sur la nécessité de moyens révolutionnaires pour abattre l'État, et surtout en préconisant la propriété publique de la terre et des moyens de production, gérés par des associations ouvrières. Alors que dans le mutuellisme l'unité de base était le travailleur individuel, dans le collectivisme c'était le groupe de travailleurs<ref>Bakunin, Michel, ''Étatisme et anarchie'', édition française établie par Renée Lamberet, Paris, Champ libre, 1976, p. 289-345.</ref>. Bakounine rejeta l'individualisme et soutint que l'anarchisme était une doctrine sociale, fondée sur l'acceptation de responsabilités collectives. Ses écrits expriment une hostilité envers l'État et envers « l'organisation politique elle-même en tant que source d'oppression et d'exploitation »<ref>Bakunin, Michel, ''Dieu et l'État'', Genève, 1882 ; réédition Paris, Maspero, 1976, p. 29-67.</ref>. Ses solutions révolutionnaires visent le démantèlement de l'État et des institutions hiérarchiques, à remplacer par un système de communes librement fédérées, organisées du bas vers le haut, avec des associations volontaires de producteurs s'étendant du local à l'international. Sa pensée politique concerne des communautés émancipatrices où les membres développent leurs capacités sans se dominer les uns les autres<ref>Saltman, Richard B., ''The Social and Political Thought of Michael Bakunin'', Westport, Greenwood Press, 1983, p. 102-134.</ref>. Pour lui, la liberté exigeait la communauté, de sorte que nul n'est libre si tous ne le sont, ainsi que l'égalité, y compris dans les droits et les fonctions sociales pour les femmes. === L'anarcho-communisme kropotkinien === [[Fichier:Peter Kropotkin circa 1900(cropped).png|vignette|gauche|redresse|Pierre Kropotkine (1842-1921), géographe et théoricien de l'anarcho-communisme. Dans ''L'Entraide'' (1902), il fait de la coopération un facteur de l'évolution.]] Ailleurs remplacé durant les années 1870 par l'anarcho-communisme, associé surtout à Pierre Kropotkine (1842-1921)<ref>Kropotkin, Pierre, ''La Conquête du pain'', Paris, Tresse et Stock, 1892 ; réédition Paris, Éditions du Sextant, 2006.</ref>, le collectivisme conserva en Espagne une influence plus durable qu'ailleurs, avant d'y être recouvert dans les années 1930 par l'anarcho-syndicalisme de la CNT et par le communisme libertaire<ref>Woodcock, ''L'Anarchisme'' (Lux, 2019), chapitre « L'anarchisme en Espagne ».</ref>. Kropotkine fut sans doute l'exposant le plus articulé d'une tendance issue des discussions entre intellectuels anarchistes à Genève après la Commune de Paris de 1871. Dans ''La Conquête du pain'' (1892) et ''Champs, usines et ateliers'' (''Fields, Factories and Workshops'', 1899), il élabora le schéma d'une société décentralisée fondée sur l'intégration de l'agriculture et de l'industrie, de la vie urbaine et de la vie rurale, de l'éducation et de l'apprentissage<ref>Kropotkin, Pierre, ''Fields, Factories and Workshops'', Londres, Thomas Nelson and Sons, 1899 ; traduction française ''Champs, usines et ateliers'', Paris, Stock, 1910.</ref>. Kropotkine lia ses théories aux thèses évolutionnistes : l'anarchisme, suggérait-il dans ''L'Entraide'' (''Mutual Aid: A Factor of Evolution'', 1902), était le stade final du développement de la coopération comme facteur d'évolution<ref>Kropotkin, Pierre, ''Mutual Aid: A Factor of Evolution'', Londres, William Heinemann, 1902 ; traduction française ''L'Entraide, un facteur de l'évolution'', Paris, Hachette, 1906.</ref>. L'anarcho-communisme différait du collectivisme sur un point : le partage du produit du travail. À l'idée d'une rémunération selon les heures travaillées, les anarcho-communistes opposaient le mot d'ordre « De chacun selon ses moyens, à chacun selon ses besoins » et envisageaient des entrepôts ouverts où chacun prendrait ce dont il a besoin. Ils raisonnaient que le travail était un besoin naturel et que, sans restriction sur les biens disponibles, nul ne serait tenté de prendre plus qu'il ne peut utiliser<ref>Kropotkin, ''La Conquête du pain'', chapitre 5, p. 71-89.</ref>. Kropotkine insistait sur les aspects mutualistes et coopératifs des communautés animales et humaines, soutenant que l'entraide, et non la seule compétition, est un facteur du changement évolutif, point ultérieurement repris par de nombreux biologistes<ref>Todes, Daniel P., ''Darwin without Malthus: The Struggle for Existence in Russian Evolutionary Thought'', Oxford, Oxford University Press, 1989, p. 123-145.</ref>. Il chercha à fonder l'éthique sur l'observation de la nature<ref>Kropotkin, Pierre, ''L'Éthique'', ouvrage posthume publié en 1922 ; traduction française Paris, Stock, 1979, p. 34-78.</ref>. En critiquant le capitalisme et l'État, en proposant la commune médiévale comme exemple et en mobilisant la biologie et l'éthologie pour l'analyse sociale, il unit des orientations évolutionnistes et révolutionnaires dans une vision du monde où la dimension écologique occupe une place centrale. === L'anarcho-syndicalisme === [[Fichier:Fernand Pelloutier-portrait.jpg|vignette|redresse|Fernand Pelloutier (1867-1901), animateur des Bourses du travail et l'une des figures de l'anarcho-syndicalisme français à ses débuts.]] L'anarcho-syndicalisme se développa à la fin des années 1880, lorsque de nombreux anarchistes entrèrent dans les syndicats français qui réémergeaient après la suppression consécutive à la Commune de Paris<ref>Julliard, Jacques, ''Fernand Pelloutier et les origines du syndicalisme d'action directe'', Paris, Éditions du Seuil, 1971, p. 87-134.</ref>. Des militants anarchistes occupèrent ensuite des postes clés dans la Confédération générale du travail, fondée en 1895, et déplacèrent la base de l'anarchisme vers les syndicats, vus comme des organisations unissant les producteurs dans une lutte commune et dans un travail commun. Cette lutte devait prendre la forme de l'action directe, principalement dans l'industrie ; sa forme la plus élevée, la grève générale, pourrait paralyser le capitalisme et l'État<ref>Pouget, Émile, ''Le Sabotage'', Paris, Marcel Rivière, 1910, p. 17-45.</ref>. Les syndicats, organes de révolte, deviendraient alors les unités de base de la société libre : les travailleurs prendraient le contrôle des usines et se fédéreraient par industries. L'anarcho-syndicalisme place ainsi les syndicats au centre du conflit de classe<ref>van der Linden, Marcel et Wayne Thorpe (éds.), ''Revolutionary Syndicalism: An International Perspective'', Aldershot, Scolar Press, 1990, p. 1-24.</ref>. Il les conçoit comme un moyen d'obtenir des améliorations immédiates et de préparer une révolution sociale prenant la forme d'une grève générale, dans le but d'abolir l'État et le capitalisme. Idéologie anti-parlementaire, il rejette les partis politiques et pratique l'action directe sous forme de grèves, de boycotts et de sabotage. Les organisations fédérales sont construites du bas vers le haut, sur une base à la fois territoriale et industrielle : les syndicats locaux se combinent en cartels, lesquels se regroupent à l'échelle régionale puis nationale, chaque syndicat étant aussi lié aux syndicats des métiers connexes au sein d'unions industrielles<ref>Rocker, Rudolf, ''Anarcho-Syndicalism: Theory and Practice'', Oakland, AK Press, 2004 (édition originale 1938), p. 54-82.</ref>. En France, en Italie et en Espagne, ce fut la variante syndicaliste qui donna à l'anarchisme son seul soutien de masse. Ses principaux artisans furent des militants tels que Fernand Pelloutier, Georges Yvetot et Émile Pouget. Des intellectuels extérieurs au mouvement en tirèrent des conclusions théoriques, tel Georges Sorel, dont les ''Réflexions sur la violence'' (1908) voient dans la grève générale un mythe social. Sa trajectoire ultérieure, hétérodoxe, et le fait que Russell le présente d'abord comme un critique de Marx invitent à ne pas en faire la figure centrale du courant<ref>Russell, Bertrand, ''Le monde qui pourrait être. Socialisme, anarchisme et anarcho-syndicalisme'', Montréal, Lux, 2025, première partie, « La révolte anarcho-syndicaliste ».</ref>. === Une typologie wébérienne === La classification en trois courants, individualisme, communisme libertaire et anarcho-syndicalisme, demeure commode pour l'exposé historique, mais l'historien Gaetano Manfredonia la juge insuffisante. Reprenant la méthode des types idéaux de Max Weber, qui accentue certains traits pour construire des catégories absentes comme telles de la réalité empirique, il distingue trois types : l'insurrectionnalisme, le syndicalisme et l'éducationnisme-réalisateur. Chez un même individu, un groupe ou une organisation, ces orientations se confondent ou se succèdent<ref>Pelletier, ''L'Anarchisme'', « Une nouvelle typologie de l'anarchisme ».</ref>. Cette lecture présente l'avantage de saisir des dynamiques que la classification doctrinale fige en écoles séparées. == Fondements philosophiques et critique de l'autorité == La critique anarchiste ne porte pas sur l'autorité en tout sens. Dans sa polémique avec les individualistes, Malatesta écrit qu'il accepte volontiers « l'autorité du conducteur de train » lorsqu'il voyage, et l'anarchisme reconnaît les compétences sans leur conférer de valeur hiérarchique : un hôpital a besoin de chirurgiens comme d'agents d'entretien<ref>Pelletier, ''L'Anarchisme'', « L'anarchie, c'est le chaos ».</ref>. En matière d'éducation, Bakounine formule le principe d'un mouvement allant « du maximum d'autorité au maximum de liberté », l'autorité s'imposant à qui n'a pas encore les moyens du discernement, puis cédant la place à la liberté<ref>Bakounine, ''Dieu et l'État'' ; cité par Pelletier, ''L'Anarchisme'', « L'anarchie, c'est le chaos ».</ref>. Ce que l'anarchisme combat est l'autorité non consentie et dominatrice, et la hiérarchie qui en découle. Malgré leurs différences, toutes ces formes d'anarchisme se rejoignent dans le rejet de l'État, de la politique partisane et de la propriété accumulée, mais aussi dans des attitudes plus diffuses<ref>Marshall, Peter, ''Demanding the Impossible: A History of Anarchism'', Londres, Fontana Press, 1993, p. 3-19.</ref>. En évitant l'organisation partisane, l'anarchisme conserva un élément moral plus marqué que d'autres mouvements de protestation. Cet aspect se manifeste dans le goût de ses tenants pour la simplification de la vie, comprise non seulement comme suppression des complications de l'autorité, mais aussi comme refus des périls de la richesse et établissement d'une suffisance frugale. Le rapport de l'anarchisme au progrès donne lieu à des lectures divergentes qu'il convient de signaler. Woodcock observe que l'accroissement continu des biens matériels n'a jamais séduit les anarchistes et qu'ils rejettent le présent au nom d'un futur de liberté sobre, ressuscitant les vertus d'un passé plus proche de la nature, une société qui, écrit-il, « rejette l'utopie » et ne connaît ni absolus ni perfections. Guérin nuance cette image : selon lui, l'anarchisme se veut constructif, refuse l'accusation d'utopie et recourt à la méthode historique pour montrer que la société future est le produit d'un travail souterrain du passé, et non une invention de doctrinaire<ref>Guérin, ''L'anarchisme'', chapitre « L'anarchisme n'est pas utopique ».</ref>. La principale différence entre les anarchistes et les socialistes, marxistes compris, tient à ce que, pour ces derniers, l'État doit être pris en main comme première étape vers sa dissolution, alors que les anarchistes soutiennent que, le pouvoir corrompant, toute prise de la structure d'autorité existante ne peut que la perpétuer<ref>Guérin, Daniel, ''Anarchism: From Theory to Practice'', New York, Monthly Review Press, 1970, p. 13-43.</ref>. Les anarcho-syndicalistes considèrent toutefois leurs syndicats comme l'ossature d'une société nouvelle croissant au sein de l'ancienne. Les anarchistes ont produit des arguments niant toute obligation générale d'obéir à l'État et soulignant les effets du pouvoir étatique<ref>Wolff, Robert Paul, ''In Defense of Anarchism'', New York, Harper & Row, 1970, p. 3-27.</ref>. Plus discutées sont leurs thèses selon lesquelles l'État devrait être aboli, l'ordre social possible sans lui et une transition vers l'anarchie réaliste<ref>McLaughlin, Paul, ''Anarchism and Authority: A Philosophical Introduction to Classical Anarchism'', Aldershot, Ashgate, 2007, p. 45-78.</ref>. Selon eux, la charge de la preuve incombe à qui prétend gouverner et contrôler autrui : l'autorité doit démontrer qu'elle agit dans l'intérêt de ceux qu'elle gouverne, faute de quoi son exercice est illégitime. == L'organisation sans l'État : autogestion et fédéralisme == Les théoriciens du courant social distinguent l'anarchie du désordre. Proudhon soutient que l'anarchie n'est pas le désordre, mais l'ordre naturel par opposition à l'ordre artificiel imposé d'en haut, la « société organisée, vivante »<ref>Guérin, ''L'anarchisme'', chapitre « Nécessité de l'organisation ».</ref>. Voline précise qu'il ne s'agit pas d'« organisation » ou de « non-organisation », mais de deux principes d'organisation distincts, l'un partant de la base et se nouant en centres de coordination, l'autre calqué sur la vieille société d'oppression. Malatesta rappelle à l'ordre les anarchistes hostiles à toute organisation, observant que renoncer à s'organiser pour ne pas accepter la moindre autorité reviendrait à préférer une désorganisation qui rend la vie impossible<ref>Guérin, ''L'anarchisme'', chapitre « Nécessité de l'organisation ».</ref>. L'autogestion constitue, selon Guérin, la création la plus originale de l'anarchisme<ref>Guérin, ''L'anarchisme'', avant-propos et chapitre « L'autogestion ».</ref>. Alors que le ''Manifeste communiste'' n'entrevoyait, pour une longue période, que la centralisation des instruments de production entre les mains de l'État, Proudhon proposa une conception antiétatique de la gestion économique. Devant la floraison spontanée d'associations ouvrières de production lors de la révolution de février 1848, il vit dans cette autogestion naissante, plus que dans la révolution politique, le fait révolutionnaire, et pressa les travailleurs de s'organiser pour devenir maîtres de la production. Les instruments de production et d'échange ne devraient être gérés ni par des compagnies capitalistes ni par l'État, mais par des associations ouvrières, seule manière, selon Proudhon, de mettre fin à l'aliénation des forces collectives<ref>Guérin, ''L'anarchisme'', chapitre « L'autogestion ».</ref>. La démocratie directe du projet anarchiste repose sur le fédéralisme libertaire. Pelletier note que les anarchistes lui préfèrent parfois le terme de « gestion directe », pour se distinguer de l'expérience yougoslave conduite dans un cadre étatique et sans libertés publiques : chaque unité économique, chaque service public, chaque association se gère elle-même, l'égoïsme possible des unités étant contrebalancé par leur intégration horizontale dans la commune et la région<ref>Pelletier, ''L'Anarchisme'', « L'anarchisme est contre la démocratie ».</ref>. Le fédéralisme procède ainsi de la logique proudhonienne du contrat libre, synallagmatique et commutatif, et l'anarchisme se conçoit, selon Pelletier, comme un mode de gestion des antagonismes fondé sur l'équilibre des forces<ref>Pelletier, ''L'Anarchisme'', « L'anarchie, c'est le chaos » ; Proudhon, ''Du Principe fédératif''.</ref>. [[Fichier:Barcelone 19 juillet 1936.jpg|vignette|gauche|Barcelone, juillet 1936. L'échec du soulèvement militaire en Catalogne ouvre une période de collectivisations, dont celles, fédérées par cantons, des collectivités agraires d'Aragon.]] La révolution espagnole offrit à cette conception une mise à l'épreuve. En Aragon, après l'échec du putsch franquiste en Catalogne en juillet 1936, des collectivités agricoles se constituèrent et se fédérèrent par cantons puis dans un comité régional gérant un fonds d'échanges. Selon les sources libertaires et certains historiens, la production y fut maintenue ou accrue et la liberté laissée aux paysans qui ne souhaitaient pas s'y joindre, mais l'expérience reste débattue, inégale selon les lieux et traversée par des contraintes locales et par le contexte militaire<ref>Pelletier, ''L'Anarchisme'', « Gestion directe et collectivisation en Espagne » ; Préposiet, Jean, ''Histoire de l'anarchisme'', Paris, Tallandier, 2002, « L'Espagne et le collectivisme libertaire » ; sur les collectivités, Peirats, José, ''La CNT dans la Révolution espagnole'', Paris, Spartacus, 1975.</ref>. Ces collectivités furent en partie détruites en août 1937 par une colonne envoyée par les communistes espagnols, puis disparurent avec la victoire franquiste de 1939. == Anarchisme écologique et dimensions contemporaines == L'anarchisme a joué un rôle dans la formation de la pensée environnementale moderne<ref>Jourdain, Edouard, ''Géopolitique de l'anarchisme. Vers un nouveau moment libertaire'', Paris, Le Cavalier Bleu, 2023, « Lutter contre le capitalisme pour préserver le monde : anarchisme et écologie » ; Purchase, Graham, ''Anarchism and Environmental Survival'', Tucson, See Sharp Press, 1994.</ref>. L'anarchisme écologique établit un lien entre la domination exercée sur le monde naturel et la domination sociale des humains les uns par les autres ; il conteste les formes institutionnelles et réformistes de l'environnementalisme, jugées trop étroitement centrées sur l'humain, et envisage une relation harmonieuse entre les humains et la nature, favorisée par des techniques non polluantes et des pratiques à échelle humaine. === Une généalogie libertaire de l'écologie === [[Fichier:Élisée Reclus, by Nadar.jpg|vignette|redresse|Élisée Reclus (1830-1905), géographe libertaire. Sa « mésologie », étude des milieux, en fait un précurseur d'une écologie d'inspiration anarchiste.]] À côté de Thoreau et avant Bookchin, la tradition anarchiste possède aussi une généalogie écologique propre, notamment francophone. Élisée Reclus, géographe libertaire, développa la notion de « mésologie » comme étude des milieux où interagissent une multitude de sujets, dont la société<ref>Sur Reclus, voir Ferretti, Federico, ''Élisée Reclus, pour une géographie nouvelle'', Paris, Éditions du CTHS, 2014 ; Vincent, Jean-Didier, ''Élisée Reclus. Géographe, anarchiste, écologiste'', Paris, Robert Laffont, 2010.</ref>. Il tenait l'homme pour un élément d'un tout équilibré, écrivant que « l'homme est la nature prenant conscience d'elle-même »<ref>Reclus, Élisée, ''L'Homme et la Terre'', Paris, Librairie universelle, 1905.</ref>, et il déduisait de l'observation de cet équilibre que le capitalisme et le productivisme sont dommageables à la fois à la nature et à l'homme. Kropotkine, scientifique de formation, voyait pour sa part dans la nature un exemple pour la morale humaine : contre les darwinistes sociaux, il soutenait que c'est par la coopération que l'adaptation aux milieux est rendue possible<ref>Kropotkin, ''Mutual Aid''.</ref>. Ces analyses inspirèrent les urbanistes Ebenezer Howard et Patrick Geddes, dont les cités-jardins, intégrant le meilleur de la ville et de la campagne, devaient s'associer en confédérations<ref>Jourdain, ''Géopolitique de l'anarchisme'', « Lutter contre le capitalisme pour préserver le monde ».</ref>. Cette sensibilité s'incarna aussi dans des pratiques : le courant naturien, apparu à Paris en 1894, et des colonies rurales comme le milieu libre de Vaux (1902-1905) tentèrent une vie « dans la nature » que Serge Latouche rapproche du mouvement pour la décroissance<ref>Jourdain, ''Géopolitique de l'anarchisme'', « Lutter contre le capitalisme pour préserver le monde ».</ref>. === Écologie sociale et primitivisme === [[Fichier:Benjamin D. Maxham - Henry David Thoreau - Restored.jpg|vignette|gauche|redresse|Henry David Thoreau (1817-1862) en 1856. Sa vie « dans les bois » à Walden et son éloge de la désobéissance civile nourrissent la sensibilité libertaire et écologique.]] Henry David Thoreau (1817-1862), écrivain, naturaliste et transcendantaliste américain, exerça une influence durable sur la pensée environnementale<ref>Thoreau, Henry David, "La Désobéissance civile" (1849), in ''Désobéir'', Paris, Mille et Une Nuits, 1994, p. 7-35.</ref>. Sceptique à l'égard du gouvernement, surtout dans la mesure où celui-ci imposait l'esclavage et menait la guerre, il écrivait : « J'accepte de tout cœur la devise : "Ce gouvernement est le meilleur qui gouverne le moins" », ajoutant qu'il croyait aussi que « ce gouvernement est le meilleur qui ne gouverne pas du tout »<ref>Thoreau, Henry David, "Resistance to Civil Government", in ''Aesthetic Papers'', Boston, 1849, p. 189.</ref>. À Walden Pond, il trouva dans le monde naturel l'inspiration d'une éthique faite de compassion pour les animaux, de respect du sauvage, d'attachement au lieu et de vie simple et autosuffisante<ref>Thoreau, Henry David, ''Walden; or, Life in the Woods'', Boston, Ticknor and Fields, 1854, p. 1-23.</ref>. Plutôt qu'un anarchiste au sens strict, il représente une racine américaine de la pensée libertaire et écologique. [[Fichier:Murray Bookchin (cropped).jpg|vignette|redresse|Murray Bookchin (1921-2006), théoricien de l'écologie sociale, pour qui les désordres écologiques s'enracinent dans les hiérarchies sociales.]] Murray Bookchin (1921-2006), influencé par Kropotkine, maria la philosophie anarchiste aux préoccupations environnementales en développant l'écologie sociale<ref>Bookchin, Murray, ''The Ecology of Freedom: The Emergence and Dissolution of Hierarchy'', Palo Alto, Cheshire Books, 1982, p. 1-43.</ref>. Il soutenait que les problèmes écologiques prennent leur origine dans la sphère sociale, et en particulier dans les systèmes politiques hiérarchiques<ref>Bookchin, Murray, "Ecology and Revolutionary Thought" (1965), in ''Post-Scarcity Anarchism'', Berkeley, Ramparts Press, 1971, p. 57-82.</ref>. Le problème, selon lui, n'est pas la ville en elle-même, mais l'urbanisation capitaliste, qui entraîne une surexploitation conjointe de la nature et de l'homme ; à la domination, y compris sur la nature, il opposait une coopération de communautés organisées par le municipalisme libertaire<ref>Jourdain, ''Géopolitique de l'anarchisme'', « Lutter contre le capitalisme pour préserver le monde ».</ref>. Vers la fin de sa vie, Bookchin se montra critique de l'anarchisme et se décrivit comme communaliste<ref>Bookchin, Murray, ''Social Anarchism or Lifestyle Anarchism: An Unbridgeable Chasm'', Oakland, AK Press, 1995, p. 1-35.</ref>. D'autres auteurs américains s'inscrivent dans cette tradition, dont l'historien Lewis Mumford, le poète Gary Snyder, le théoricien John Clark, qui insiste sur un imaginaire de la région, l'écrivain Edward Abbey et le critique de la technique David Watson<ref>Clark, John P., ''The Anarchist Moment: Reflections on Culture, Nature and Power'', Montréal, Black Rose Books, 1984, p. 123-156.</ref>. L'anarcho-primitivisme constitue une variante plus contestée. Il oppose une critique écologique et politique aux origines mêmes de la civilisation, dont il dénonce les effets supposés : technologie, agriculture, domestication, croissance démographique, division du travail<ref>Zerzan, John, ''Elements of Refusal'', Seattle, Left Bank Books, 1988, p. 67-94.</ref>. John Zerzan fait remonter cette rupture à l'avènement du langage symbolique, des nombres et de l'agriculture, et soutient que l'on ne peut échapper à l'aliénation que par la multiplication de petits groupes affinitaires<ref>Zerzan, John, "Language: Origin and Meaning", in ''Future Primitive and Other Essays'', Brooklyn, Autonomedia, 1994, p. 23-51.</ref>. Jourdain observe que ce courant, oscillant entre le mythe du bon sauvage et des thèmes apocalyptiques, est loin de faire l'unanimité dans le mouvement<ref>Jourdain, ''Géopolitique de l'anarchisme'', « Lutter contre le capitalisme pour préserver le monde ».</ref>. Une question voisine traverse la collapsologie, courant des années 2010 dont l'un des promoteurs, Pablo Servigne, est proche du mouvement anarchiste, et qui postule l'effondrement prochain de la civilisation industrielle<ref>Servigne, Pablo et Raphaël Stevens, ''Comment tout peut s'effondrer. Petit manuel de collapsologie à l'usage des générations présentes'', Paris, Seuil, 2015.</ref>. Cette perspective est critiquée, dans le mouvement anarchiste comme à l'extérieur, pour sa dépolitisation et son déterminisme<ref>Jourdain, ''Géopolitique de l'anarchisme'', « Lutter contre le capitalisme pour préserver le monde » ; Charbonnier, Pierre, « Splendeurs et misères de la collapsologie. Les impensés du survivalisme de gauche », ''Revue du Crieur'', n° 13, 2019, p. 88-95.</ref>. === Communs et biorégionalisme === La réflexion contemporaine sur les communs prolonge cette tradition. Les communs désignent des ressources gérées par une communauté qui se donne des règles pour les préserver, hors de l'État comme du marché ; la clôture des communaux médiévaux par les propriétaires et l'État accompagne, selon cette lecture, la naissance du capitalisme<ref>Jourdain, ''Géopolitique de l'anarchisme'', « Lutter contre le capitalisme pour préserver le monde ».</ref>. Le fonctionnement de ces communs a été documenté par l'économiste Elinor Ostrom<ref>Ostrom, Elinor, ''Governing the Commons: The Evolution of Institutions for Collective Action'', Cambridge, Cambridge University Press, 1990.</ref>, et l'on en trouve des exemples dans les ''acequias'', systèmes de cours d'eau gérés collectivement au Nouveau-Mexique depuis le XVIIe siècle, ou dans le « Parc de la pomme de terre » au Pérou, où des communautés indigènes préservent collectivement des centaines de variétés. Le biorégionalisme, forgé par Peter Berg et développé par Kirkpatrick Sale autour de la notion d'échelle humaine, conçoit la biorégion comme un espace où une population vit en symbiose avec son milieu<ref>Sale, Kirkpatrick, ''Dwellers in the Land: The Bioregional Vision'', San Francisco, Sierra Club Books, 1985.</ref> ; il valorise à ce titre les savoirs des populations autochtones, comme le font les travaux des anthropologues James Scott et David Graeber<ref>Jourdain, ''Géopolitique de l'anarchisme'', « Lutter contre le capitalisme pour préserver le monde ».</ref>. Les critiques de l'anarchisme écologique relèvent son penchant pour des visions idéalisées de la nature et de la nature humaine, son opposition à toute forme d'État centralisé, que certains jugent nécessaire pour traiter les problèmes écologiques à grande échelle, et son recours à des formes d'organisation décentralisées, jugées peu efficaces par ses adversaires. Les éco-anarchistes répondent que l'urgence des crises écologiques appelle des transformations éthiques et sociales de fond, et que la gestion par les communs se révèle souvent plus respectueuse de l'environnement que celle de l'État ou du marché. == Héritages et pertinence contemporaine == L'anarchisme a exercé une influence précoce sur le mouvement environnemental. Par l'ampleur de ses analyses, il met en cause toute sous-estimation de la gravité de la crise environnementale et de l'étendue des mesures qu'elle appelle. Au-delà de ce domaine, l'anarchisme demeure une critique des structures de pouvoir et de domination. Ses thèmes, opposition à l'autoritarisme, autonomie individuelle et collective, coopération volontaire et entraide, continuent d'inspirer des mouvements sociaux. Des Indignés espagnols au mouvement Occupy Wall Street, des protestations étudiantes québécoises de 2012 aux soulèvements ouverts par le Printemps arabe à la fin de 2010, on observe une résurgence de principes anarchistes : auto-organisation, association volontaire, démocratie directe, action collective non hiérarchique<ref>Graeber, David, ''The Democracy Project: A History, a Crisis, a Movement'', New York, Spiegel & Grau, 2013, p. 67-102.</ref>. Jourdain ajoute à ce panorama des expériences territoriales plus durables, des municipalités zapatistes du Chiapas à l'administration autonome du Rojava, où des principes confédéraux et autogestionnaires sont mis en œuvre<ref>Jourdain, ''Géopolitique de l'anarchisme'', « Au cœur des conflits » et conclusion.</ref>. Comme l'observent David Graeber et Andrej Grubačić, le mouvement révolutionnaire mondial au XXIe siècle s'apparente davantage à la tradition de l'anarchisme qu'à celle du marxisme, avec une génération « beaucoup plus intéressée à développer de nouvelles formes de pratique qu'à débattre des points les plus fins de l'idéologie »<ref>Graeber, David et Andrej Grubačić, "Anarchism, or the Revolutionary Movement of the Twenty-first Century", ''ZNet'', 2004.</ref>. L'anarchisme contemporain se caractérise par son rejet du sectarisme et de l'avant-gardisme, par son internationalisme, sa décentralisation et sa démocratie directe. Il met l'accent sur la politique préfigurative, l'idée que les moyens doivent correspondre aux fins et que les formes d'organisation du présent doivent incarner les valeurs de la société visée<ref>Franks, Benjamin, "Prefiguration", in ''The Palgrave Handbook of Anarchism'', Carl Levy et Matthew S. Adams (éds.), Cham, Palgrave Macmillan, 2019, p. 1-17.</ref>. Sa critique de l'autorité politique a en outre nourri des débats sur la légitimité de l'État qui occupent les philosophes politiques contemporains : l'anarchisme philosophique, distinct de l'anarchisme politique, soutient qu'il n'existe pas d'autorité politique légitime, sans pour autant préconiser l'abolition immédiate de l'État<ref>Simmons, A. John, ''Moral Principles and Political Obligations'', Princeton, Princeton University Press, 1979, p. 192-216.</ref>. == Débats et objections == [[Fichier:Russell in 1916.jpg|vignette|gauche|redresse|Bertrand Russell (1872-1970) en 1916. Favorable à l'anarchisme intégral comme but, il le tient pour inapplicable dans l'immédiat et propose le ''guild socialism'' comme compromis.]] Les objections adressées à l'anarchisme ne relèvent pas toutes du rejet caricatural ; certaines, formulées par des auteurs attentifs, appellent des réponses précises. La première porte sur la faisabilité. Bertrand Russell, qui tient l'anarchisme intégral pour l'objectif final souhaitable, le juge néanmoins « pour le moment irréalisable » et estime qu'il « ne survivrait pas au-delà d'un an ou deux à sa mise en application »<ref>Russell, ''Le monde qui pourrait être'', introduction.</ref>. Il craint qu'un anarcho-syndicalisme privé d'État ne doive réédifier une autorité centrale pour arbitrer les rivalités entre groupes de producteurs, et propose comme compromis le ''guild socialism'', qui associe la défiance libertaire envers l'État et l'exigence de coordination par un fédéralisme entre professions<ref>Russell, ''Le monde qui pourrait être'', introduction et deuxième partie.</ref>. Les anarchistes répondent généralement que l'anarchisme n'est pas une utopie sans assise : Guérin écrit qu'il rejette l'accusation d'utopie et se veut constructif, et les collectivisations agraires d'Aragon en 1936-1937 en offrent une réalisation concrète, quoique brève et débattue<ref>Guérin, ''L'anarchisme'', chapitre « L'anarchisme n'est pas utopique » ; Pelletier, ''L'Anarchisme'', « Gestion directe et collectivisation en Espagne ».</ref>. La deuxième objection concerne la nature humaine. Russell observe que le respect de la liberté d'autrui n'est pas un instinct naturel et qu'en l'absence de tout frein le fort opprimerait le faible, la majorité la minorité, ou les partisans de la violence les plus pacifiques<ref>Russell, ''Le monde qui pourrait être'', chapitre « Gouvernement et lois ».</ref>. Il en conclut qu'une forme limitée de gouvernement et de législation demeure nécessaire, tout en restant un mal que l'on doit réduire autant que possible. La romancière Ursula Le Guin met en scène une difficulté voisine dans ''Les Dépossédés'' (1974) : sur une planète anarchiste, l'absence de lois se paie d'une conformité sociale qui érode la sphère privée. Jourdain en tire que la plupart des anarchistes admettent le caractère inévitable des règles et des pouvoirs, l'enjeu étant d'établir des rapports de force équilibrés, contrôlables et révocables, et de préserver l'autonomie individuelle en équilibre avec le collectif<ref>Jourdain, ''Géopolitique de l'anarchisme'', conclusion.</ref>. La troisième objection, formulée par Robert Michels dans ''Les Partis politiques'' (1911), tient à la loi d'airain de l'oligarchie : toute organisation, parti ou syndicat, tend à se diviser en minorité dirigeante et majorité dirigée, les représentants finissant par s'affranchir du contrôle de la base. Préposiet observe que Michels, sans être anarchiste, rejoint ainsi la critique libertaire de la représentation, qu'il appuie sur une citation de Proudhon, mais que la portée de cette loi vaut aussi comme question adressée à l'anarchisme : les fédérations libertaires échappent-elles à la cristallisation d'une couche dirigeante<ref>Préposiet, ''Histoire de l'anarchisme'', « Un écueil. La loi d'airain de l'oligarchie ».</ref> ? Les anarchistes y répondent par le mandat impératif, limité et révocable, et par la décision prise collectivement plutôt que déléguée<ref>Pelletier, ''L'Anarchisme'', « L'anarchisme est contre la démocratie ».</ref>. La quatrième touche au pluralisme des valeurs et au recours à l'opinion publique. Godwin et Kropotkine comptaient sur l'opinion pour dissuader les abus en l'absence de coercition. George Orwell objecte que cette dépendance pourrait conduire à une tyrannie morale qui, faute de limites codifiées, se révélerait plus oppressive que tout système de lois<ref>Orwell, George, "Réflexions sur Gandhi", in ''Essais, articles, lettres'', tome IV, Paris, Ivrea-Encyclopédie des Nuisances, 1995, p. 539-548.</ref>. Reste la question de la défense collective : une société sans commandement centralisé peut peiner à résister à une agression organisée, comme le suggère l'écrasement militaire des expériences libertaires. Ces objections n'épuisent pas le débat, mais elles indiquent les difficultés auxquelles le projet anarchiste doit répondre. L'anarchisme contemporain les aborde par l'expérimentation pratique, la réflexion critique et le dialogue avec d'autres traditions, plutôt que par la proclamation d'une cité idéale. Par sa critique de l'autorité, son insistance sur l'autonomie et la coopération volontaire et sa conception d'une organisation sans domination, il demeure une référence dans les débats sur le pouvoir, la liberté et la justice sociale. == Notes et références == {{references|colonnes=2}} == Bibliographie == === Sources primaires === * Bakunin, Michel, ''Dieu et l'État'', Genève, 1882 ; réédition Paris, Maspero, 1976 * Bakunin, Michel, ''Étatisme et anarchie'', édition française établie par Renée Lamberet, Paris, Champ libre, 1976 * Bakunin, Michel, ''Œuvres complètes'', édition établie par Arthur Lehning, 8 volumes, Paris, Champ libre, 1973-1982 * Bookchin, Murray, ''Post-Scarcity Anarchism'', Berkeley, Ramparts Press, 1971 * Bookchin, Murray, ''The Ecology of Freedom: The Emergence and Dissolution of Hierarchy'', Palo Alto, Cheshire Books, 1982 * Bookchin, Murray, ''Social Anarchism or Lifestyle Anarchism: An Unbridgeable Chasm'', Oakland, AK Press, 1995 * Godwin, William, ''An Enquiry Concerning Political Justice, and its Influence on General Virtue and Happiness'', Londres, G.G.J. et J. Robinson, 1793, 2 volumes * Kropotkin, Pierre, ''La Conquête du pain'', Paris, Tresse et Stock, 1892 * Kropotkin, Pierre, ''Mutual Aid: A Factor of Evolution'', Londres, William Heinemann, 1902 * Kropotkin, Pierre, ''L'Éthique'', ouvrage posthume, 1922 ; traduction française Paris, Stock, 1979 * Kropotkin, Pierre, ''Fields, Factories and Workshops'', Londres, Thomas Nelson and Sons, 1899 * Pouget, Émile, ''Le Sabotage'', Paris, Marcel Rivière, 1910 * Proudhon, Pierre-Joseph, ''Qu'est-ce que la propriété ? ou Recherche sur le principe du Droit et du Gouvernement'', Paris, J.-F. Brocard, 1840 * Proudhon, Pierre-Joseph, ''Du Principe fédératif et de la nécessité de reconstituer le parti de la révolution'', Paris, E. Dentu, 1863 * Proudhon, Pierre-Joseph, ''De la capacité politique des classes ouvrières'', Paris, E. Dentu, 1865 * Proudhon, Pierre-Joseph, ''Théorie de la propriété'', Paris, Lacroix et Verboeckhoven, 1866 * Reclus, Élisée, ''L'Homme et la Terre'', Paris, Librairie universelle, 1905, 6 volumes * Rocker, Rudolf, ''Anarcho-Syndicalism: Theory and Practice'', Oakland, AK Press, 2004 (édition originale 1938) * Russell, Bertrand, ''Le monde qui pourrait être. Socialisme, anarchisme et anarcho-syndicalisme'', Montréal, Lux, 2014 (rééd. 2025) ; édition originale ''Proposed Roads to Freedom'', 1918 * Sale, Kirkpatrick, ''Dwellers in the Land: The Bioregional Vision'', San Francisco, Sierra Club Books, 1985 * Servigne, Pablo et Raphaël Stevens, ''Comment tout peut s'effondrer. Petit manuel de collapsologie à l'usage des générations présentes'', Paris, Seuil, 2015 * Sorel, Georges, ''Réflexions sur la violence'', Paris, Marcel Rivière, 1908 * Stirner, Max, ''Der Einzige und sein Eigentum'', Leipzig, Otto Wigand, 1844 * Thoreau, Henry David, "Resistance to Civil Government", in ''Aesthetic Papers'', Boston, 1849 * Thoreau, Henry David, ''Walden; or, Life in the Woods'', Boston, Ticknor and Fields, 1854 * Voline, ''La Révolution inconnue'', Paris, 1947 * Zerzan, John, ''Elements of Refusal'', Seattle, Left Bank Books, 1988 * Zerzan, John, ''Future Primitive and Other Essays'', Brooklyn, Autonomedia, 1994 === Études critiques et historiques === * Carr, E. H., ''Michael Bakunin'', Londres, Macmillan, 1937 * Charbonnier, Pierre, « Splendeurs et misères de la collapsologie. Les impensés du survivalisme de gauche », ''Revue du Crieur'', n° 13, La Découverte, 2019, p. 88-95 * Clark, John P., ''Max Stirner's Egoism'', Londres, Freedom Press, 1976 * Clark, John P., ''The Anarchist Moment: Reflections on Culture, Nature and Power'', Montréal, Black Rose Books, 1984 * Ferretti, Federico, ''Élisée Reclus, pour une géographie nouvelle'', Paris, Éditions du CTHS, 2014 * Fiala, Andrew, "Anarchism", in ''The Stanford Encyclopedia of Philosophy'', Edward N. Zalta (éd.), Stanford University, 2017 * Franks, Benjamin, "Prefiguration", in ''The Palgrave Handbook of Anarchism'', Carl Levy et Matthew S. Adams (éds.), Cham, Palgrave Macmillan, 2019 * Graeber, David, ''The Democracy Project: A History, a Crisis, a Movement'', New York, Spiegel & Grau, 2013 * Graeber, David et Andrej Grubačić, "Anarchism, or the Revolutionary Movement of the Twenty-first Century", ''ZNet'', 2004 * Guérin, Daniel, ''L'anarchisme. De la doctrine à la pratique'', suivi de ''Anarchisme et marxisme'', Paris, Gallimard, 1981 (première édition 1965) * Guérin, Daniel, ''Ni Dieu ni Maître. Anthologie de l'anarchisme'', Paris, Maspero, 1970 * Guérin, Daniel, ''Anarchism: From Theory to Practice'', New York, Monthly Review Press, 1970 * Jourdain, Edouard, ''Géopolitique de l'anarchisme. Vers un nouveau moment libertaire'', Paris, Le Cavalier Bleu, 2023 * Julliard, Jacques, ''Fernand Pelloutier et les origines du syndicalisme d'action directe'', Paris, Éditions du Seuil, 1971 * Jun, Nathan J., ''Anarchism and Political Modernity'', New York, Continuum, 2012 * Marshall, Peter, ''Demanding the Impossible: A History of Anarchism'', Londres, Fontana Press, 1993 * McLaughlin, Paul, ''Anarchism and Authority: A Philosophical Introduction to Classical Anarchism'', Aldershot, Ashgate, 2007 * Orwell, George, "Réflexions sur Gandhi", in ''Essais, articles, lettres'', tome IV, Paris, Ivrea-Encyclopédie des Nuisances, 1995 * Ostrom, Elinor, ''Governing the Commons: The Evolution of Institutions for Collective Action'', Cambridge, Cambridge University Press, 1990 * Paterson, Ronald William Keith, ''The Nihilistic Egoist: Max Stirner'', Oxford, Oxford University Press, 1971 * Peirats, José, ''La CNT dans la Révolution espagnole'', Paris, Spartacus, 1975 * Pelletier, Philippe, ''L'Anarchisme'', Paris, Le Cavalier Bleu, coll. « Idées reçues », 2010 * Philp, Mark, ''Godwin's Political Justice'', Londres, Duckworth, 1986 * Préposiet, Jean, ''Histoire de l'anarchisme'', Paris, Tallandier, 2002 * Purchase, Graham, ''Anarchism and Environmental Survival'', Tucson, See Sharp Press, 1994 * Saltman, Richard B., ''The Social and Political Thought of Michael Bakunin'', Westport, Greenwood Press, 1983 * Simmons, A. John, ''Moral Principles and Political Obligations'', Princeton, Princeton University Press, 1979 * Todes, Daniel P., ''Darwin without Malthus: The Struggle for Existence in Russian Evolutionary Thought'', Oxford, Oxford University Press, 1989 * van der Linden, Marcel et Wayne Thorpe (éds.), ''Revolutionary Syndicalism: An International Perspective'', Aldershot, Scolar Press, 1990 * Vincent, Jean-Didier, ''Élisée Reclus. Géographe, anarchiste, écologiste'', Paris, Robert Laffont, 2010 (Prix Femina essai 2010) * Vincent, K. Steven, ''Pierre-Joseph Proudhon and the Rise of French Republican Socialism'', Oxford, Oxford University Press, 1984 * Wolff, Robert Paul, ''In Defense of Anarchism'', New York, Harper & Row, 1970 * Woodcock, George, ''L'Anarchisme. Une histoire des idées et mouvements libertaires'', Montréal, Lux, 2019 (édition originale ''Anarchism: A History of Libertarian Ideas and Movements'', 1962) == Liens externes == * [https://plato.stanford.edu/entries/anarchism/ Anarchism - Stanford Encyclopedia of Philosophy] * [https://www.marxists.org/subject/anarchism/ Anarchism Archive] [[Catégorie:Philosophie politique]] {{Autocat}} odms3jabph9ekt10trn82iufx6optn6 Dictionnaire de philosophie/Affection 0 83028 768146 766841 2026-06-19T04:13:33Z PandaMystique 119061 Bot : ajout du paramètre lecture=oui au modèle {{DicoPhilo}} 768146 wikitext text/x-wiki {{DicoPhilo|Affection|lecture=oui}} L'affection est une notion philosophique qui désigne, dans son acception la plus générale, une modification subie par un être sous l'effet d'une cause extérieure ou intérieure. Le terme provient du latin ''affectio'', dérivé du verbe ''afficere'' (affecter, modifier). Sa traduction française recouvre toutefois une famille de significations qu'il importe de distinguer avant toute analyse historique. Cette notion traverse la tradition philosophique occidentale, d'Aristote à la phénoménologie, et nourrit aujourd'hui encore les débats sur les émotions et l'affectivité. == Carte terminologique == Le mot français ''affection'' traduit une constellation de termes anciens dont les sens ne se recouvrent pas exactement. Le grec ''pathos'' (πάθος) désigne tour à tour le fait de subir une action (''paschein''), une qualité résultant d'une modification, une émotion ou une passion de l'âme, voire un attribut démontrable d'un sujet mathématique. Le latin philosophique a tenté de rendre cette pluralité par plusieurs termes : ''affectio'' (état, disposition, modification), ''affectus'' (sentiment, disposition affective), ''passio'' (passion, ce qui est subi). Le français moderne distingue à son tour l'affection (au sens large de modification ou d'inclination), l'affect (terme repris notamment de Spinoza et de la psychanalyse), la passion (au sens fort de mouvement subi), l'émotion (terme privilégié par la psychologie et la philosophie contemporaine) et le sentiment (réservé aux dispositions plus durables). Cette dispersion lexicale recouvre des distinctions conceptuelles importantes. Une même notion peut renvoyer, selon les contextes, à la passivité ontologique (être affecté par autre chose), à une qualité sensible (le doux, l'amer), à une disposition de la volonté (l'inclination), à une passion proprement dite (la colère, la joie), à une affection corporelle (la maladie, la sensation) ou à la réceptivité d'une faculté de connaissance (la sensibilité kantienne). Suivre l'histoire du terme exige donc de tenir ces registres distincts et de ne pas projeter le sens psychologique moderne sur les usages anciens. == Origines aristotéliciennes == === Pathos : registres et acceptions === Aristote emploie ''pathos'' (πάθος) dans plusieurs registres qu'il importe de distinguer. Dans les ''Catégories'', le pâtir ou ''paschein'' figure parmi les dix catégories de l'être, distinct de l'agir, et désigne la condition générale de ce qui subit une action<ref>Aristote, ''Catégories'', 1b25-2a4, trad. F. Ildefonse et J. Lallot, Paris, Seuil, 2002</ref>. À l'intérieur de la catégorie de la qualité, Aristote distingue par ailleurs une classe particulière, celle des qualités affectives et des affections, dont la nature varie selon qu'elles produisent une affection chez celui qui les perçoit (la douceur du miel agit sur le goût) ou qu'elles résultent elles-mêmes d'une affection (la pâleur due à la peur, le rougissement dû à la honte)<ref>Aristote, ''Catégories'', 8, 9a28-10a10</ref>. Dans la ''Métaphysique'' enfin, ''pathos'' désigne aussi bien la qualité modifiable d'un être, l'altération elle-même, que les attributs démontrables d'un sujet<ref>Aristote, ''Métaphysique'', Δ, 21, 1022b15-21, trad. J. Tricot, Paris, Vrin, 2000</ref>. Cette pluralité d'usages n'est pas une simple polysémie : elle reflète une articulation conceptuelle entre la passivité comme statut catégoriel, la qualité affective comme propriété déterminée et l'altération comme processus de changement. Ces emplois ne se laissent pourtant pas réduire à un sens unique. Selon les contextes, ''pathos'' désigne ce qui appartient à un sujet, ce qui lui arrive ou ce qui peut être prédiqué de lui ; dans d'autres, plus restreints, il renvoie à la réceptivité par laquelle un être est susceptible d'être modifié par un autre. Cette pluralité justifie qu'on en retrace l'histoire en plusieurs registres distincts plutôt que de la rabattre sur un seul axe sémantique. === Affection et passivité === L'affection est essentiellement liée à la passivité (''paschein''). Dans la physique aristotélicienne du changement, tout devenir suppose un agent et un patient : l'agent transmet une forme, le patient la reçoit. L'affection caractérise la condition du patient, qui s'expose à la causalité d'un autre que lui. Cette dimension passive explique pourquoi le même terme ''pathos'' a pu désigner à la fois la passivité ontologique en général et les passions de l'âme en particulier, qui sont les modifications psychiques produites par une cause étrangère à la délibération. Dans le ''De anima'', Aristote analyse les affections psychiques comme des modifications de l'âme produites par les objets sensibles. La sensation y est conçue comme une affection : l'organe sensoriel reçoit la forme sensible sans la matière, à la manière dont la cire reçoit l'empreinte d'un sceau sans en recevoir la matière<ref>Aristote, ''De l'âme'', II, 12, 424a17-24, trad. R. Bodéüs, Paris, GF-Flammarion, 1993</ref>. Cette théorie hylémorphique de la sensation, qui maintient l'affection sensible dans le cadre d'une réception formelle, traversera toute la tradition médiévale et nourrira l'anthropologie thomiste. === Attributs propres et accidents === Le vocabulaire aristotélicien de l'affection couvre également un usage logique distinct du sens affectif ordinaire. Aristote parle d'attributs propres ou d'affections par soi (''kath'hauto pathè'') pour désigner ce qui appartient nécessairement à la nature d'un sujet et se démontre à partir de son essence : la propriété pour un triangle d'avoir la somme de ses angles égale à deux droits constitue une telle affection par soi<ref>Aristote, ''Métaphysique'', Δ, 30, 1025a30-34</ref>. Ces affections par soi se distinguent des accidents (''kata sumbebèkos''), qui peuvent appartenir ou non à un sujet sans en altérer l'essence. Cet emploi logique et démonstratif du terme ''pathos'' ne se confond pas avec l'affection au sens de modification subie. Il convient de l'identifier comme tel, car la tradition aristotélicienne et scolastique a maintenu ce double usage, source de confusions chez les commentateurs modernes. La pluralité des registres aristotéliciens (catégorie du pâtir, qualité affective, altération, attribut propre) interdit toute lecture qui ramènerait le ''pathos'' à un sens unique. == L'affection dans la philosophie médiévale == === Thomas d'Aquin et les passions de l'âme === La philosophie médiévale hérite de la conception aristotélicienne de l'affection et la transforme dans le cadre d'une anthropologie chrétienne. Thomas d'Aquin (1225-1274) intègre la notion d'affection à sa synthèse de l'aristotélisme et de la tradition augustinienne, en réservant le traitement principal aux passions de l'âme dans la ''Prima Secundae'' de la ''Somme théologique''. Pour Thomas, la passion proprement dite suppose une transformation corporelle : c'est pourquoi elle relève d'abord de l'appétit sensible et non de la volonté ou de l'intellect. Comme il l'écrit, la passion se trouve à proprement parler là où il y a transmutation corporelle, donc davantage dans l'appétit sensible que dans l'appétit intellectuel<ref>Thomas d'Aquin, ''Somme théologique'', Ia-IIae, q. 22, a. 3, trad. A.-M. Roguet, Paris, Cerf, 1984-1986</ref>. Le vocabulaire de la passion ou de l'affection peut néanmoins s'étendre, par analogie, à des mouvements de la volonté ou de l'intellect, mais cet usage demeure dérivé et second. Cette différence entre usage propre et usage analogique structure la psychologie thomiste. Elle permet de comprendre comment l'âme, principe spirituel uni au corps comme sa forme substantielle, peut être affectée à travers son appétit sensible, sans que la volonté ou l'intellect soient atteints au même titre. Les passions sensibles, réparties entre l'appétit concupiscible et l'appétit irascible, reçoivent une analyse détaillée : amour et haine, désir et aversion, joie et tristesse, espoir et désespoir, audace et crainte, colère<ref>Thomas d'Aquin, ''Somme théologique'', Ia-IIae, qq. 22-48</ref>. === Anselme, Bonaventure et Scot : les affections de la volonté === Une autre lignée médiévale développe une conception plus volitive de l'affection. Anselme de Cantorbéry (1033-1109) avait esquissé, notamment dans le ''De casu diaboli'' et le ''De concordia'', la distinction entre deux inclinations de la volonté : l'inclination vers ce qui est avantageux pour soi (''affectio commodi'') et l'inclination vers ce qui est juste (''affectio iustitiae''). Cette distinction reçoit son élaboration la plus systématique chez Jean Duns Scot (vers 1266-1308), qui en fait le pivot de sa théorie de la liberté de la volonté. Pour Scot, la volonté est constitutivement traversée par ces deux affections : l{{'}}''affectio commodi'' la porte vers son bien propre, l{{'}}''affectio iustitiae'' lui permet de vouloir un bien indépendamment de son intérêt. La liberté n'est rendue possible que par cette seconde affection, qui libère la volonté de la nécessité du désir naturel du bonheur et l'ouvre à un vouloir authentiquement moral<ref>Voir A. Wolter, ''Duns Scotus on the Will and Morality'', Washington, Catholic University of America Press, 1986, p. 148-181 ; T. Williams (dir.), ''The Cambridge Companion to Duns Scotus'', Cambridge, Cambridge University Press, 2003, chap. 8.</ref>. Bonaventure (1217-1274), de son côté, accorde une place importante à la dimension affective de la connaissance dans une perspective augustinienne, où l'amour et le désir orientent l'intellect vers Dieu : l{{'}}''affectus'' est ici la dimension volitive et amoureuse de l'âme tournée vers sa fin surnaturelle<ref>Bonaventure, ''Itinerarium mentis in Deum'', trad. H. Duméry, Paris, Vrin, 1960.</ref>. Mais l'analyse spécifique des deux affections de la volonté demeure surtout caractéristique de la lignée anselmienne et scotiste, dont l'influence se prolongera dans les théories modernes de la motivation morale. == Descartes : affection, union de l'âme et du corps, et passions == === Le dualisme cartésien et le problème de l'affection === René Descartes (1596-1650) reformule la notion d'affection dans le cadre de son dualisme métaphysique. Les ''Méditations métaphysiques'' (1641) établissent une distinction réelle entre deux substances : la substance pensante (''res cogitans'') et la substance étendue (''res extensa'')<ref>Descartes, ''Méditations métaphysiques'', Méditation Seconde, AT VII, 27, in ''Œuvres'', éd. Adam et Tannery, vol. VII, Paris, Vrin, 1996</ref>. Cette distinction soulève une difficulté immédiate : comment deux substances de natures aussi distinctes peuvent-elles interagir, et comment l'âme peut-elle être affectée par le corps ? Descartes reconnaît que l'expérience commune nous apprend l'unité du composé humain, malgré la distinction réelle de ses principes. Dans cette union substantielle prennent place les affections proprement humaines : la faim, la soif, la douleur, les passions<ref>Descartes, ''Principes de la philosophie'', I, § 48, AT IX-2, 45</ref>. === Les Passions de l'âme : l'affection comme perception === Dans ''Les Passions de l'âme'' (1649), Descartes développe une théorie systématique des affections psychiques. Il définit les passions comme « des perceptions, ou des sentiments, ou des émotions de l'âme, qu'on rapporte particulièrement à elle, et qui sont causées, entretenues et fortifiées par quelque mouvement des esprits »<ref>Descartes, ''Les Passions de l'âme'', I, § 27, AT XI, 349</ref>. Les affections de l'âme sont d'abord des perceptions passives : l'âme les reçoit sans les produire activement. Elles trouvent leur origine dans les mouvements des esprits animaux, ces particules subtiles du sang qui circulent dans les nerfs et qui transmettent au cerveau les impressions corporelles. Descartes fait de la glande pinéale le lieu privilégié de l'interaction entre l'âme et le corps : c'est en ce point que les mouvements des esprits affectent l'âme et que l'âme exerce en retour son influence sur eux, sans qu'il faille pour autant identifier cette glande au siège de l'âme prise dans sa totalité, puisque celle-ci est unie à l'ensemble du corps<ref>Descartes, ''Les Passions de l'âme'', I, § 31-36</ref>. Descartes distingue trois grands ordres d'affections : # les affections qui se rapportent aux objets extérieurs (sensations externes : couleurs, sons, odeurs) ; # les affections qui se rapportent à notre propre corps (sensations internes comme la faim, la soif, la douleur) ; # les affections qui se rapportent à l'âme elle-même : ce sont les passions proprement dites. Cette tripartition reflète les trois niveaux de sensation déjà distingués dans les ''Sixièmes Réponses''<ref>Descartes, ''Sixièmes Réponses'', AT VII, 436-437</ref>. === Les six passions primitives === Descartes identifie six passions primitives à partir desquelles toutes les autres se composent : l'admiration, l'amour, la haine, le désir, la joie et la tristesse. Chacune correspond à une modification spécifique des esprits animaux et engendre une disposition caractéristique de l'âme<ref>Descartes, ''Les Passions de l'âme'', II, § 69</ref>. L'apport de cette analyse tient à ce qu'elle traite les passions non comme des désordres moraux à condamner, mais comme des phénomènes naturels à comprendre selon les lois de la mécanique corporelle. Cette approche prépare le terrain pour la psychologie spinoziste des affects, qui en reprendra le principe tout en abandonnant le dualisme métaphysique. === Le problème de l'union substantielle === Le dualisme cartésien laisse pendante la question de savoir comment l'âme, substance immatérielle et indivisible, peut être réellement affectée par le corps, substance matérielle et divisible. Descartes reconnaît, dans sa correspondance avec la princesse Élisabeth de Bohême, que cette union ne se laisse pas comprendre sur le modèle des idées claires et distinctes que nous formons de l'âme ou du corps pris séparément, mais qu'elle s'éprouve dans l'usage ordinaire de la vie et par les sens<ref>Descartes, Lettres à Élisabeth des 21 mai et 28 juin 1643, AT III, 663-668 et 690-695</ref>. Cette difficulté théorique constitue l'un des principaux foyers des critiques adressées au cartésianisme par ses successeurs. Malebranche y répondra par l'occasionalisme, Leibniz par l'harmonie préétablie, et Spinoza par un monisme qui dissout l'opposition entre les deux substances. == Spinoza : de l'affection à l'affect == === Affectio et affectus : une distinction structurante === Baruch Spinoza (1632-1677) hérite de la problématique cartésienne mais la transforme en élaborant une ontologie moniste qui dissout le dualisme de l'âme et du corps. Dans l{{'}}''Éthique'' (1677), Spinoza articule deux termes qu'il importe de ne pas confondre : ''affectio'' (affection) et ''affectus'' (affect). L{{'}}''affectio'' désigne, au sens large, l'état ou la modification d'un mode fini, c'est-à-dire la manière dont un corps est constitué à un instant donné, sous l'effet des rencontres qu'il a faites avec d'autres corps. Toute existence modale implique nécessairement des affections, puisque tout mode fini est déterminé par d'autres modes dans une chaîne causale infinie. L{{'}}''affectio'' est donc un terme général, qui ne préjuge ni de la nature active ou passive de la modification, ni de sa portée pour la puissance d'agir. L{{'}}''affectus'', en revanche, désigne une espèce déterminée d'affection : celle qui enveloppe une variation de la puissance d'agir. Spinoza le définit ainsi : {{citation bloc|Par affect, j'entends les affections du Corps par lesquelles la puissance d'agir de ce Corps est augmentée ou diminuée, aidée ou contrariée, et en même temps les idées de ces affections.|Spinoza|Éthique, III, Définition 3<ref>Spinoza, ''Éthique'', III, Définition 3, trad. Bernard Pautrat, Paris, Seuil, 2010</ref>}} Trois traits méritent d'être soulignés. L'affect est défini de manière psychophysique : il concerne simultanément le corps (par l'affection corporelle) et l'esprit (par l'idée de cette affection). Il est défini de manière dynamique, par une variation de puissance plutôt que par un contenu statique. Il enveloppe enfin une dimension cognitive, mais cette idée de l'affection peut être adéquate ou inadéquate. Toutes les affections du corps ne sont donc pas des affects au sens fort : c'est seulement lorsqu'une affection enveloppe une augmentation ou une diminution de la puissance d'agir qu'elle mérite d'être nommée affect. La différence entre les deux termes n'est pas seulement lexicale : elle permet de penser une vie modale traversée par d'innombrables affections, dont une partie seulement entre dans le registre affectif au sens spinoziste. === Les trois affects primaires : désir, joie, tristesse === Spinoza réduit tous les affects à trois affects primaires, dont les autres dérivent par composition : le désir (''cupiditas''), la joie (''laetitia'') et la tristesse (''tristitia'')<ref>Spinoza, ''Éthique'', III, Proposition 11, scolie</ref>. Le désir est défini comme « l'essence même de l'homme en tant qu'elle est conçue comme déterminée à faire quelque chose par une affection quelconque qui est en elle »<ref>Spinoza, ''Éthique'', III, Définition des affects, I</ref> : il est l'effort (''conatus'') de persévérer dans son être, devenu conscient et déterminé par une affection particulière. La joie est « le passage de l'homme d'une moindre à une plus grande perfection »<ref>Spinoza, ''Éthique'', III, Définition des affects, II</ref>, c'est-à-dire une augmentation de la puissance d'agir. La tristesse est « le passage de l'homme d'une plus grande à une moindre perfection »<ref>Spinoza, ''Éthique'', III, Définition des affects, III</ref>, soit une diminution de cette même puissance. Cette réduction permet à Spinoza de construire une véritable géométrie des passions : il déduit méthodiquement quarante-huit définitions d'affects dérivés (amour, haine, espoir, crainte, jalousie, pitié) à partir de la composition des affects primaires et de la variation de leurs objets<ref>Spinoza, ''Éthique'', III, Définitions des affects, I-XLVIII</ref>. === Affects actifs et affects passifs === Spinoza établit entre affects actifs et affects passifs une distinction qui ne recouvre pas la division cartésienne du corps et de l'âme, mais repose sur le degré d'adéquation de la connaissance que nous avons de nos affections. Une affection, en tant qu'elle constitue un affect, est active (elle est une action) lorsque nous en sommes la cause adéquate, c'est-à-dire lorsqu'elle peut être clairement et distinctement perçue par notre seule nature<ref>Spinoza, ''Éthique'', III, Définition 2</ref>. Dans ce cas, l'idée que nous avons de l'affection est adéquate : nous saisissons les causes qui la produisent, et ces causes appartiennent à notre nature propre. Un affect est passif (il est une passion) lorsque nous n'en sommes qu'une cause partielle ou inadéquate, c'est-à-dire lorsque l'affection correspondante ne peut être comprise par notre seule nature mais requiert l'intervention de causes extérieures. L'idée de l'affection est alors confuse et inadéquate. La servitude humaine consiste à être soumis aux passions ; la liberté, à développer des affects actifs par l'acquisition d'une connaissance adéquate. === L'imitation des affections et la dimension intersubjective === L'un des apports propres de Spinoza tient au rôle qu'il accorde à l'intersubjectivité dans la genèse des affections. Dans la troisième partie de l{{'}}''Éthique'', il développe la théorie de l'imitation des affections (''affectuum imitatio''). Si nous imaginons qu'un être semblable à nous éprouve un affect, nous éprouverons par là un affect semblable<ref>Spinoza, ''Éthique'', III, Proposition 27</ref>. Cette imitation ne suppose ni sympathie innée ni faculté spéciale d'empathie : elle repose sur l'association d'idées. L'image d'autrui affecté réactive en nous les affections que nous avons nous-mêmes éprouvées en des occasions semblables. Cette théorie explique des phénomènes psychosociaux comme la pitié, l'envie, la rivalité ou l'ambition. Elle montre que l'être humain est par nature un être social, dont les affections se constituent dans un réseau d'interactions. Loin de toute conception strictement individualiste, Spinoza reconnaît la dimension constitutivement intersubjective de l'affectivité. === La béatitude comme amour intellectuel de Dieu === Le but ultime de l{{'}}''Éthique'' est d'enseigner le chemin vers la béatitude, qui est elle-même un affect : la forme la plus élevée d'affect actif. Dans la cinquième partie, Spinoza décrit la béatitude comme « l'amour intellectuel de Dieu » (''amor Dei intellectualis''), affect qui naît de la connaissance adéquate du troisième genre<ref>Spinoza, ''Éthique'', V, Proposition 32, corollaire</ref>. Cet amour intellectuel n'est pas une exaltation mystique, mais un affect actif qui découle de la compréhension rationnelle de l'ordre nécessaire de la Nature. Il est sans mélange de tristesse, éternel dans sa nature, et constitue la part éternelle de l'esprit humain. La béatitude spinoziste ne consiste donc pas à supprimer toute affection, comme le préconisait l'idéal stoïcien d{{'}}''apatheia'', mais à transformer nos affections passives en affections actives par la connaissance. C'est une conception affirmative de l'affectivité, qui fait de l'homme non un « empire dans un empire », mais une partie de la Nature dont la perfection consiste à agir selon les lois de sa propre nature. == Développements modernes et contemporains == === L'affection dans l'empirisme britannique === La tradition empiriste britannique, de Locke à Hume, élabore une conception de l'affection centrée sur l'expérience sensible. Pour John Locke (1632-1704), les affections de l'âme sont des modifications produites par les impressions sensibles ; toute connaissance commence par des sensations qui affectent passivement l'esprit<ref>Locke, ''Essai sur l'entendement humain'', Livre II, chap. 1, trad. P. Coste, Paris, Vrin, 1972</ref>. David Hume (1711-1776) déplace cette approche en distinguant les impressions, qui sont les perceptions immédiates et vives, des idées, qui en sont les copies affaiblies. Les passions, comme l'orgueil, l'humilité, l'amour et la haine, sont elles-mêmes des impressions de réflexion qui naissent de la considération d'idées préalables<ref>Hume, ''Traité de la nature humaine'', Livre II, trad. J.-P. Cléro, Paris, GF-Flammarion, 1991</ref>. Cette psychologie empiriste nourrira le sentimentalisme moral britannique, qui fait des affections sympathiques le fondement du jugement moral. === Kant : l'affection et le problème de la chose en soi === Emmanuel Kant (1724-1804) introduit dans l'analyse de l'affection une distinction entre deux sources hétérogènes de la connaissance : la sensibilité, faculté de réceptivité, et l'entendement, faculté de spontanéité. Dans la ''Critique de la raison pure'' (1781/1787), l'affection désigne la manière dont nous sommes affectés par les objets, c'est-à-dire la réceptivité de notre sensibilité<ref>Kant, ''Critique de la raison pure'', Esthétique transcendantale, A19/B33, trad. A. Renaut, Paris, GF-Flammarion, 2006</ref>. Les intuitions sensibles, mises en forme par les conditions a priori que sont l'espace et le temps, fournissent à l'entendement la matière qu'il met sous concepts. Le rapport entre l'affection sensible et la chose en soi constitue l'un des problèmes les plus discutés de l'idéalisme transcendantal. Plusieurs formulations kantiennes semblent impliquer que notre sensibilité est affectée par quelque chose qui n'est pas réductible au phénomène, alors même que la chose en soi est dite inconnaissable, ce qui a paru contradictoire à plusieurs lecteurs, à commencer par F. H. Jacobi. Les interprétations divergent : la lecture dite à deux objets distingue les choses en soi et les phénomènes comme deux réalités séparées ; la lecture dite à deux aspects y voit deux manières de considérer une même réalité, sous son aspect en soi et sous son aspect tel qu'il nous apparaît<ref>H. E. Allison, ''Kant's Transcendental Idealism'', New Haven, Yale University Press, 2004 (éd. révisée) ; sur la controverse, voir aussi K. Ameriks, ''Kant and the Fate of Autonomy'', Cambridge, Cambridge University Press, 2000.</ref>. Quelle que soit la lecture retenue, l'« affection transcendantale » reste un foyer de difficultés qui a alimenté les premières critiques de l'idéalisme allemand et continue de nourrir les débats contemporains sur la philosophie kantienne. === La phénoménologie de l'affection === La phénoménologie du XX{{e}} siècle renouvelle l'approche de l'affection en l'abordant du point de vue de l'expérience vécue, mais selon des modalités très diverses qu'il convient de distinguer. Edmund Husserl (1859-1938) développe, dans ses analyses de la synthèse passive, une théorie de l'affection comme tendance par laquelle un donné hylétique sollicite l'attention du sujet et émerge à la conscience. L'affection précède ici l'acte intentionnel explicite : elle constitue le sol pré-réflexif sur lequel se lèvent les visées de la conscience active. Cette « affection passive » est ce par quoi quelque chose se met à compter pour le sujet avant tout acte de saisie réfléchi<ref>Husserl, ''De la synthèse passive'', trad. B. Bégout et J. Kessler, Grenoble, Millon, 1998 ; ''Recherches phénoménologiques pour la constitution. Idées directrices pour une phénoménologie pure et une philosophie phénoménologique, livre II'', trad. É. Escoubas, Paris, PUF, 1982.</ref>. Max Scheler (1874-1928) élabore une phénoménologie des sentiments et des valeurs où l'affectivité possède une intentionnalité propre, irréductible à celle de la représentation. Les sentiments accomplissent une saisie des valeurs selon une hiérarchie objective qui va des valeurs sensibles aux valeurs vitales, spirituelles et religieuses. Sans se laisser ramener au modèle de la perception sensible, ce mode affectif d'accès aux valeurs constitue une forme originale de connaissance axiologique, dont l'évidence diffère en nature de celle des actes représentatifs<ref>Scheler, ''Le formalisme en éthique et l'éthique matériale des valeurs'' (1913-1916), trad. M. de Gandillac, Paris, Gallimard, 1955.</ref>. Maurice Merleau-Ponty (1908-1961) inscrit l'affection dans une phénoménologie du corps propre : nous sommes affectés par le monde non comme des sujets désincarnés, mais comme des êtres corporels engagés dans un champ perceptif où le sensible et le sensé se constituent simultanément. Le corps n'est pas seulement le siège des affections, il est lui-même structure d'ouverture au monde<ref>Merleau-Ponty, ''Phénoménologie de la perception'', Paris, Gallimard, 1945.</ref>. Michel Henry (1922-2002) pousse plus loin l'analyse en thématisant l'auto-affection comme structure originaire de la subjectivité. Pour Henry, la vie se révèle à elle-même sans médiation, dans une affection immanente où le sentir et le senti ne font qu'un. L'auto-affection n'est pas une réflexion sur soi mais l'épreuve pathique par laquelle la subjectivité s'éprouve elle-même comme vie, antérieurement à toute intentionnalité tournée vers un objet extérieur<ref>Henry, ''L'essence de la manifestation'', Paris, PUF, 1963 ; ''Phénoménologie matérielle'', Paris, PUF, 1990.</ref>. === Philosophie contemporaine des émotions === La philosophie analytique contemporaine a renouvelé l'étude des phénomènes affectifs sous l'angle d'une philosophie des émotions, qui rejoint partiellement la notion classique d'affection sans s'y identifier. Plusieurs familles de théories s'y opposent. Les théories cognitivistes ou évaluatives, défendues notamment par Robert Solomon et Martha Nussbaum, conçoivent les émotions comme des jugements évaluatifs portant sur l'importance des objets ou des situations pour le sujet. L'émotion comporte ainsi une dimension propositionnelle qui la rend susceptible d'être appropriée ou inappropriée, lucide ou déformée, justifiée ou non par les raisons qui motivent le sujet<ref>R. Solomon, ''The Passions'', Indianapolis, Hackett, 1976 ; M. Nussbaum, ''Upheavals of Thought : The Intelligence of Emotions'', Cambridge, Cambridge University Press, 2001.</ref>. Les théories perceptualistes, illustrées par Ronald de Sousa, Christine Tappolet ou Jesse Prinz, soutiennent que les émotions fonctionnent comme des perceptions de valeurs ou de propriétés évaluatives ; elles présentent leur objet sous un certain jour (dangereux, désirable, méprisable) sans nécessairement contenir un jugement explicite<ref>R. de Sousa, ''The Rationality of Emotion'', Cambridge (Mass.), MIT Press, 1987 ; C. Tappolet, ''Émotions et valeurs'', Paris, PUF, 2000 ; J. Prinz, ''Gut Reactions : A Perceptual Theory of Emotion'', Oxford, Oxford University Press, 2004.</ref>. Peter Goldie a proposé une approche narrative et phénoménologique, attentive à la manière dont les émotions s'insèrent dans des récits de vie et engagent une compréhension de soi<ref>P. Goldie, ''The Emotions : A Philosophical Exploration'', Oxford, Clarendon Press, 2000.</ref>. Julien Deonna et Fabrice Teroni défendent une théorie attitudinale, selon laquelle l'émotion est moins un type de contenu qu'un type d'attitude que le sujet prend envers un contenu évaluatif<ref>J. Deonna et F. Teroni, ''Qu'est-ce qu'une émotion ?'', Paris, Vrin, 2008 ; ''The Emotions : A Philosophical Introduction'', Londres, Routledge, 2012.</ref>. Le dialogue avec les neurosciences, notamment à travers les travaux d'Antonio Damasio sur les marqueurs somatiques, a réintroduit le rôle des modifications corporelles dans la constitution des émotions, prolongeant à frais nouveaux la veine ouverte par William James<ref>A. Damasio, ''L'erreur de Descartes : la raison des émotions'', trad. M. Blanc, Paris, Odile Jacob, 1995.</ref>. Ces approches recoupent partiellement la notion classique d'affection sans en épuiser le sens : l'émotion désigne plutôt, dans le vocabulaire contemporain, un état mental bref et structuré, tandis que l'affection au sens philosophique large englobe également la passivité ontologique, la sensibilité réceptive et les dispositions affectives durables. == Conclusion == La notion d'affection traverse l'histoire de la philosophie occidentale en se transformant selon les cadres métaphysiques et épistémologiques successifs. D'une notion aristotélicienne articulée entre catégorie du pâtir, qualité affective et altération, elle devient chez Thomas un cadre d'analyse des passions corporelles, chez Scot une structure de la volonté libre, chez Descartes le lieu problématique de l'union de l'âme et du corps, chez Spinoza le concept central d'une ontologie moniste de la puissance, puis chez Kant la marque de la réceptivité de la sensibilité, et chez les phénoménologues le sol pré-réflexif de la vie subjective. À travers ces transformations, quelques questions demeurent : comment comprendre la passivité inhérente à l'affection ? Quelle est la relation entre affection corporelle et affection psychique ? L'affection est-elle un obstacle à la connaissance ou en constitue-t-elle une dimension essentielle ? La pluralité des cadres conceptuels ne signifie pas l'absence d'unité du problème : il s'agit toujours de penser ce que c'est, pour un être, que d'être modifié par autre chose que soi, et de comprendre les conséquences de cette passivité pour la connaissance, l'action et la vie morale. À cet égard, l'affection demeure un outil conceptuel utile pour penser la complexité de l'expérience humaine dans ses dimensions sensibles, émotionnelles, cognitives et sociales. == Notes et références == {{references|colonnes=2}} == Bibliographie == === Sources primaires === * Anselme de Cantorbéry, ''L'œuvre d'Anselme de Cantorbéry'', éd. M. Corbin, Paris, Cerf, 1986-2016 * Aristote, ''Catégories'', trad. F. Ildefonse et J. Lallot, Paris, Seuil, 2002 * Aristote, ''Catégories'', trad. J. Tricot, Paris, Vrin, 1994 * Aristote, ''Métaphysique'', trad. J. Tricot, Paris, Vrin, 2000 * Aristote, ''De l'âme'', trad. R. Bodéüs, Paris, GF-Flammarion, 1993 * Bonaventure, ''Itinerarium mentis in Deum''. ''Itinéraire de l'esprit vers Dieu'', trad. H. Duméry, Paris, Vrin, 1960 * Descartes, René, ''Les Passions de l'âme'' (1649), in ''Œuvres de Descartes'', éd. Adam et Tannery, vol. XI, Paris, Vrin, 1996 * Descartes, René, ''Méditations métaphysiques'' (1641), in ''Œuvres de Descartes'', éd. Adam et Tannery, vol. VII, Paris, Vrin, 1996 * Duns Scot, Jean, ''Traité du premier principe'', trad. J.-D. Cavigioli et alii, Paris, Vrin, 2001 * Hume, David, ''Traité de la nature humaine'' (1739-1740), trad. P. Saltel, J.-P. Cléro et P. Baranger, Paris, GF-Flammarion, 1991-1993, 3 vol. * Husserl, Edmund, ''De la synthèse passive'', trad. B. Bégout et J. Kessler, Grenoble, Millon, 1998 * Kant, Emmanuel, ''Critique de la raison pure'' (1781/1787), trad. A. Renaut, Paris, GF-Flammarion, 2006 * Locke, John, ''Essai sur l'entendement humain'' (1689), trad. P. Coste, Paris, Vrin, 1972 * Merleau-Ponty, Maurice, ''Phénoménologie de la perception'', Paris, Gallimard, 1945 * Scheler, Max, ''Le formalisme en éthique et l'éthique matériale des valeurs'' (1913-1916), trad. M. de Gandillac, Paris, Gallimard, 1955 * Spinoza, Baruch, ''Éthique'' (1677), trad. Bernard Pautrat, Paris, Seuil, 2010 * Spinoza, Baruch, ''Éthique'' (1677), trad. Charles Appuhn, Paris, GF-Flammarion, 1965 * Thomas d'Aquin, ''Somme théologique'', trad. A.-M. Roguet, Paris, Cerf, 1984-1986 === Études secondaires === ==== Sur Aristote et la tradition ancienne ==== * Crubellier, Michel, et Pellegrin, Pierre, ''Aristote. Le philosophe et les savoirs'', Paris, Seuil, 2002 * Frede, Dorothea, et Reis, Burkhard (dir.), ''Body and Soul in Ancient Philosophy'', Berlin, De Gruyter, 2009 * Sorabji, Richard, ''Emotion and Peace of Mind. From Stoic Agitation to Christian Temptation'', Oxford, Oxford University Press, 2000 ==== Sur la philosophie médiévale ==== * Gilson, Étienne, ''Le Thomisme. Introduction à la philosophie de saint Thomas d'Aquin'', Paris, Vrin, 1997 * King, Peter, « Aquinas on the Passions », in S. MacDonald et E. Stump (dir.), ''Aquinas's Moral Theory'', Ithaca, Cornell University Press, 1999, p. 101-132 * Knuuttila, Simo, ''Emotions in Ancient and Medieval Philosophy'', Oxford, Clarendon Press, 2004 * Williams, Thomas (dir.), ''The Cambridge Companion to Duns Scotus'', Cambridge, Cambridge University Press, 2003 * Wolter, Allan, ''Duns Scotus on the Will and Morality'', Washington, Catholic University of America Press, 1986 ==== Sur Descartes ==== * James, Susan, ''Passion and Action. The Emotions in Seventeenth-Century Philosophy'', Oxford, Clarendon Press, 1997 * Kambouchner, Denis, ''L'homme des passions. Commentaires sur Descartes'', Paris, Albin Michel, 1995, 2 vol. * Marion, Jean-Luc, ''Sur la pensée passive de Descartes'', Paris, PUF, 2013 * Rodis-Lewis, Geneviève, ''La Morale de Descartes'', Paris, PUF, 1998 ==== Sur Spinoza ==== * Alquié, Ferdinand, ''Le Désir d'éternité'', Paris, PUF, 1943 * Deleuze, Gilles, ''Spinoza. Philosophie pratique'', Paris, Minuit, 1981 * Gueroult, Martial, ''Spinoza. L'Âme (Éthique, II)'', Paris, Aubier, 1974 * Jaquet, Chantal, ''L'unité du corps et de l'esprit. Affects, actions et passions chez Spinoza'', Paris, PUF, 2004 * Macherey, Pierre, ''Introduction à l'Éthique de Spinoza. La troisième partie : La vie affective'', Paris, PUF, 1995 * Marshall, Eugene, ''The Spiritual Automaton : Spinoza's Science of the Mind'', Oxford, Oxford University Press, 2013 * Moreau, Pierre-François, ''Spinoza. L'expérience et l'éternité'', Paris, PUF, 1994 ==== Sur Kant et l'idéalisme allemand ==== * Allison, Henry E., ''Kant's Transcendental Idealism'', New Haven, Yale University Press, 2004 (éd. révisée) * Ameriks, Karl, ''Kant and the Fate of Autonomy'', Cambridge, Cambridge University Press, 2000 * Beiser, Frederick C., ''German Idealism : The Struggle Against Subjectivism, 1781-1801'', Cambridge (Mass.), Harvard University Press, 2002 * Longuenesse, Béatrice, ''Kant et le pouvoir de juger'', Paris, PUF, 1993 ==== Sur la phénoménologie de l'affectivité ==== * Barbaras, Renaud, ''Désir et distance. Introduction à une phénoménologie de la perception'', Paris, Vrin, 1999 * Bégout, Bruno, ''La généalogie de la logique. Husserl, l'antéprédicatif et le catégorial'', Paris, Vrin, 2000 * Depraz, Natalie, ''Lucidité du corps. De l'empirisme transcendantal en phénoménologie'', Dordrecht, Kluwer, 2001 * Henry, Michel, ''Philosophie et phénoménologie du corps'', Paris, PUF, 1965 ==== Sur la philosophie contemporaine des émotions ==== * Deonna, Julien, et Teroni, Fabrice, ''Qu'est-ce qu'une émotion ?'', Paris, Vrin, 2008 * Goldie, Peter, ''The Emotions : A Philosophical Exploration'', Oxford, Clarendon Press, 2000 * Nussbaum, Martha, ''Upheavals of Thought : The Intelligence of Emotions'', Cambridge, Cambridge University Press, 2001 * Prinz, Jesse, ''Gut Reactions : A Perceptual Theory of Emotion'', Oxford, Oxford University Press, 2004 * Solomon, Robert, ''The Passions'', Indianapolis, Hackett, 1976 * Sousa, Ronald de, ''The Rationality of Emotion'', Cambridge (Mass.), MIT Press, 1987 * Tappolet, Christine, ''Émotions et valeurs'', Paris, PUF, 2000 === Articles d'encyclopédie et de dictionnaires === * Barbaras, Renaud, « Autrui », in ''Encyclopédie philosophique universelle'', vol. I ''Les Notions philosophiques'', dir. S. Auroux, Paris, PUF, 1990, p. 209-212 * Jaquet, Chantal, « Affect », in ''Lexique Spinoza'', dir. C. Jaquet, P. Sévérac et A. Suhamy, Paris, Ellipses, 2009, p. 13-20 * Ramond, Charles, « Affection », in ''Vocabulaire de Spinoza'', Paris, Ellipses, 1999, p. 11-14 {{Autocat}} q6d63d8okx9yx6cfqzp372d0l6i83hu Dictionnaire de philosophie/Âme 0 83030 768150 766546 2026-06-19T04:14:13Z PandaMystique 119061 Bot : ajout du paramètre lecture=oui au modèle {{DicoPhilo}} 768150 wikitext text/x-wiki {{DicoPhilo|Âme|lecture=oui}} L''''âme''' (du grec ''psychê'', ψυχή, du latin ''anima'') constitue l'une des notions fondatrices de la pensée philosophique occidentale. De manière générale, elle désigne le principe vital qui anime les êtres vivants, tout en marquant ce qui distingue l'homme de la matière inerte et, éventuellement, ce qui survit à la dissolution du corps<ref>Pierre Hadot, ''Qu'est-ce que la philosophie antique ?'', Gallimard, 1995, p. 108-110</ref>. Cette notion, qui traverse toute l'histoire de la philosophie, trouve ses formulations les plus déterminantes dans la pensée platonicienne, où l'âme apparaît comme réalité immortelle, principe de connaissance et instance morale. == Les origines homériques et présocratiques == Chez Homère, l'âme (''psychê'') désigne essentiellement le souffle vital qui quitte le corps au moment de la mort. Dans l'''Iliade'', elle apparaît comme une ombre inconsistante, privée de pensée (''phrenes''), qui descend dans l'Hadès<ref>Homère, ''Iliade'', XVI, 857</ref>. Cette conception archaïque ne confère pas encore à l'âme la dignité d'un principe rationnel ou moral. Les penseurs présocratiques, notamment les pythagoriciens, transforment profondément cette conception. Pythagore introduit l'idée de la transmigration des âmes (métempsychose) et confère à l'âme une dimension divine et immortelle<ref>Marcel Detienne, ''De la pensée religieuse à la pensée philosophique. La notion de ''daimôn'' dans le pythagorisme ancien'', Les Belles Lettres, 1963, p. 85-92</ref>. L'âme devient ainsi le siège d'une vie spirituelle qui transcende l'existence corporelle. Cette innovation pythagoricienne exercera une influence déterminante sur Platon. == L'âme chez Platon : immortalité et connaissance == === La tripartition de l'âme === Platon élabore une conception complexe de l'âme qui en fait le principe même de la vie humaine et le fondement de la connaissance. Dans la ''République'', il distingue trois parties de l'âme : l'élément rationnel (''logistikon'', λογιστικόν), qui est siège de la raison et de la sagesse ; l'élément irascible ou courageux (''thumos'', θυμός), qui produit les émotions nobles comme la colère juste ou le courage ; et l'élément concupiscible (''epithumia'', ἐπιθυμία), siège des désirs et des passions<ref>Platon, ''République'', IV, 435a-442b, trad. P. Pachet, Gallimard, « Folio-Essais », 1993, p. 252-268</ref>. Cette tripartition permet à Platon d'expliquer les conflits intérieurs que vit l'homme et de fonder une éthique de l'harmonie psychique : la justice, pour l'individu comme pour la cité, consiste dans l'accord harmonieux de ces trois parties sous la direction de la raison. Dans le ''Timée'', Platon localise même ces trois parties dans le corps humain : la raison siège dans la tête, l'irascible dans la poitrine, et le concupiscible entre la poitrine et le nombril<ref>Platon, ''Timée'', 44d-70e, trad. L. Brisson, Flammarion, « GF », 1992, p. 142-168</ref>. Cette localisation, qui peut sembler naïve, illustre la volonté platonicienne de penser l'union de l'âme et du corps, tout en affirmant leur distinction fondamentale. === L'immortalité de l'âme : les arguments du ''Phédon'' === C'est dans le ''Phédon'' que Platon développe les arguments les plus élaborés en faveur de l'immortalité de l'âme, dialogue qui met en scène les dernières heures de Socrate avant sa mort. Socrate y affirme que le véritable philosophe passe sa vie à se préparer à la mort, puisque philosopher consiste précisément à séparer l'âme du corps, à se détacher des passions corporelles pour accéder à la contemplation des réalités intelligibles<ref>Platon, ''Phédon'', 64a-67b, trad. P. Vicaire, Les Belles Lettres, 1983, p. 18-22</ref>. Platon propose quatre arguments principaux pour démontrer l'immortalité de l'âme : '''1. L'argument cyclique''' : Toute chose naît de son contraire. Le vivant naît du mort comme le mort naît du vivant, le sommeil de la veille comme la veille du sommeil. Il doit donc exister un processus inverse à la mort par lequel les âmes reviennent à la vie, faute de quoi tout finirait par s'abîmer dans la mort<ref>Platon, ''Phédon'', 70c-72d, trad. P. Vicaire, Les Belles Lettres, 1983, p. 28-32</ref>. '''2. L'argument par la réminiscence''' (''anamnêsis'', ἀνάμνησις) : La connaissance véritable n'est pas acquisition mais ressouvenir. Lorsque nous reconnaissons deux objets comme égaux, nous les rapportons à une Idée de l'Égalité en soi que nous n'avons jamais rencontrée dans l'expérience sensible, puisque les choses sensibles ne sont jamais parfaitement égales. Nous devons donc avoir connu cette Idée avant notre naissance. Connaître, c'est se ressouvenir : l'âme a contemplé les Idées avant de s'incarner dans un corps, et elle les a oubliées en naissant<ref>Platon, ''Phédon'', 72e-77a, trad. P. Vicaire, Les Belles Lettres, 1983, p. 32-42</ref><ref>Platon, ''Ménon'', 81a-86c, trad. A. Croiset, Les Belles Lettres, 1970, p. 258-273</ref>. Cet argument implique donc à la fois la préexistence et l'immortalité de l'âme. '''3. L'argument par l'affinité''' : Les choses composées sont susceptibles de se dissoudre, tandis que les choses simples et immuables sont indissolubles. Or l'âme est simple et s'apparente aux réalités intelligibles, qui sont invisibles, immuables et éternelles. Elle ressemble au divin et à l'immortel, tandis que le corps ressemble au mortel et au périssable<ref>Platon, ''Phédon'', 78b-80c, trad. P. Vicaire, Les Belles Lettres, 1983, p. 44-52</ref>. L'âme ne peut donc pas être dissoute comme le corps. '''4. L'argument final''' : L'âme est le principe de la vie. Or un principe ne peut admettre le contraire de ce qu'il apporte. Comme le feu ne peut être froid ni la neige chaude, l'âme, qui apporte nécessairement la vie, ne peut recevoir la mort. Elle est donc immortelle et impérissable<ref>Platon, ''Phédon'', 102a-107b, trad. P. Vicaire, Les Belles Lettres, 1983, p. 108-124</ref>. === La théorie de la réminiscence et la connaissance === La théorie de la réminiscence (''anamnêsis'') ne vise pas seulement à prouver l'immortalité de l'âme, elle fonde également l'épistémologie platonicienne. Dans le ''Ménon'', Socrate interroge un jeune esclave ignorant en géométrie et le conduit, par ses seules questions, à découvrir comment construire un carré double d'un carré donné. Puisque l'esclave n'a rien appris de nouveau mais a seulement retrouvé en lui-même une connaissance qu'il possédait déjà, Socrate en conclut qu'apprendre n'est rien d'autre que se ressouvenir<ref>Platon, ''Ménon'', 82b-85b, trad. A. Croiset, Les Belles Lettres, 1970, p. 262-269</ref>. Cette doctrine répond à un sophisme avancé par Ménon : comment peut-on chercher ce qu'on ne connaît pas, puisqu'on ne sait même pas ce qu'on doit chercher ? Et comment chercher ce qu'on connaît déjà, puisqu'on le possède déjà<ref>Platon, ''Ménon'', 80d-e, trad. A. Croiset, Les Belles Lettres, 1970, p. 258</ref> ? La réminiscence résout ce paradoxe : nous avons déjà connu les vérités que nous cherchons, dans une existence antérieure de l'âme, mais nous les avons oubliées en naissant. La recherche philosophique consiste à réveiller ce savoir endormi. La théorie de la réminiscence suppose donc la croyance en la préexistence de l'âme et en sa familiarité native avec les Idées, ces réalités intelligibles, éternelles et immuables qui constituent le monde véritable. L'âme, avant de s'incarner, a contemplé les Idées dans leur pureté : la Justice en soi, la Beauté en soi, le Bien en soi<ref>Platon, ''Phèdre'', 246a-249d, trad. L. Brisson, Flammarion, « GF », 1989, p. 132-142</ref>. Lorsqu'elle rencontre dans le monde sensible des choses justes, belles ou bonnes, elle reconnaît en elles l'image imparfaite des Idées qu'elle a autrefois contemplées. == L'âme et le corps : dualisme et purification == La conception platonicienne établit un dualisme strict entre l'âme et le corps. Le corps est présenté comme un obstacle à la connaissance et à la vertu. Il nous enchaîne aux apparences sensibles, nous détourne de la contemplation des réalités intelligibles par ses besoins et ses désirs. Platon va jusqu'à dire que le corps est le tombeau de l'âme (''sôma-sêma'', σῶμα-σῆμα)<ref>Platon, ''Cratyle'', 400c, trad. C. Dalimier, Flammarion, « GF », 1998, p. 144</ref>, formule qui suggère que l'existence corporelle est une forme de mort pour l'âme. D'où la nécessité de la purification (''katharsis'', κάθαρσις). Le philosophe doit se détacher autant que possible du corps et de ses passions pour permettre à son âme de contempler les Idées. Cette purification n'est pas seulement intellectuelle, elle est aussi morale : elle consiste à pratiquer la tempérance, le courage, la justice et la sagesse<ref>Platon, ''Phédon'', 69a-c, trad. P. Vicaire, Les Belles Lettres, 1983, p. 24-26</ref>. Les vertus véritables ne consistent pas simplement à échanger un plaisir contre un autre ou une crainte contre une autre, mais à purifier l'âme de ses attachements corporels sous la conduite de la raison. Le mythe du ''Phèdre'' illustre cette conception en présentant l'âme comme un attelage ailé conduit par un cocher (la raison) qui doit maîtriser deux chevaux, l'un noble (l'irascible) et l'autre rétif (le concupiscible)<ref>Platon, ''Phèdre'', 246a-254e, trad. L. Brisson, Flammarion, « GF », 1989, p. 132-154</ref>. Lorsque l'âme parvient à maintenir l'harmonie de l'attelage, elle peut s'élever jusqu'au lieu supracéleste où elle contemple les Idées. Mais lorsqu'elle est dominée par le mauvais cheval, elle perd ses ailes et tombe dans un corps mortel. == La destinée de l'âme après la mort == Platon développe également une eschatologie complexe, qui décrit le destin des âmes après la mort du corps. Dans la ''République'', le mythe d'Er raconte comment les âmes sont jugées après la mort selon la vie qu'elles ont menée. Les âmes justes sont récompensées et contemplent le Bien, tandis que les âmes injustes sont punies<ref>Platon, ''République'', X, 614a-621d, trad. P. Pachet, Gallimard, « Folio-Essais », 1993, p. 528-545</ref>. Après un certain temps, les âmes choisissent une nouvelle vie et se réincarnent dans un corps humain ou animal selon leur choix. Le ''Phédon'' décrit également les différentes régions de l'Hadès où les âmes séjournent après la mort, en fonction de leur degré de pureté. Les âmes philosophes, qui se sont purifiées durant leur vie terrestre, habitent les régions les plus élevées et les plus lumineuses. Les âmes impures, alourdies par leurs attachements corporels, sont contraintes de se réincarner rapidement, parfois dans des corps d'animaux correspondant à leurs vices<ref>Platon, ''Phédon'', 107c-114c, trad. P. Vicaire, Les Belles Lettres, 1983, p. 124-140</ref>. Ces mythes eschatologiques ne sont pas de simples ornements poétiques. Ils ont une fonction éthique essentielle : ils incitent l'homme à prendre soin de son âme en menant une vie juste et en pratiquant la philosophie. Ils donnent également un sens à l'existence humaine en l'inscrivant dans une perspective cosmique où la justice finit toujours par triompher. == La question de l'unité de l'âme == La doctrine platonicienne de l'âme soulève une difficulté majeure : comment concilier la tripartition de l'âme (raison, irascible, concupiscible) avec son immortalité ? Si l'âme est composée de trois parties, ne devrait-elle pas être susceptible de se dissoudre comme tout ce qui est composé ? Platon ne résout pas explicitement cette difficulté. On peut néanmoins interpréter sa position de deux manières. D'une part, il est possible que seule la partie rationnelle de l'âme soit véritablement immortelle, les deux autres parties périssant avec le corps. Cette interprétation est suggérée par certains passages du ''Timée'' où Platon distingue la partie immortelle de l'âme, créée directement par le Démiurge, des parties mortelles, créées par les dieux inférieurs<ref>Platon, ''Timée'', 69c-e, trad. L. Brisson, Flammarion, « GF », 1992, p. 166-168</ref>. D'autre part, on peut considérer que la tripartition ne représente pas trois parties substantiellement distinctes, mais trois fonctions ou trois aspects d'une âme fondamentalement une. L'âme serait simple en son essence, mais manifesterait sa simplicité de manière différenciée selon qu'elle se rapporte aux Idées (partie rationnelle), au courage et à l'honneur (partie irascible), ou aux besoins corporels (partie concupiscible). == Aristote et la critique du dualisme platonicien == Aristote, disciple de Platon, critique vigoureusement le dualisme de son maître. Dans le ''De Anima'' (''De l'âme''), il définit l'âme comme « la forme d'un corps naturel ayant la vie en puissance » (''entéléchie première d'un corps naturel organisé'')<ref>Aristote, ''De l'âme'', II, 1, 412a19-21, trad. J. Tricot, Vrin, 1977, p. 67</ref>. L'âme n'est donc pas une substance séparée qui s'unirait accidentellement à un corps, mais la forme même, le principe d'organisation d'un corps vivant. Elle est au corps ce que la vision est à l'œil : on ne peut pas plus séparer l'âme du corps qu'on ne peut séparer la vision de l'œil. Cette conception hylémorphique (de ''hylê'', matière, et ''morphê'', forme) remet radicalement en cause l'immortalité de l'âme telle que la concevait Platon. Si l'âme est la forme du corps, elle ne peut lui survivre, de même que la forme d'une statue de bronze ne survit pas à la destruction de la statue. Aristote admet toutefois une exception pour l'intellect agent (''nous poiêtikos''), partie la plus haute de l'âme rationnelle, qui est « séparé, impassible et sans mélange », et qui seul pourrait être immortel<ref>Aristote, ''De l'âme'', III, 5, 430a10-25, trad. J. Tricot, Vrin, 1977, p. 186-187</ref>. Mais cette immortalité n'est plus personnelle : ce n'est pas l'individu Socrate qui survit, mais l'intellect en tant que tel, identique chez tous les hommes. == Postérité et transformations == La conception platonicienne de l'âme exercera une influence considérable sur toute la philosophie occidentale. Les néoplatoniciens, notamment Plotin, reprendront et approfondiront la doctrine de l'âme immortelle et de sa contemplation des Idées. Les Pères de l'Église, particulièrement Augustin, christianiseront la psychologie platonicienne en l'adaptant aux dogmes de la création, de la résurrection et de la grâce divine. Au XVIIe siècle, Descartes renouvellera le dualisme platonicien en distinguant radicalement la substance pensante (''res cogitans'') et la substance étendue (''res extensa'')<ref>René Descartes, ''Méditations métaphysiques'', Méditation sixième, AT, t. IX, p. 51-72</ref>. Mais là où Platon voyait une hiérarchie entre l'âme divine et le corps matériel, Descartes pose une distinction de nature entre deux substances également créées par Dieu. La modernité philosophique, de Locke à Kant, contestera de plus en plus la substantialité de l'âme et l'interprétera plutôt comme conscience, sujet ou personne. La psychologie scientifique contemporaine abandonnera finalement le concept d'âme au profit de notions empiriquement testables comme le psychisme, la conscience ou le cerveau. Pourtant, les questions soulevées par Platon demeurent vivantes : qu'est-ce qui fait l'identité et l'unité de la personne humaine ? L'homme peut-il se réduire à sa dimension corporelle ? Existe-t-il une dimension spirituelle irréductible à la matière ? == Enjeux philosophiques == La conception platonicienne de l'âme engage des enjeux multiples qui dépassent largement la seule question de la survie après la mort : '''Sur le plan épistémologique''', la théorie de la réminiscence fonde la possibilité de la connaissance universelle et nécessaire. Si nous pouvons connaître les vérités mathématiques et les principes moraux, c'est parce que notre âme est apparentée aux réalités intelligibles éternelles. La connaissance véritable n'est pas une construction empirique, mais une reconnaissance de ce que l'âme possède déjà en elle-même. '''Sur le plan éthique''', l'immortalité de l'âme fonde l'exigence morale. Si l'âme est immortelle, la vie présente n'est qu'un épisode dans son existence éternelle. Il importe donc de vivre justement, non pour obtenir des récompenses terrestres éphémères, mais pour assurer le salut de l'âme. La philosophie devient ainsi un « exercice de la mort », une préparation à la séparation de l'âme d'avec le corps<ref>Pierre Hadot, ''Exercices spirituels et philosophie antique'', Albin Michel, 2002, p. 21-58</ref>. '''Sur le plan anthropologique''', la conception platonicienne définit l'homme essentiellement par son âme rationnelle. Ce n'est pas le corps qui fait l'homme, mais l'âme qui pense, connaît et choisit. Comme le dit Socrate dans l'''Alcibiade'' : « L'homme, c'est l'âme »<ref>Platon, ''Alcibiade'', 130c, trad. C. Marbœuf et J.-F. Pradeau, Flammarion, « GF », 2000, p. 148</ref>. Cette définition aura des conséquences immenses pour la compréhension occidentale de la dignité humaine et de la liberté. '''Sur le plan politique''', enfin, la tripartition de l'âme fournit le modèle de l'organisation de la cité juste. De même que l'âme individuelle est juste lorsque la raison gouverne l'irascible et le concupiscible, la cité est juste lorsque les philosophes gouvernent les gardiens et les producteurs<ref>Platon, ''République'', IV, 441d-445e, trad. P. Pachet, Gallimard, « Folio-Essais », 1993, p. 266-272</ref>. La psychologie platonicienne fonde ainsi une théorie politique aristocratique où le pouvoir revient aux plus sages. == Conclusion == La notion platonicienne d'âme constitue l'un des piliers de la métaphysique occidentale. En faisant de l'âme une réalité immortelle, principe de connaissance et instance morale, Platon a profondément marqué la manière dont l'Occident pense l'homme et son rapport au monde. Si la science contemporaine a largement abandonné le concept d'âme, les questions qu'il soulevait demeurent au cœur de la réflexion philosophique sur la conscience, l'identité personnelle, la liberté et la dignité humaine. La grandeur de Platon réside moins dans les réponses qu'il a données que dans la profondeur et la richesse des questions qu'il a su formuler, questions qui continuent d'animer la pensée philosophique plus de deux millénaires après sa mort. == Notes et références == <references /> == Bibliographie sélective == * '''Textes de Platon''' : ** ''Phédon'', trad. M. Dixsaut, Flammarion, « GF », 1991 ** ''Ménon'', trad. M. Canto-Sperber, Flammarion, « GF », 1993 ** ''République'', trad. P. Pachet, Gallimard, « Folio-Essais », 1993 ** ''Phèdre'', trad. L. Brisson, Flammarion, « GF », 1989 ** ''Timée'', trad. L. Brisson, Flammarion, « GF », 1992 * '''Études''' : ** HADOT Pierre, ''Qu'est-ce que la philosophie antique ?'', Gallimard, 1995 ** BRISSON Luc, ''Platon, les mots et les mythes'', La Découverte, 1994 ** DIXSAUT Monique, ''Platon et la question de l'âme'', Vrin, 2013 ** DORTER Kenneth, ''Plato's Phaedo: An Interpretation'', University of Toronto Press, 1982 ** HADOT Pierre, ''Exercices spirituels et philosophie antique'', Albin Michel, 2002 ** DETIENNE Marcel, ''De la pensée religieuse à la pensée philosophique. La notion de daimôn dans le pythagorisme ancien'', Les Belles Lettres, 1963 * '''Ouvrages généraux''' : ** ROBIN Léon, ''La Pensée grecque et les origines de l'esprit scientifique'', Albin Michel, 1923 ** BRÉHIER Émile, ''Histoire de la philosophie'', tome I : ''L'Antiquité et le Moyen Âge'', PUF, 1981 {{Autocat}} 246hh0dvaajc8mmt3r7d9xzyorlux6b Dictionnaire de philosophie/Amitié 0 83033 768151 752866 2026-06-19T04:14:23Z PandaMystique 119061 Bot : ajout du paramètre lecture=oui au modèle {{DicoPhilo}} 768151 wikitext text/x-wiki {{DicoPhilo|- Amitié -|lecture=oui}} L'amitié occupe une place singulière dans l'histoire de la pensée philosophique : rarement au centre des systèmes, elle traverse néanmoins toute la tradition occidentale comme un thème insistant, parfois marginal mais toujours porteur d'enjeux éthiques et politiques considérables. Ni simple sentiment privé, ni institution sociale codifiée, l'amitié se situe dans un entre-deux qui interroge notre rapport à autrui, à la communauté et à nous-mêmes. ==L'amitié dans l'Antiquité grecque== ===La ''philia'' chez Aristote : matrice de la réflexion philosophique=== C'est dans l'Antiquité grecque que s'élabore la première théorisation systématique de l'amitié. Aristote consacre deux livres entiers de l'''Éthique à Nicomaque'' (VIII et IX) à la ''philia'', terme grec qui recouvre un champ sémantique plus large que notre « amitié » moderne, englobant diverses formes d'attachement et d'affection<ref>Aristote, ''Éthique à Nicomaque'', livres VIII-IX, trad. J. Tricot, Paris, Vrin, 1959, p. 381-456</ref>. Pour le Stagirite, l'amitié n'est pas un sentiment marginal mais une vertu cardinale, voire la condition même du bonheur : « Nul ne choisirait de vivre sans amis, eût-il tous les autres biens »<ref>Aristote, ''Éthique à Nicomaque'', VIII, 1, 1155a5, trad. J. Tricot, Paris, Vrin, 1959, p. 381</ref>. Aristote distingue trois formes d'amitié selon leur objet : l'amitié utile (fondée sur l'intérêt mutuel), l'amitié plaisante (fondée sur l'agrément) et l'amitié vertueuse (fondée sur la bonté réciproque des caractères)<ref>Aristote, ''Éthique à Nicomaque'', VIII, 3, 1156a6-1156b7, trad. J. Tricot, Paris, Vrin, 1959, p. 387-389</ref>. Seule cette dernière constitue l'amitié véritable (''philia teleia''), car elle vise l'ami pour lui-même et non pour ce qu'il apporte. Cette amitié parfaite exige l'égalité, la réciprocité et la vertu : deux hommes de bien s'aiment parce qu'ils reconnaissent en l'autre un « autre soi-même » (''allos autos'')<ref>Aristote, ''Éthique à Nicomaque'', IX, 4, 1166a30-32, trad. J. Tricot, Paris, Vrin, 1959, p. 428</ref>. L'ami est ainsi un miroir dans lequel le sujet vertueux se reconnaît et se réalise. La conception aristotélicienne articule étroitement amitié et politique : la ''philia'' est le ciment de la cité, plus fondamentale que la justice elle-même, car là où règne l'amitié, la justice devient superflue<ref>Aristote, ''Éthique à Nicomaque'', VIII, 1, 1155a22-28, trad. J. Tricot, Paris, Vrin, 1959, p. 382</ref>. Cette dimension politique de l'amitié traverse toute la pensée grecque : elle désigne moins un sentiment intime qu'un lien social structurant, une forme de solidarité civique entre citoyens partageant une même conception du bien<ref>Christophe Perrin, « Égalité et réciprocité : les clés de la philia aristotélicienne », ''Le Philosophoire'', 2007/2, n° 29, p. 259-280</ref>. ===Platon et la quête dialogique : l'amitié comme voie vers la sagesse=== Avant Aristote, Platon avait exploré la question dans le ''Lysis'', dialogue aporétique qui ne parvient pas à définir positivement l'amitié mais en révèle la complexité<ref>Platon, ''Lysis'', trad. L. Robin, Paris, Les Belles Lettres, 1950</ref>. Socrate y examine successivement diverses hypothèses : l'amitié naît-elle entre semblables ou entre contraires ? Est-elle le fait du bon envers le bon, ou du ni-bon-ni-mauvais envers le bon ? Le dialogue s'achève sans réponse définitive, mais suggère que l'amitié véritable est désir de ce qui nous manque et aspiration au bien<ref>Platon, ''Lysis'', 214b-222e</ref>. L'amitié platonicienne s'inscrit ainsi dans une dynamique ascendante : elle est une forme de l'amour (''éros'') qui conduit l'âme vers la contemplation des Idées et du Bien en soi. Dans la pratique même du dialogue socratique, l'amitié se révèle condition de la philosophie : c'est dans la bienveillance réciproque et la confiance mutuelle que peut s'épanouir la recherche commune de la vérité. Sans cette disposition amicale, le dialogue dégénère en joute éristique où chacun cherche à vaincre l'autre plutôt qu'à atteindre ensemble le vrai<ref>Paul de Guerry, « Amitié et autarcie dans le Lysis de Platon », ''Revue Ithaque'', n°1, 2007</ref>. ==L'amitié à Rome : entre vertu et pragmatisme== ===Cicéron et l'idéal de l'amitié vertueuse=== La pensée romaine hérite de la réflexion grecque tout en l'infléchissant. Dans le ''Laelius de amicitia'', Cicéron reprend largement les analyses aristotéliciennes mais les teinte d'un stoïcisme romain attentif aux dimensions pratiques et morales de l'existence<ref>Cicéron, ''Laelius de amicitia'', trad. R. Combès, Paris, Les Belles Lettres, 1983</ref>. Pour lui, l'amitié est d'abord affaire de vertu : seuls les hommes de bien (''boni viri'') peuvent nouer de véritables amitiés, car l'amitié exige une communauté de valeurs morales<ref>Cicéron, ''Laelius de amicitia'', V, 18-20, trad. R. Combès, Paris, Les Belles Lettres, 1983, p. 12-14</ref>. « Priver la vie d'amitié, c'est comme priver le monde du soleil », déclare Laelius, faisant de l'amitié un bien suprême, nécessaire au bonheur<ref>Cicéron, ''Laelius de amicitia'', XIII, 47, trad. R. Combès, Paris, Les Belles Lettres, 1983, p. 32</ref>. Cependant, la vision cicéronienne de l'amitié est également traversée par une tension proprement romaine. Dans une société fortement hiérarchisée, où les réseaux de clientèle (''clientela'') et les alliances politiques (''amicitia'') structurent la vie publique, le vocabulaire de l'amitié recouvre souvent des relations d'intérêt et de pouvoir<ref>Iddo Shvueli, ''L'amitié chez Cicéron, entre un concept philosophique et une notion sociale'', thèse de doctorat, Université Paris-Sorbonne, 2014</ref>. Cicéron lui-même navigue entre l'idéal philosophique d'une amitié désintéressée et la réalité politique d'un réseau d'alliances nécessaires à sa carrière. Cette ambiguïté révèle une question fondamentale : l'amitié peut-elle vraiment se penser indépendamment des rapports de pouvoir et d'utilité sociale ? ===Le stoïcisme et l'amitié cosmopolitique=== Les philosophes stoïciens, de Sénèque à Marc-Aurèle, développent une conception de l'amitié enracinée dans leur vision cosmopolitique de l'humanité. Pour eux, tous les êtres rationnels participent du même ''logos'' universel et forment une seule communauté, celle de la cité du monde<ref>Marc-Aurèle, ''Pensées pour moi-même'', IV, 4, trad. E. Bréhier, Paris, Les Belles Lettres, 1962</ref>. L'amitié véritable repose sur la reconnaissance de cette parenté fondamentale : « Nous ne sommes pas faits pour nous-mêmes, mais pour les autres », écrit Marc-Aurèle<ref>Marc-Aurèle, ''Pensées pour moi-même'', V, 16, trad. E. Bréhier, Paris, Les Belles Lettres, 1962</ref>. Dans ses ''Lettres à Lucilius'', Sénèque fait de l'amitié un exercice spirituel : devenir ami d'un sage, c'est progresser soi-même dans la sagesse. L'ami devient un miroir moral, un compagnon dans la quête de la vertu et de la tranquillité de l'âme (''ataraxia'')<ref>Sénèque, ''Lettres à Lucilius'', III, 2-3, trad. H. Noblot, Paris, Les Belles Lettres, 1945</ref>. Cette amitié philosophique transcende les contingences sociales : le sage peut être ami d'un esclave si celui-ci cultive sa raison et sa vertu. ===L'épicurisme : l'amitié comme condition du bonheur=== À rebours de la tradition platonicienne et aristotélicienne, Épicure fait de l'amitié l'un des piliers de sa philosophie du bonheur. Dans la ''Lettre à Ménécée'', il affirme que « de toutes les choses que la sagesse procure en vue de la félicité de la vie tout entière, de beaucoup la plus importante est la possession de l'amitié »<ref>Épicure, ''Maximes capitales'', XXVII, in ''Lettres et Maximes'', trad. M. Conche, Paris, PUF, 1987, p. 221</ref>. L'amitié assure la sécurité (''asphaleia'') de l'âme : savoir que l'on peut compter sur des amis fidèles procure cette tranquillité d'esprit (''ataraxia'') qui est le cœur de l'eudémonisme épicurien. Mais cette insistance sur l'utilité de l'amitié pour le bonheur personnel pose problème : l'amitié épicurienne n'est-elle qu'un calcul égoïste, une forme raffinée d'intérêt bien compris ? Épicure lui-même semble avoir anticipé cette objection en distinguant l'origine utilitaire de l'amitié (on recherche d'abord la sécurité) de sa nature véritable une fois établie : on en vient à aimer l'ami pour lui-même, et le sage est prêt à mourir pour un ami<ref>Cicéron, ''De finibus bonorum et malorum'', I, 65-70, évoquant les débats au sein de l'école épicurienne</ref>. L'amitié épicurienne révèle ainsi une tension féconde entre utilité et désintéressement. ==L'amitié à l'époque moderne== ===Montaigne et La Boétie : « Parce que c'était lui, parce que c'était moi »=== La Renaissance voit émerger une nouvelle sensibilité à l'amitié, dont Michel de Montaigne offre l'expression la plus saisissante. Dans le chapitre « De l'amitié » des ''Essais'' (I, XXVIII), Montaigne évoque son amitié avec Étienne de La Boétie, brutalement interrompue par la mort prématurée de ce dernier en 1563<ref>Michel de Montaigne, ''Essais'', I, XXVIII, éd. P. Villey, Paris, PUF, 1992, p. 183-198</ref>. Cette amitié devient pour lui le modèle indépassable d'une relation qui transcende toutes les catégories habituelles : ni intérêt, ni plaisir, ni utilité ne peuvent l'expliquer. Face à l'interrogation sur les raisons de cet attachement, Montaigne ne peut que répondre par la fameuse formule : « Si on me presse de dire pourquoi je l'aimais, je sens que cela ne se peut exprimer qu'en répondant : "Parce que c'était lui ; parce que c'était moi" »<ref>Michel de Montaigne, ''Essais'', I, XXVIII, éd. P. Villey, Paris, PUF, 1992, p. 188</ref>. Cette formule énigmatique marque un tournant dans la pensée de l'amitié : elle soustrait celle-ci à toute rationalisation, à tout calcul, pour la situer dans l'ordre de l'évidence inexplicable, de la reconnaissance immédiate. L'amitié montaignienne repose sur un « mélange si universel » des âmes qu'elles « effacent et ne retrouvent plus la couture qui les a jointes »<ref>Michel de Montaigne, ''Essais'', I, XXVIII, éd. P. Villey, Paris, PUF, 1992, p. 188</ref>. Cette fusion des âmes, cette confusion des identités, fait de l'amitié un mode d'être-ensemble absolument singulier, irréductible aux liens familiaux, amoureux ou sociaux. L'amitié de Montaigne et La Boétie possède également une dimension politique. Les deux hommes partagent un idéal humaniste et une même préoccupation pour les questions de la liberté et de la servitude, comme en témoigne le célèbre ''Discours de la servitude volontaire'' de La Boétie. Leur amitié devient ainsi le lieu d'une résistance à la tyrannie et d'une affirmation de la liberté du jugement<ref>Christophe Litwin, « La cause perdue de l'amitié républicaine de La Boétie à Montaigne », ''Montaigne Studies'', n° 28, 2016, p. 95-108</ref>. ===Kant : l'amitié entre devoir et sentiment=== La philosophie des Lumières, et particulièrement Kant, soumet l'amitié à l'examen critique de la raison. Dans la ''Doctrine de la vertu'' (seconde partie de la ''Métaphysique des mœurs''), Kant définit l'amitié comme « l'union de deux personnes liées par un amour réciproque et un égal respect »<ref>Emmanuel Kant, ''Métaphysique des mœurs, Doctrine de la vertu'', § 46, trad. A. Philonenko, Paris, Vrin, 1968, p. 143</ref>. Cette définition révèle la tension constitutive de l'amitié kantienne : celle entre l'amour (qui pousse au rapprochement) et le respect (qui impose la distance). L'amitié exige un équilibre fragile entre ces deux forces, équilibre que Kant juge quasi impossible à réaliser parfaitement. Pour Kant, l'amitié parfaite est donc une « Idée » régulatrice plutôt qu'une réalité empirique<ref>Emmanuel Kant, ''Métaphysique des mœurs, Doctrine de la vertu'', § 46, trad. A. Philonenko, Paris, Vrin, 1968, p. 144</ref>. Néanmoins, aspirer à cette Idée constitue un « devoir de vertu » : nous devons cultiver l'amitié, car elle manifeste notre dignité morale et contribue à notre bonheur. La conception kantienne inscrit ainsi l'amitié dans l'ordre du devoir moral, la dépassionnant et la moralisant, au risque peut-être d'en assécher la spontanéité et la gratuité. ==L'amitié dans la philosophie contemporaine== ===Nietzsche : l'amitié stellaire et l'amour du lointain=== Nietzsche rompt avec la tradition philosophique en proposant une conception de l'amitié qui s'écarte délibérément des modèles grecs de la proximité et de la ressemblance. Dans ''Ainsi parlait Zarathoustra'', il récuse l'« amour du prochain » chrétien, qu'il juge hypocrite et grégaire, pour lui préférer l'« amour du lointain »<ref>Friedrich Nietzsche, ''Ainsi parlait Zarathoustra'', I, « De l'amour du prochain », trad. M. de Gandillac, Paris, Gallimard, 1971, p. 82-84</ref>. L'ami nietzschéen n'est pas celui qui nous rassure dans nos certitudes mais celui qui nous pousse à nous dépasser, à devenir ce que nous sommes. Dans ''Le Gai Savoir'', Nietzsche développe la métaphore de l'« amitié stellaire » : les vrais amis sont comme des étoiles qui « poursuivent des orbites si différentes » qu'ils peuvent sembler s'être perdus de vue, mais « leur foi en notre amitié stellaire demeure inébranlable »<ref>Friedrich Nietzsche, ''Le Gai Savoir'', § 279, trad. P. Klossowski, Paris, Gallimard, 1967, p. 220</ref>. Cette distance respectueuse, loin de menacer l'amitié, en constitue la noblesse : elle préserve la liberté et la singularité de chacun tout en maintenant un lien profond. La pensée nietzschéenne de l'amitié s'articule à sa critique de la morale et à sa philosophie de la volonté de puissance. L'ami authentique est celui qui favorise notre croissance spirituelle, qui nous défie et nous stimule plutôt que de nous conforter dans la médiocrité<ref>Friedrich Nietzsche, ''Humain, trop humain'', I, § 376, trad. R. Rovini, Paris, Gallimard, 1968, p. 251</ref>. Cette conception aristocratique et agonistique de l'amitié a influencé de nombreux penseurs du XXe siècle. ===Derrida et les apories de l'amitié=== Jacques Derrida consacre un ouvrage majeur à la question de l'amitié : ''Politiques de l'amitié'' (1994). S'appuyant sur une déconstruction de la tradition philosophique, de Platon à Carl Schmitt en passant par Montaigne et Nietzsche, Derrida met au jour les apories qui travaillent le concept d'amitié<ref>Jacques Derrida, ''Politiques de l'amitié'', Paris, Galilée, 1994</ref>. Il part d'une phrase mystérieuse attribuée à Aristote par Montaigne : « Ô mes amis, il n'y a nul ami », phrase dont il démonte patiemment les paradoxes et les implications. Pour Derrida, l'amitié est travaillée par une dissymétrie originaire : on ne peut parler d'amitié que de celui qui aime vers celui qui est aimé, jamais dans l'autre sens<ref>Jacques Derrida, ''Politiques de l'amitié'', Paris, Galilée, 1994, p. 23-48</ref>. L'amitié est donc toujours déjà marquée par une non-réciprocité, une dissymétrie temporelle (l'un aime avant l'autre, ou après lui) qui interdit toute fusion ou transparence parfaite. Cette « amitié sans amitié » ouvre un espace politique inédit : ni fraternité (trop liée à la filiation et à l'identité), ni simple contrat, l'amitié derridienne serait une forme de lien social qui accueille l'altérité radicale, l'étranger, celui qui n'est ni proche ni familier. ===Hannah Arendt : l'amitié comme espace politique=== Hannah Arendt développe une conception originale de l'amitié, qu'elle distingue soigneusement de l'amour et de la compassion. Dans son essai « De l'humanité dans de "sombres temps" : réflexions sur Lessing », elle écrit : « Nous avons coutume aujourd'hui de ne voir dans l'amitié qu'un phénomène de l'intimité, où les amis s'ouvrent leur âme sans tenir compte du monde et de ses exigences »<ref>Hannah Arendt, « De l'humanité dans de "sombres temps" », in ''Vies politiques'', Paris, Gallimard, 1974, p. 23</ref>. Or pour Arendt, c'est méconnaître la dimension proprement politique de l'amitié. L'amitié, telle que la pratiquaient les Grecs, est d'abord un dialogue, une pratique de la parole partagée qui fait advenir un monde commun entre les interlocuteurs. « L'essence de l'amitié consistait dans le dialogue », affirme-t-elle, ajoutant que ce dialogue permettait d'« humaniser » le monde en le rendant discutable, en le soumettant à la pluralité des perspectives<ref>Hannah Arendt, « De l'humanité dans de "sombres temps" », in ''Vies politiques'', Paris, Gallimard, 1974, p. 28-35</ref>. L'amitié devient ainsi un espace de résistance contre la tyrannie et le totalitarisme : lorsque la sphère publique se dégrade ou disparaît, l'amitié maintient ouverte la possibilité d'un monde partagé. Dans une lettre célèbre à Gershom Scholem, Arendt écrit : « De ma vie, je n'ai jamais "aimé" aucun peuple, ni aucune collectivité [...]. Je reconnais que je n'aime en effet que mes amis ; et que la seule sorte d'amour que je connaisse et en laquelle je crois est l'amour pour des personnes »<ref>Hannah Arendt, lettre à Gershom Scholem, 24 juillet 1963, in ''Vies politiques'', Paris, Gallimard, 1974</ref>. Cette déclaration, loin d'être une profession d'apolitisme, affirme au contraire la primauté de l'amitié comme lien politique authentique, contre les formes dégradées de solidarité collective (nationalisme, identitarisme, conformisme de masse). ==Enjeux contemporains : l'amitié au-delà de l'intime== La philosophie contemporaine continue d'interroger l'amitié, notamment face aux transformations des modes de sociabilité à l'ère numérique et à la marchandisation croissante des relations sociales. Plusieurs questions demeurent vives. Premièrement, l'amitié peut-elle vraiment se penser indépendamment des rapports de pouvoir et d'intérêt ? Les analyses sociologiques montrent que les réseaux amicaux reproduisent souvent les hiérarchies sociales et contribuent à la reproduction des inégalités. Comment concilier l'idéal philosophique d'une amitié désintéressée avec cette réalité sociale ? Deuxièmement, quelle place pour l'amitié dans une société démocratique ? Les pensées de Derrida et d'Arendt suggèrent que l'amitié pourrait constituer un modèle alternatif de lien politique, ni fusionnel ni contractuel, respectueux de la pluralité et de l'altérité. Mais une politique de l'amitié est-elle praticable à grande échelle, ou demeure-t-elle une utopie aristocratique ? Troisièmement, comment penser l'amitié à l'ère des réseaux sociaux et des « amis » virtuels ? Le philosophe C. S. Lewis, dans ''The Four Loves'', distinguait la véritable amitié (''philia'') de la simple camaraderie ou affection<ref>C. S. Lewis, ''The Four Loves'', London, Geoffrey Bles, 1960, p. 57-90</ref>. Cette distinction reste-t-elle pertinente lorsque la frontière entre amitié et réseau social devient poreuse ? ==Conclusion== L'amitié, depuis les Grecs jusqu'à nos jours, reste une énigme philosophique productive. Ni simple sentiment, ni institution sociale, elle échappe aux catégories habituelles de la pensée morale et politique. Tour à tour fondement de la cité (Aristote), voie d'accès à la vérité (Platon), exercice spirituel (Sénèque), évidence inexplicable (Montaigne), devoir moral (Kant), amour du lointain (Nietzsche), accueil de l'altérité (Derrida) ou dialogue humanisant (Arendt), l'amitié manifeste notre capacité à nouer des liens qui ne se réduisent ni à la nécessité biologique, ni au calcul utilitaire, ni à l'obligation juridique. Paradoxalement, cette résistance de l'amitié aux définitions trop rigides fait peut-être sa richesse philosophique : elle nous rappelle que l'existence humaine ne saurait se réduire à un système, qu'il reste toujours un espace pour la gratuité, la singularité, la rencontre imprévisible. Dans un monde où tout tend à se marchandiser et se rationaliser, l'amitié demeure ce lieu fragile mais irréductible où se manifeste notre humanité commune et notre liberté partagée. == Notes et références == {{references}} ==Bibliographie sélective== * Aristote, ''Éthique à Nicomaque'', livres VIII-IX, trad. J. Tricot, Paris, Vrin, 1959 * Cicéron, ''Laelius de amicitia'', trad. R. Combès, Paris, Les Belles Lettres, 1983 * Michel de Montaigne, ''Essais'', I, XXVIII, éd. P. Villey, Paris, PUF, 1992 * Emmanuel Kant, ''Métaphysique des mœurs, Doctrine de la vertu'', trad. A. Philonenko, Paris, Vrin, 1968 * Friedrich Nietzsche, ''Le Gai Savoir'', trad. P. Klossowski, Paris, Gallimard, 1967 * Jacques Derrida, ''Politiques de l'amitié'', Paris, Galilée, 1994 * Hannah Arendt, ''Vies politiques'', Paris, Gallimard, 1974 * Jean-Claude Fraisse, ''Philia. La Notion d'amitié dans la philosophie antique'', Paris, Vrin, 1974 * David Konstan, ''Friendship in the Classical World'', Cambridge, Cambridge University Press, 1997 {{Autocat}} [[Catégorie:Éthique]] [[Catégorie:Philosophie antique]] [[Catégorie:Philosophie politique]] [[Catégorie:Vertu]] s0mb27dpe7czletfecr8omm9lr22q6q 768159 768151 2026-06-19T04:16:01Z PandaMystique 119061 768159 wikitext text/x-wiki {{DicoPhilo|Amitié|lecture=oui}} L'amitié occupe une place singulière dans l'histoire de la pensée philosophique : rarement au centre des systèmes, elle traverse néanmoins toute la tradition occidentale comme un thème insistant, parfois marginal mais toujours porteur d'enjeux éthiques et politiques considérables. Ni simple sentiment privé, ni institution sociale codifiée, l'amitié se situe dans un entre-deux qui interroge notre rapport à autrui, à la communauté et à nous-mêmes. ==L'amitié dans l'Antiquité grecque== ===La ''philia'' chez Aristote : matrice de la réflexion philosophique=== C'est dans l'Antiquité grecque que s'élabore la première théorisation systématique de l'amitié. Aristote consacre deux livres entiers de l'''Éthique à Nicomaque'' (VIII et IX) à la ''philia'', terme grec qui recouvre un champ sémantique plus large que notre « amitié » moderne, englobant diverses formes d'attachement et d'affection<ref>Aristote, ''Éthique à Nicomaque'', livres VIII-IX, trad. J. Tricot, Paris, Vrin, 1959, p. 381-456</ref>. Pour le Stagirite, l'amitié n'est pas un sentiment marginal mais une vertu cardinale, voire la condition même du bonheur : « Nul ne choisirait de vivre sans amis, eût-il tous les autres biens »<ref>Aristote, ''Éthique à Nicomaque'', VIII, 1, 1155a5, trad. J. Tricot, Paris, Vrin, 1959, p. 381</ref>. Aristote distingue trois formes d'amitié selon leur objet : l'amitié utile (fondée sur l'intérêt mutuel), l'amitié plaisante (fondée sur l'agrément) et l'amitié vertueuse (fondée sur la bonté réciproque des caractères)<ref>Aristote, ''Éthique à Nicomaque'', VIII, 3, 1156a6-1156b7, trad. J. Tricot, Paris, Vrin, 1959, p. 387-389</ref>. Seule cette dernière constitue l'amitié véritable (''philia teleia''), car elle vise l'ami pour lui-même et non pour ce qu'il apporte. Cette amitié parfaite exige l'égalité, la réciprocité et la vertu : deux hommes de bien s'aiment parce qu'ils reconnaissent en l'autre un « autre soi-même » (''allos autos'')<ref>Aristote, ''Éthique à Nicomaque'', IX, 4, 1166a30-32, trad. J. Tricot, Paris, Vrin, 1959, p. 428</ref>. L'ami est ainsi un miroir dans lequel le sujet vertueux se reconnaît et se réalise. La conception aristotélicienne articule étroitement amitié et politique : la ''philia'' est le ciment de la cité, plus fondamentale que la justice elle-même, car là où règne l'amitié, la justice devient superflue<ref>Aristote, ''Éthique à Nicomaque'', VIII, 1, 1155a22-28, trad. J. Tricot, Paris, Vrin, 1959, p. 382</ref>. Cette dimension politique de l'amitié traverse toute la pensée grecque : elle désigne moins un sentiment intime qu'un lien social structurant, une forme de solidarité civique entre citoyens partageant une même conception du bien<ref>Christophe Perrin, « Égalité et réciprocité : les clés de la philia aristotélicienne », ''Le Philosophoire'', 2007/2, n° 29, p. 259-280</ref>. ===Platon et la quête dialogique : l'amitié comme voie vers la sagesse=== Avant Aristote, Platon avait exploré la question dans le ''Lysis'', dialogue aporétique qui ne parvient pas à définir positivement l'amitié mais en révèle la complexité<ref>Platon, ''Lysis'', trad. L. Robin, Paris, Les Belles Lettres, 1950</ref>. Socrate y examine successivement diverses hypothèses : l'amitié naît-elle entre semblables ou entre contraires ? Est-elle le fait du bon envers le bon, ou du ni-bon-ni-mauvais envers le bon ? Le dialogue s'achève sans réponse définitive, mais suggère que l'amitié véritable est désir de ce qui nous manque et aspiration au bien<ref>Platon, ''Lysis'', 214b-222e</ref>. L'amitié platonicienne s'inscrit ainsi dans une dynamique ascendante : elle est une forme de l'amour (''éros'') qui conduit l'âme vers la contemplation des Idées et du Bien en soi. Dans la pratique même du dialogue socratique, l'amitié se révèle condition de la philosophie : c'est dans la bienveillance réciproque et la confiance mutuelle que peut s'épanouir la recherche commune de la vérité. Sans cette disposition amicale, le dialogue dégénère en joute éristique où chacun cherche à vaincre l'autre plutôt qu'à atteindre ensemble le vrai<ref>Paul de Guerry, « Amitié et autarcie dans le Lysis de Platon », ''Revue Ithaque'', n°1, 2007</ref>. ==L'amitié à Rome : entre vertu et pragmatisme== ===Cicéron et l'idéal de l'amitié vertueuse=== La pensée romaine hérite de la réflexion grecque tout en l'infléchissant. Dans le ''Laelius de amicitia'', Cicéron reprend largement les analyses aristotéliciennes mais les teinte d'un stoïcisme romain attentif aux dimensions pratiques et morales de l'existence<ref>Cicéron, ''Laelius de amicitia'', trad. R. Combès, Paris, Les Belles Lettres, 1983</ref>. Pour lui, l'amitié est d'abord affaire de vertu : seuls les hommes de bien (''boni viri'') peuvent nouer de véritables amitiés, car l'amitié exige une communauté de valeurs morales<ref>Cicéron, ''Laelius de amicitia'', V, 18-20, trad. R. Combès, Paris, Les Belles Lettres, 1983, p. 12-14</ref>. « Priver la vie d'amitié, c'est comme priver le monde du soleil », déclare Laelius, faisant de l'amitié un bien suprême, nécessaire au bonheur<ref>Cicéron, ''Laelius de amicitia'', XIII, 47, trad. R. Combès, Paris, Les Belles Lettres, 1983, p. 32</ref>. Cependant, la vision cicéronienne de l'amitié est également traversée par une tension proprement romaine. Dans une société fortement hiérarchisée, où les réseaux de clientèle (''clientela'') et les alliances politiques (''amicitia'') structurent la vie publique, le vocabulaire de l'amitié recouvre souvent des relations d'intérêt et de pouvoir<ref>Iddo Shvueli, ''L'amitié chez Cicéron, entre un concept philosophique et une notion sociale'', thèse de doctorat, Université Paris-Sorbonne, 2014</ref>. Cicéron lui-même navigue entre l'idéal philosophique d'une amitié désintéressée et la réalité politique d'un réseau d'alliances nécessaires à sa carrière. Cette ambiguïté révèle une question fondamentale : l'amitié peut-elle vraiment se penser indépendamment des rapports de pouvoir et d'utilité sociale ? ===Le stoïcisme et l'amitié cosmopolitique=== Les philosophes stoïciens, de Sénèque à Marc-Aurèle, développent une conception de l'amitié enracinée dans leur vision cosmopolitique de l'humanité. Pour eux, tous les êtres rationnels participent du même ''logos'' universel et forment une seule communauté, celle de la cité du monde<ref>Marc-Aurèle, ''Pensées pour moi-même'', IV, 4, trad. E. Bréhier, Paris, Les Belles Lettres, 1962</ref>. L'amitié véritable repose sur la reconnaissance de cette parenté fondamentale : « Nous ne sommes pas faits pour nous-mêmes, mais pour les autres », écrit Marc-Aurèle<ref>Marc-Aurèle, ''Pensées pour moi-même'', V, 16, trad. E. Bréhier, Paris, Les Belles Lettres, 1962</ref>. Dans ses ''Lettres à Lucilius'', Sénèque fait de l'amitié un exercice spirituel : devenir ami d'un sage, c'est progresser soi-même dans la sagesse. L'ami devient un miroir moral, un compagnon dans la quête de la vertu et de la tranquillité de l'âme (''ataraxia'')<ref>Sénèque, ''Lettres à Lucilius'', III, 2-3, trad. H. Noblot, Paris, Les Belles Lettres, 1945</ref>. Cette amitié philosophique transcende les contingences sociales : le sage peut être ami d'un esclave si celui-ci cultive sa raison et sa vertu. ===L'épicurisme : l'amitié comme condition du bonheur=== À rebours de la tradition platonicienne et aristotélicienne, Épicure fait de l'amitié l'un des piliers de sa philosophie du bonheur. Dans la ''Lettre à Ménécée'', il affirme que « de toutes les choses que la sagesse procure en vue de la félicité de la vie tout entière, de beaucoup la plus importante est la possession de l'amitié »<ref>Épicure, ''Maximes capitales'', XXVII, in ''Lettres et Maximes'', trad. M. Conche, Paris, PUF, 1987, p. 221</ref>. L'amitié assure la sécurité (''asphaleia'') de l'âme : savoir que l'on peut compter sur des amis fidèles procure cette tranquillité d'esprit (''ataraxia'') qui est le cœur de l'eudémonisme épicurien. Mais cette insistance sur l'utilité de l'amitié pour le bonheur personnel pose problème : l'amitié épicurienne n'est-elle qu'un calcul égoïste, une forme raffinée d'intérêt bien compris ? Épicure lui-même semble avoir anticipé cette objection en distinguant l'origine utilitaire de l'amitié (on recherche d'abord la sécurité) de sa nature véritable une fois établie : on en vient à aimer l'ami pour lui-même, et le sage est prêt à mourir pour un ami<ref>Cicéron, ''De finibus bonorum et malorum'', I, 65-70, évoquant les débats au sein de l'école épicurienne</ref>. L'amitié épicurienne révèle ainsi une tension féconde entre utilité et désintéressement. ==L'amitié à l'époque moderne== ===Montaigne et La Boétie : « Parce que c'était lui, parce que c'était moi »=== La Renaissance voit émerger une nouvelle sensibilité à l'amitié, dont Michel de Montaigne offre l'expression la plus saisissante. Dans le chapitre « De l'amitié » des ''Essais'' (I, XXVIII), Montaigne évoque son amitié avec Étienne de La Boétie, brutalement interrompue par la mort prématurée de ce dernier en 1563<ref>Michel de Montaigne, ''Essais'', I, XXVIII, éd. P. Villey, Paris, PUF, 1992, p. 183-198</ref>. Cette amitié devient pour lui le modèle indépassable d'une relation qui transcende toutes les catégories habituelles : ni intérêt, ni plaisir, ni utilité ne peuvent l'expliquer. Face à l'interrogation sur les raisons de cet attachement, Montaigne ne peut que répondre par la fameuse formule : « Si on me presse de dire pourquoi je l'aimais, je sens que cela ne se peut exprimer qu'en répondant : "Parce que c'était lui ; parce que c'était moi" »<ref>Michel de Montaigne, ''Essais'', I, XXVIII, éd. P. Villey, Paris, PUF, 1992, p. 188</ref>. Cette formule énigmatique marque un tournant dans la pensée de l'amitié : elle soustrait celle-ci à toute rationalisation, à tout calcul, pour la situer dans l'ordre de l'évidence inexplicable, de la reconnaissance immédiate. L'amitié montaignienne repose sur un « mélange si universel » des âmes qu'elles « effacent et ne retrouvent plus la couture qui les a jointes »<ref>Michel de Montaigne, ''Essais'', I, XXVIII, éd. P. Villey, Paris, PUF, 1992, p. 188</ref>. Cette fusion des âmes, cette confusion des identités, fait de l'amitié un mode d'être-ensemble absolument singulier, irréductible aux liens familiaux, amoureux ou sociaux. L'amitié de Montaigne et La Boétie possède également une dimension politique. Les deux hommes partagent un idéal humaniste et une même préoccupation pour les questions de la liberté et de la servitude, comme en témoigne le célèbre ''Discours de la servitude volontaire'' de La Boétie. Leur amitié devient ainsi le lieu d'une résistance à la tyrannie et d'une affirmation de la liberté du jugement<ref>Christophe Litwin, « La cause perdue de l'amitié républicaine de La Boétie à Montaigne », ''Montaigne Studies'', n° 28, 2016, p. 95-108</ref>. ===Kant : l'amitié entre devoir et sentiment=== La philosophie des Lumières, et particulièrement Kant, soumet l'amitié à l'examen critique de la raison. Dans la ''Doctrine de la vertu'' (seconde partie de la ''Métaphysique des mœurs''), Kant définit l'amitié comme « l'union de deux personnes liées par un amour réciproque et un égal respect »<ref>Emmanuel Kant, ''Métaphysique des mœurs, Doctrine de la vertu'', § 46, trad. A. Philonenko, Paris, Vrin, 1968, p. 143</ref>. Cette définition révèle la tension constitutive de l'amitié kantienne : celle entre l'amour (qui pousse au rapprochement) et le respect (qui impose la distance). L'amitié exige un équilibre fragile entre ces deux forces, équilibre que Kant juge quasi impossible à réaliser parfaitement. Pour Kant, l'amitié parfaite est donc une « Idée » régulatrice plutôt qu'une réalité empirique<ref>Emmanuel Kant, ''Métaphysique des mœurs, Doctrine de la vertu'', § 46, trad. A. Philonenko, Paris, Vrin, 1968, p. 144</ref>. Néanmoins, aspirer à cette Idée constitue un « devoir de vertu » : nous devons cultiver l'amitié, car elle manifeste notre dignité morale et contribue à notre bonheur. La conception kantienne inscrit ainsi l'amitié dans l'ordre du devoir moral, la dépassionnant et la moralisant, au risque peut-être d'en assécher la spontanéité et la gratuité. ==L'amitié dans la philosophie contemporaine== ===Nietzsche : l'amitié stellaire et l'amour du lointain=== Nietzsche rompt avec la tradition philosophique en proposant une conception de l'amitié qui s'écarte délibérément des modèles grecs de la proximité et de la ressemblance. Dans ''Ainsi parlait Zarathoustra'', il récuse l'« amour du prochain » chrétien, qu'il juge hypocrite et grégaire, pour lui préférer l'« amour du lointain »<ref>Friedrich Nietzsche, ''Ainsi parlait Zarathoustra'', I, « De l'amour du prochain », trad. M. de Gandillac, Paris, Gallimard, 1971, p. 82-84</ref>. L'ami nietzschéen n'est pas celui qui nous rassure dans nos certitudes mais celui qui nous pousse à nous dépasser, à devenir ce que nous sommes. Dans ''Le Gai Savoir'', Nietzsche développe la métaphore de l'« amitié stellaire » : les vrais amis sont comme des étoiles qui « poursuivent des orbites si différentes » qu'ils peuvent sembler s'être perdus de vue, mais « leur foi en notre amitié stellaire demeure inébranlable »<ref>Friedrich Nietzsche, ''Le Gai Savoir'', § 279, trad. P. Klossowski, Paris, Gallimard, 1967, p. 220</ref>. Cette distance respectueuse, loin de menacer l'amitié, en constitue la noblesse : elle préserve la liberté et la singularité de chacun tout en maintenant un lien profond. La pensée nietzschéenne de l'amitié s'articule à sa critique de la morale et à sa philosophie de la volonté de puissance. L'ami authentique est celui qui favorise notre croissance spirituelle, qui nous défie et nous stimule plutôt que de nous conforter dans la médiocrité<ref>Friedrich Nietzsche, ''Humain, trop humain'', I, § 376, trad. R. Rovini, Paris, Gallimard, 1968, p. 251</ref>. Cette conception aristocratique et agonistique de l'amitié a influencé de nombreux penseurs du XXe siècle. ===Derrida et les apories de l'amitié=== Jacques Derrida consacre un ouvrage majeur à la question de l'amitié : ''Politiques de l'amitié'' (1994). S'appuyant sur une déconstruction de la tradition philosophique, de Platon à Carl Schmitt en passant par Montaigne et Nietzsche, Derrida met au jour les apories qui travaillent le concept d'amitié<ref>Jacques Derrida, ''Politiques de l'amitié'', Paris, Galilée, 1994</ref>. Il part d'une phrase mystérieuse attribuée à Aristote par Montaigne : « Ô mes amis, il n'y a nul ami », phrase dont il démonte patiemment les paradoxes et les implications. Pour Derrida, l'amitié est travaillée par une dissymétrie originaire : on ne peut parler d'amitié que de celui qui aime vers celui qui est aimé, jamais dans l'autre sens<ref>Jacques Derrida, ''Politiques de l'amitié'', Paris, Galilée, 1994, p. 23-48</ref>. L'amitié est donc toujours déjà marquée par une non-réciprocité, une dissymétrie temporelle (l'un aime avant l'autre, ou après lui) qui interdit toute fusion ou transparence parfaite. Cette « amitié sans amitié » ouvre un espace politique inédit : ni fraternité (trop liée à la filiation et à l'identité), ni simple contrat, l'amitié derridienne serait une forme de lien social qui accueille l'altérité radicale, l'étranger, celui qui n'est ni proche ni familier. ===Hannah Arendt : l'amitié comme espace politique=== Hannah Arendt développe une conception originale de l'amitié, qu'elle distingue soigneusement de l'amour et de la compassion. Dans son essai « De l'humanité dans de "sombres temps" : réflexions sur Lessing », elle écrit : « Nous avons coutume aujourd'hui de ne voir dans l'amitié qu'un phénomène de l'intimité, où les amis s'ouvrent leur âme sans tenir compte du monde et de ses exigences »<ref>Hannah Arendt, « De l'humanité dans de "sombres temps" », in ''Vies politiques'', Paris, Gallimard, 1974, p. 23</ref>. Or pour Arendt, c'est méconnaître la dimension proprement politique de l'amitié. L'amitié, telle que la pratiquaient les Grecs, est d'abord un dialogue, une pratique de la parole partagée qui fait advenir un monde commun entre les interlocuteurs. « L'essence de l'amitié consistait dans le dialogue », affirme-t-elle, ajoutant que ce dialogue permettait d'« humaniser » le monde en le rendant discutable, en le soumettant à la pluralité des perspectives<ref>Hannah Arendt, « De l'humanité dans de "sombres temps" », in ''Vies politiques'', Paris, Gallimard, 1974, p. 28-35</ref>. L'amitié devient ainsi un espace de résistance contre la tyrannie et le totalitarisme : lorsque la sphère publique se dégrade ou disparaît, l'amitié maintient ouverte la possibilité d'un monde partagé. Dans une lettre célèbre à Gershom Scholem, Arendt écrit : « De ma vie, je n'ai jamais "aimé" aucun peuple, ni aucune collectivité [...]. Je reconnais que je n'aime en effet que mes amis ; et que la seule sorte d'amour que je connaisse et en laquelle je crois est l'amour pour des personnes »<ref>Hannah Arendt, lettre à Gershom Scholem, 24 juillet 1963, in ''Vies politiques'', Paris, Gallimard, 1974</ref>. Cette déclaration, loin d'être une profession d'apolitisme, affirme au contraire la primauté de l'amitié comme lien politique authentique, contre les formes dégradées de solidarité collective (nationalisme, identitarisme, conformisme de masse). ==Enjeux contemporains : l'amitié au-delà de l'intime== La philosophie contemporaine continue d'interroger l'amitié, notamment face aux transformations des modes de sociabilité à l'ère numérique et à la marchandisation croissante des relations sociales. Plusieurs questions demeurent vives. Premièrement, l'amitié peut-elle vraiment se penser indépendamment des rapports de pouvoir et d'intérêt ? Les analyses sociologiques montrent que les réseaux amicaux reproduisent souvent les hiérarchies sociales et contribuent à la reproduction des inégalités. Comment concilier l'idéal philosophique d'une amitié désintéressée avec cette réalité sociale ? Deuxièmement, quelle place pour l'amitié dans une société démocratique ? Les pensées de Derrida et d'Arendt suggèrent que l'amitié pourrait constituer un modèle alternatif de lien politique, ni fusionnel ni contractuel, respectueux de la pluralité et de l'altérité. Mais une politique de l'amitié est-elle praticable à grande échelle, ou demeure-t-elle une utopie aristocratique ? Troisièmement, comment penser l'amitié à l'ère des réseaux sociaux et des « amis » virtuels ? Le philosophe C. S. Lewis, dans ''The Four Loves'', distinguait la véritable amitié (''philia'') de la simple camaraderie ou affection<ref>C. S. Lewis, ''The Four Loves'', London, Geoffrey Bles, 1960, p. 57-90</ref>. Cette distinction reste-t-elle pertinente lorsque la frontière entre amitié et réseau social devient poreuse ? ==Conclusion== L'amitié, depuis les Grecs jusqu'à nos jours, reste une énigme philosophique productive. Ni simple sentiment, ni institution sociale, elle échappe aux catégories habituelles de la pensée morale et politique. Tour à tour fondement de la cité (Aristote), voie d'accès à la vérité (Platon), exercice spirituel (Sénèque), évidence inexplicable (Montaigne), devoir moral (Kant), amour du lointain (Nietzsche), accueil de l'altérité (Derrida) ou dialogue humanisant (Arendt), l'amitié manifeste notre capacité à nouer des liens qui ne se réduisent ni à la nécessité biologique, ni au calcul utilitaire, ni à l'obligation juridique. Paradoxalement, cette résistance de l'amitié aux définitions trop rigides fait peut-être sa richesse philosophique : elle nous rappelle que l'existence humaine ne saurait se réduire à un système, qu'il reste toujours un espace pour la gratuité, la singularité, la rencontre imprévisible. Dans un monde où tout tend à se marchandiser et se rationaliser, l'amitié demeure ce lieu fragile mais irréductible où se manifeste notre humanité commune et notre liberté partagée. == Notes et références == {{references|colonnes=2}} ==Bibliographie sélective== * Aristote, ''Éthique à Nicomaque'', livres VIII-IX, trad. J. Tricot, Paris, Vrin, 1959 * Cicéron, ''Laelius de amicitia'', trad. R. Combès, Paris, Les Belles Lettres, 1983 * Michel de Montaigne, ''Essais'', I, XXVIII, éd. P. Villey, Paris, PUF, 1992 * Emmanuel Kant, ''Métaphysique des mœurs, Doctrine de la vertu'', trad. A. Philonenko, Paris, Vrin, 1968 * Friedrich Nietzsche, ''Le Gai Savoir'', trad. P. Klossowski, Paris, Gallimard, 1967 * Jacques Derrida, ''Politiques de l'amitié'', Paris, Galilée, 1994 * Hannah Arendt, ''Vies politiques'', Paris, Gallimard, 1974 * Jean-Claude Fraisse, ''Philia. La Notion d'amitié dans la philosophie antique'', Paris, Vrin, 1974 * David Konstan, ''Friendship in the Classical World'', Cambridge, Cambridge University Press, 1997 {{Autocat}} [[Catégorie:Éthique]] [[Catégorie:Philosophie politique]] 27gn4sbxx6g8dmi0do84nsku3dar2jp Dictionnaire de philosophie/Altérité 0 83034 768149 767670 2026-06-19T04:14:03Z PandaMystique 119061 Bot : ajout du paramètre lecture=oui au modèle {{DicoPhilo}} 768149 wikitext text/x-wiki {{DicoPhilo|Altérité|lecture=oui}} L''''altérité''' (du latin ''alteritas'', signifiant « différence », « changement ») désigne le caractère de ce qui est autre, de ce qui est distinct et extérieur à une réalité de référence. En philosophie, cette notion interroge la nature de la différence, les modalités de reconnaissance de l'autre dans sa spécificité, et les enjeux éthiques, ontologiques et politiques que soulève notre rapport à ce qui n'est pas nous-même. == Définition conceptuelle == L'altérité se définit d'abord en opposition à l'identité : alors que l'identité renvoie à ce qui demeure identique à soi, l'altérité désigne ce qui est différent, ce qui se distingue du même. Dans le langage philosophique, l'altérité ne se réduit pas à une simple différence numérique ou qualitative entre des objets. Elle pose la question fondamentale de la relation à l'autre en tant qu'autre, c'est-à-dire en tant qu'irréductible à soi, à mes propres catégories de pensée ou à mon propre point de vue<ref>Angelo Turco et Jacques Lévy, « Dictionnaire de la géographie et de l'espace des sociétés », Belin, 2013</ref>. La notion d'altérité se distingue de celle d'autrui, bien que les deux soient étroitement liées. Autrui désigne spécifiquement l'autre personne humaine, l'autre conscience ou l'autre sujet, tandis que l'altérité peut s'appliquer à tout ce qui est autre : choses, êtres vivants non humains, cultures, idées. Autrui est ainsi un cas particulier de l'altérité, celui qui concerne la relation intersubjective entre êtres humains<ref>Jean-Paul Sartre, « L'être et le néant », Gallimard, 1943</ref>. == Origines antiques de la notion == === Platon et le Sophiste === C'est dans la philosophie grecque que la notion d'altérité trouve ses premières formulations conceptuelles rigoureuses. Dans le ''Sophiste'', Platon accomplit une véritable révolution philosophique en faisant de l'altérité une catégorie ontologique fondamentale. Confronté au défi éléatique qui affirmait que seul l'être est, et que le non-être ne peut être ni pensé ni dit, Platon introduit la notion d'altérité (''heteron'') comme l'un des cinq genres suprêmes de l'être, aux côtés de l'être, du même, du repos et du mouvement<ref>Platon, « Le Sophiste », 254d-259d, trad. Nestor Cordero, Flammarion, 1993</ref>. L'innovation platonicienne consiste à montrer que le non-être ne signifie pas l'absence pure et simple, mais l'altérité. Dire qu'une chose n'est pas quelque chose d'autre ne revient pas à affirmer son néant absolu, mais à reconnaître sa différence. Comme l'Étranger d'Élée l'explique dans le dialogue, « lorsque nous disons le non-être, nous ne disons pas, ce semble, quelque chose de contraire à l'être, mais seulement quelque chose d'autre »<ref>Platon, « Le Sophiste », 257b</ref>. Cette distinction permet de résoudre le problème de la prédication : dire « le cheval n'est pas un homme » ne signifie pas que le cheval est néant, mais qu'il participe d'une autre forme. L'altérité devient ainsi la condition de possibilité du discours et de la vérité. C'est parce que les formes intelligibles (les Idées) peuvent être autres les unes par rapport aux autres, tout en étant, qu'elles peuvent s'entrelacer et se séparer, rendant possible le logos véritable. L'altérité n'est donc pas un défaut ou une privation de l'être, mais une dimension constitutive de la réalité intelligible. === Aristote : l'altérité comme catégorie de la relation === Aristote reprend et développe la réflexion sur l'altérité en la situant dans le cadre de sa théorie des catégories. Pour le Stagirite, « autre » (''heteron'') se dit en autant d'acceptions que « un », « même » ou « être », c'est-à-dire selon chaque catégorie<ref>Aristote, « Métaphysique », Livre Delta, 1018a, trad. J. Tricot, Vrin, 1991</ref>. L'altérité devient ainsi une notion transversale qui traverse toutes les modalités de l'être. Aristote introduit néanmoins une distinction importante : pour lui, sont véritablement « autres » les êtres qui ont pluralité d'espèce, de matière ou de définition de leur substance. L'altérité suppose donc une certaine identité générique ou une relation d'analogie. Contrairement à Platon, Aristote ne fait pas de l'altérité une dimension interne au sujet lui-même, mais la pense davantage en termes de distinction entre des êtres ayant une certaine communauté de nature. Cette conception moins radicale de l'altérité préfigure les débats ultérieurs sur la possibilité de penser l'autre sans le ramener au même. == L'altérité dans la pensée moderne == === Descartes et le problème d'autrui === Avec Descartes et l'inauguration de la philosophie moderne du sujet, la question de l'altérité prend une tournure nouvelle. Le ''cogito'' cartésien établit la certitude du moi pensant comme fondement premier de toute connaissance : « je pense, donc je suis ». Mais cette découverte du sujet comme certitude première soulève immédiatement une difficulté : comment puis-je être certain de l'existence d'autres esprits que le mien ? Si je n'ai accès directement qu'à mes propres pensées, comment puis-je connaître l'intériorité d'autrui<ref>René Descartes, « Méditations métaphysiques », Méditation seconde et sixième, 1641</ref> ? Ce problème, connu sous le nom de problème du solipsisme (du latin ''solus ipse'', seul soi-même), hante la philosophie moderne. Descartes tente de le résoudre par l'idée de Dieu comme garant de la véracité de nos perceptions et de l'existence d'un monde extérieur peuplé d'autres esprits. Mais cette solution théologique laisse entière la question de l'accès à l'altérité d'autrui : même si je suis certain qu'autrui existe, comment puis-je appréhender sa différence radicale, son intériorité qui m'échappe par essence ? === Hegel et la dialectique de la reconnaissance === C'est avec Hegel que la question de l'altérité reçoit un traitement véritablement dialectique. Dans la ''Phénoménologie de l'esprit'' (1807), Hegel consacre des pages célèbres à la dialectique du maître et de l'esclave, qui analyse le processus par lequel la conscience de soi se constitue à travers la reconnaissance d'une autre conscience<ref>Georg Wilhelm Friedrich Hegel, « Phénoménologie de l'esprit », trad. Jean Hyppolite, Aubier-Montaigne, 1941, tome I, p. 155-166</ref>. Pour Hegel, la conscience de soi n'existe pas de manière isolée : elle requiert la médiation d'une autre conscience. « La conscience de soi est en soi et pour soi quand et parce qu'elle est en soi et pour soi pour une autre ; c'est-à-dire qu'elle n'est qu'en tant qu'être reconnu »<ref>Hegel, « Phénoménologie de l'esprit », chapitre IV, section A</ref>. Cette thèse fondamentale signifie que je ne deviens pleinement conscient de moi-même qu'à travers le regard et la reconnaissance d'autrui. Le processus de reconnaissance passe d'abord par une lutte à mort : chaque conscience cherche à s'affirmer en niant l'autre, en refusant de le reconnaître comme sujet autonome. Cette lutte aboutit à une relation de domination : l'un devient maître, l'autre esclave. Mais cette relation est fondamentalement instable et contradictoire. Le maître, qui cherchait la reconnaissance d'un égal, ne reçoit que celle d'un être asservi, dont la reconnaissance n'a donc pas de véritable valeur. L'esclave, en revanche, à travers le travail et la transformation du monde, accède progressivement à une conscience de soi plus authentique. Cette dialectique montre que l'altérité n'est pas un donné statique, mais un processus dynamique de différenciation et de reconnaissance mutuelle. L'autre n'est ni simplement identique à moi (auquel cas il ne serait pas vraiment autre), ni radicalement étranger (auquel cas aucune relation ne serait possible). La relation à l'altérité est un mouvement de négation, de séparation et de réunification qui structure la vie de l'esprit. == La phénoménologie et l'altérité == === Husserl et le problème de l'intersubjectivité === Edmund Husserl, fondateur de la phénoménologie, aborde la question de l'altérité dans le cadre de sa théorie de la constitution transcendantale du sens. Dans la ''Cinquième méditation cartésienne'' (1931), Husserl se confronte à un problème crucial : comment l'ego transcendantal, qui est le foyer constituant de tout sens, peut-il constituer l'existence d'un autre ego qui, par définition, lui est radicalement étranger<ref>Edmund Husserl, « Méditations cartésiennes », trad. Gabrielle Peiffer et Emmanuel Levinas, Vrin, 1947, Méditation V</ref> ? Husserl propose une solution complexe fondée sur la notion d'appresentation analogique. Lorsque je perçois le corps d'autrui, je ne perçois pas directement sa conscience, qui m'est en principe inaccessible. Mais par un transfert analogique fondé sur la similitude entre son corps et le mien, je « co-présente » ou « appresente » une conscience analogue à la mienne habitant ce corps. Je constitue ainsi autrui comme un alter ego, un autre moi-même<ref>Husserl, « Méditations cartésiennes », §50-52</ref>. Cette théorie a suscité de nombreuses critiques. En particulier, on lui a reproché de ne pas rendre justice à l'altérité véritable d'autrui, en le réduisant à un double de moi-même. Si autrui n'est constitué que par analogie avec mon propre ego, n'est-il pas ramené au même, privé de sa différence radicale ? Cette aporie husserlienne ouvre la voie aux philosophies de l'altérité du XXe siècle, qui chercheront à penser l'autre dans son irréductibilité. === Heidegger et l'être-avec === Martin Heidegger, dans ''Être et temps'' (1927), propose une approche différente de l'altérité à travers la notion d'être-avec (''Mitsein''). Pour Heidegger, le ''Dasein'' (l'être-là, c'est-à-dire l'existence humaine) n'est pas d'abord un sujet isolé qui aurait ensuite à découvrir l'existence d'autres sujets. L'être-avec est une structure existentiale constitutive du ''Dasein'' : nous sommes toujours déjà dans un monde partagé avec d'autres<ref>Martin Heidegger, « Être et temps », trad. François Vezin, Gallimard, 1986, §26-27</ref>. Cette thèse signifie que l'altérité n'est pas un problème à résoudre (comme chez Descartes ou Husserl), mais une dimension originaire de notre être. Nous ne sommes jamais seuls, même dans la solitude : notre monde est toujours déjà structuré par la présence effective ou possible des autres. Les outils que j'utilise, les chemins que j'emprunte, les œuvres que je lis renvoient toujours à d'autres, à ceux qui les ont fabriqués, tracés, écrits. Cependant, Heidegger souligne aussi le danger d'une altérité inauthentique. Dans le mode d'être quotidien, le ''Dasein'' se perd dans le On (''das Man''), cette instance impersonnelle et anonyme qui dicte les normes et les comportements. Le On représente une altérité niveleuse qui efface les différences individuelles : « on pense », « on dit », « on fait » comme tout le monde. L'authenticité requiert au contraire que le ''Dasein'' s'arrache à cette dictature du On pour assumer sa propre existence singulière, notamment face à la mort, cette possibilité la plus propre et inaliénable. === Sartre : le regard et la conflictualité === Jean-Paul Sartre, dans ''L'être et le néant'' (1943), développe une phénoménologie du regard qui met en évidence la dimension fondamentalement conflictuelle de la relation à autrui. Pour Sartre, l'expérience originaire d'autrui n'est pas la perception de son corps ou l'appresentation analogique de sa conscience, mais l'épreuve d'être vu par lui<ref>Jean-Paul Sartre, « L'être et le néant », Gallimard, collection Tel, 1943, partie III, chapitre I</ref>. Sartre illustre cette expérience par le célèbre exemple de la honte. Imaginons que je regarde par le trou d'une serrure, absorbé par ma curiosité. Soudain, j'entends un pas dans le couloir : quelqu'un me voit. À cet instant, je me découvre comme objet sous le regard d'autrui. Ma subjectivité libre et fluide se fige en une essence : je suis ce « voyeur », ce « curieux », cet « indiscret ». Le regard d'autrui m'objective, il fait de moi un objet dans son monde, me privant de ma liberté et de ma transcendance<ref>Sartre, « L'être et le néant », p. 310-320</ref>. Cette objectivation est vécue comme une menace fondamentale. Autrui, en me regardant, vole mon monde et ma liberté. Il me constitue à partir de son propre projet, selon des catégories et des valeurs qui sont les siennes, non les miennes. D'où la formule célèbre de ''Huis clos'' : « L'enfer, c'est les autres ». Cette phrase ne signifie pas simplement que les autres nous rendent malheureux, mais qu'ils représentent une menace ontologique permanente pour notre liberté. Sartre en conclut que « l'essence des rapports entre consciences n'est pas le ''Mitsein'', c'est le conflit »<ref>Sartre, « L'être et le néant », p. 470</ref>. La relation à autrui est fondamentalement une lutte dans laquelle chacun tente alternativement d'objectiver l'autre (par le regard, le désir, la possession) ou d'échapper à sa propre objectivation. Cette vision tragique de l'intersubjectivité contraste fortement avec les philosophies du dialogue et de la reconnaissance. == Emmanuel Levinas : l'altérité comme éthique première == === Le visage d'autrui === Emmanuel Levinas (1906-1995) opère un renversement complet dans la façon de penser l'altérité. Contre toute la tradition philosophique occidentale qui, selon lui, ramène l'autre au même en cherchant à le comprendre et à le maîtriser, Levinas pose l'altérité d'autrui comme ce qui échappe par principe à toute emprise, à toute totalisation<ref>Emmanuel Levinas, « Totalité et infini. Essai sur l'extériorité », Martinus Nijhoff, La Haye, 1961</ref>. Au centre de la pensée lévinassienne se trouve la notion de visage (''visage'' en français, ''panim'' en hébreu). Le visage n'est pas le visage plastique, l'ensemble des traits physiques que je peux percevoir et objectiver. Le visage au sens lévinassien est l'épiphanie de l'autre dans sa nudité et sa vulnérabilité, c'est la manifestation de son altérité absolue qui résiste à toute emprise thématisante. Comme Levinas l'écrit : « Le visage est ce qu'on ne peut tuer, ou du moins ce dont le sens consiste à dire : "tu ne tueras point" »<ref>Levinas, « Éthique et Infini. Dialogues avec Philippe Nemo », Fayard/France Culture, 1982, p. 80</ref>. Le visage d'autrui m'interpelle, m'assigne à responsabilité avant toute délibération ou décision de ma part. C'est une assignation pré-originaire : je suis responsable d'autrui avant même d'avoir choisi de l'être, et cette responsabilité ne trouve pas son origine dans ma liberté mais dans la vulnérabilité même d'autrui. Le visage me commande éthiquement, il m'enjoint de ne pas rester indifférent à sa détresse. === L'éthique comme philosophie première === Cette conception de l'altérité conduit Levinas à affirmer que l'éthique, et non l'ontologie (la science de l'être), est la philosophie première. La relation à autrui n'est pas un problème théorique à résoudre, elle n'est pas une question de connaissance : elle est d'emblée une relation éthique de responsabilité. Comme il l'écrit dans ''Autrement qu'être ou au-delà de l'essence'' (1974), la subjectivité se constitue dans la responsabilité pour autrui, elle est « otage » d'autrui, exposée à lui sans défense<ref>Emmanuel Levinas, « Autrement qu'être ou au-delà de l'essence », Martinus Nijhoff, La Haye, 1974</ref>. Cette responsabilité est asymétrique et infinie. Asymétrique parce qu'elle ne requiert pas la réciprocité : je suis responsable d'autrui même si autrui n'est pas responsable de moi. Infinie parce qu'elle ne connaît pas de limites : je ne peux jamais me dire « quitte » envers autrui, ma responsabilité ne s'épuise jamais. Elle va même jusqu'à la substitution : je réponds d'autrui au point de me substituer à lui, de prendre sa place. Cette pensée de l'altérité radicale a eu une influence considérable sur la philosophie contemporaine, l'éthique, la théologie, et même les sciences humaines. Elle offre un contrepoint puissant aux philosophies de l'identité, de la totalité et de la maîtrise, en rappelant que l'autre n'est pas un objet à connaître ou à dominer, mais un appel à la responsabilité qui me précède et me constitue. == Autres approches philosophiques de l'altérité == === Martin Buber et le dialogue Je-Tu === Le philosophe et théologien juif Martin Buber (1878-1965) propose, dans son œuvre ''Je et Tu'' (1923), une philosophie de la relation fondée sur la distinction entre deux types de rapports au monde<ref>Martin Buber, « Je et Tu », trad. G. Bianquis, Aubier-Montaigne, 1969</ref>. La relation Je-Cela (''Ich-Es'') est une relation objectivante : le Cela est un objet que je connais, que j'utilise, que j'analyse selon mes besoins et mes catégories. C'est la relation de la science, de la technique, de l'usage. Elle est nécessaire à la vie pratique, mais elle réduit l'autre à un moyen, à un objet parmi d'autres dans mon monde. La relation Je-Tu (''Ich-Du'') est, au contraire, une relation de présence totale et réciproque. Le Tu n'est pas un objet que je thématise, mais une présence qui m'interpelle dans mon être entier. Cette relation ne peut être instrumentalisée : elle est gratuite, immédiate, sans médiation conceptuelle. « Toute vie véritable est rencontre », écrit Buber<ref>Buber, « Je et Tu », p. 62</ref>. Dans la rencontre authentique du Je-Tu, l'altérité de l'autre est pleinement respectée et accueillie. Buber souligne que cette relation Je-Tu ne peut être permanente : elle est fugitive, fragile, toujours menacée de retomber dans la relation Je-Cela. Mais c'est elle qui donne sens et plénitude à l'existence humaine. De plus, pour Buber, toute relation Je-Tu renvoie ultimement à la relation avec le Tu éternel, Dieu, qui seul ne peut jamais devenir un Cela. === Merleau-Ponty et l'intercorporéité === Maurice Merleau-Ponty (1908-1961) aborde la question de l'altérité à partir d'une phénoménologie du corps vécu. Dans ''Phénoménologie de la perception'' (1945), il critique la conception intellectualiste d'autrui et propose une approche fondée sur l'expérience corporelle<ref>Maurice Merleau-Ponty, « Phénoménologie de la perception », Gallimard, 1945</ref>. Pour Merleau-Ponty, je ne constitue pas autrui par un raisonnement analogique à partir de mon propre corps. La compréhension d'autrui se fait d'abord au niveau pré-réflexif, par une sorte de sympathie ou de résonance corporelle. Mon corps et celui d'autrui sont pris dans un même tissu sensible, ce que Merleau-Ponty appelle la chair du monde. Il existe une intercorporéité originaire qui fonde la possibilité de la communication et de la compréhension mutuelle<ref>Maurice Merleau-Ponty, « Le visible et l'invisible », Gallimard, 1964</ref>. Cette approche permet de penser l'altérité sans la réduire ni à l'identité (autrui n'est pas simplement un double de moi), ni à l'étrangeté absolue (autrui n'est pas un mystère impénétrable). Il y a une parenté charnelle entre les corps, un entrelacement qui rend possible la reconnaissance de l'autre comme autre sans supprimer sa différence. == Enjeux contemporains de l'altérité == === Altérité culturelle et reconnaissance === Dans le contexte contemporain marqué par la mondialisation et les rencontres interculturelles, la question de l'altérité prend une dimension politique et sociale cruciale. Comment reconnaître et respecter l'altérité culturelle sans tomber dans le relativisme ? Comment articuler l'universel et le particulier, le commun et le différent<ref>Charles Taylor, « Multiculturalisme. Différence et démocratie », Aubier, 1994</ref> ? Le philosophe canadien Charles Taylor a développé une politique de la reconnaissance qui vise à concilier l'exigence d'égalité (tous les êtres humains méritent le même respect) et l'exigence de différence (chaque culture, chaque identité a droit à la reconnaissance de sa spécificité). La non-reconnaissance ou la mésestime peut causer des blessures identitaires profondes et générer des conflits sociaux<ref>Axel Honneth, « La lutte pour la reconnaissance », trad. Pierre Rusch, Cerf, 2000</ref>. === Altérité et exclusion === L'altérité peut aussi être instrumentalisée pour justifier l'exclusion, la discrimination ou la domination. L'histoire montre comment la désignation de l'autre comme radicalement différent (le « barbare », l'« infidèle », le « primitif ») a servi à légitimer la colonisation, l'esclavage et les génocides. L'altérisation (le processus par lequel on rend l'autre étranger et menaçant) est un mécanisme social et politique qui peut conduire à la déshumanisation. Les sciences sociales contemporaines ont mis en évidence les processus de construction de l'altérité dans les discours et les pratiques sociales. L'autre n'est pas simplement donné, il est produit par des catégorisations, des stéréotypes, des frontières symboliques. La critique de ces processus est essentielle pour promouvoir une société plus inclusive et respectueuse de la diversité. === Altérité et éthique animale === Récemment, la question de l'altérité s'est étendue au-delà de l'humanité pour interroger notre rapport aux animaux non humains et, plus généralement, au vivant. Les philosophes de l'éthique animale questionnent la légitimité de la frontière que nous traçons entre l'humain et l'animal, et plaident pour une reconnaissance de l'altérité animale qui implique des devoirs moraux envers les êtres sensibles<ref>Peter Singer, « La libération animale », Grasset, 1993 ; Jacques Derrida, « L'animal que donc je suis », Galilée, 2006</ref>. Cette extension de la problématique de l'altérité oblige à repenser les catégories traditionnelles de la philosophie morale et politique, et à imaginer de nouvelles formes de communauté qui incluent des êtres radicalement différents de nous. == Conclusion == La notion d'altérité traverse l'histoire de la philosophie occidentale comme un fil rouge, prenant des significations et des enjeux différents selon les époques et les auteurs. D'abord conçue comme une catégorie ontologique par Platon, permettant de penser la relation et la différence au sein de l'être lui-même, l'altérité devient avec la modernité une question épistémologique (comment connaître l'autre ?) et existentielle (comment exister avec l'autre ?). Les philosophies contemporaines de l'altérité, de Levinas à Derrida en passant par les penseurs postcoloniaux et féministes, ont montré que l'autre ne peut être réduit au même, assimilé à mes catégories ou absorbé dans une totalité englobante. L'altérité résiste, elle excède, elle déborde. Cette irréductibilité de l'autre est à la fois un défi théorique (comment penser ce qui échappe à la pensée ?) et un appel éthique (comment répondre de l'autre dans sa vulnérabilité ?). Dans un monde marqué par les rencontres interculturelles, les migrations, les inégalités et les conflits, la question de l'altérité reste plus que jamais d'actualité. Elle nous invite à penser ensemble l'unité de l'humanité et la diversité irréductible des cultures, des identités, des expériences. Elle nous rappelle que vivre ensemble ne signifie pas effacer les différences, mais apprendre à les accueillir dans le respect et la responsabilité mutuelle. == Notes et références == {{references|colonnes=2}} == Bibliographie sélective == Textes classiques : * Platon, ''Le Sophiste'', trad. Nestor Cordero, Flammarion, 1993 * Aristote, ''Métaphysique'', trad. J. Tricot, Vrin, 1991 * Georg Wilhelm Friedrich Hegel, ''Phénoménologie de l'esprit'', trad. Jean Hyppolite, Aubier-Montaigne, 1941 * Edmund Husserl, ''Méditations cartésiennes'', trad. Gabrielle Peiffer et Emmanuel Levinas, Vrin, 1947 * Martin Heidegger, ''Être et temps'', trad. François Vezin, Gallimard, 1986 * Jean-Paul Sartre, ''L'être et le néant'', Gallimard, 1943 * Martin Buber, ''Je et Tu'', trad. G. Bianquis, Aubier-Montaigne, 1969 * Maurice Merleau-Ponty, ''Phénoménologie de la perception'', Gallimard, 1945 Emmanuel Levinas : * ''Totalité et infini. Essai sur l'extériorité'', Martinus Nijhoff, La Haye, 1961 ; réédition Le Livre de Poche, 1990 * ''Autrement qu'être ou au-delà de l'essence'', Martinus Nijhoff, La Haye, 1974 ; réédition Le Livre de Poche, 2001 * ''Éthique et Infini. Dialogues avec Philippe Nemo'', Fayard/France Culture, 1982 * ''Altérité et transcendance'', Fata Morgana, 1995 Études contemporaines : * Robert Legros, ''Levinas. Une philosophie de l'altérité'', Ellipses, 2017 * Simone Plourde, ''Emmanuel Lévinas. Altérité et responsabilité'', Cerf, 1996 * Charles Taylor, ''Multiculturalisme. Différence et démocratie'', Aubier, 1994 * Axel Honneth, ''La lutte pour la reconnaissance'', trad. Pierre Rusch, Cerf, 2000 * Tzvetan Todorov, ''La conquête de l'Amérique. La question de l'autre'', Seuil, 1982 * Edward Saïd, ''L'Orientalisme. L'Orient créé par l'Occident'', Seuil, 1980 {{Autocat}} efqs2dybd3hqtlc3nsv52choropceqh Dictionnaire de philosophie/Animal 0 83035 768157 767674 2026-06-19T04:15:13Z PandaMystique 119061 Bot : ajout du paramètre lecture=oui au modèle {{DicoPhilo}} 768157 wikitext text/x-wiki {{DicoPhilo|Animal|lecture=oui}} L'animal occupe une place singulière dans l'histoire de la pensée philosophique. Penser l'animal, c'est toujours aussi se demander ce que nous sommes, nous, les humains. La question de l'animal traverse les catégories fondamentales de la philosophie : elle concerne l'épistémologie (comment définir l'animal et comment connaître son expérience ?), l'éthique (quels devoirs avons-nous envers les animaux ?) et l'ontologie (quelle est la nature de l'être animal ?). Cet article se propose d'examiner les principales conceptions philosophiques de l'animal, de l'Antiquité à nos jours, en montrant comment la question animale met en jeu notre compréhension de l'humanité elle-même. == L'animal dans la pensée antique : hiérarchie et continuité == === Aristote et la zoologie philosophique === La philosophie antique grecque inaugure une réflexion systématique sur l'animal. Aristote (384-322 av. J.-C.) consacre une part considérable de son œuvre à l'étude des animaux : ''Histoire des animaux'', ''Les Parties des animaux'', ''La Génération des animaux'', ''Du mouvement des animaux'' et ''La Locomotion des animaux'' constituent un corpus zoologique impressionnant<ref>Pierre Louis (trad.), ''Histoire des animaux'', tome I, Paris, Les Belles Lettres, « Collection des universités de France », 1964</ref>. Pour Aristote, l'étude des vivants relève d'une enquête causale visant à découvrir les causes finales<ref>Aristote, ''Les Parties des animaux'', I, 5, 645a36-645b3</ref>. Le philosophe grec développe une méthode d'observation fondée sur la dissection anatomique et la comparaison des espèces. Son approche ne se limite pas à une classification dichotomique à la manière de Platon, mais cherche à saisir les genres naturels en divisant sur la base d'un groupe de différences aptes à isoler une espèce<ref>Aristote, ''Les Parties des animaux'', I.2, 642b5</ref>. Ainsi, Aristote pense les animaux selon une échelle des êtres (''scala naturæ'') où chaque espèce possède une place déterminée selon son degré de perfection et ses capacités<ref>Jean-Louis Labarrière, « Aristote et l'éthologie », ''Revue philosophique de la France et de l'étranger'', t. 83, n° 2, avril-juin 1993, pp. 281-300</ref>. Pour le Stagirite, l'homme est un animal politique (''zoon politikon'') doté du logos, c'est-à-dire de la raison et du langage. Cette capacité le distingue des autres animaux qui, bien que possédant des sensations, une mémoire et même certaines formes d'intelligence pratique, ne peuvent accéder au raisonnement abstrait et à la vie morale proprement dite<ref>Aristote, ''Histoire des animaux'', in ''Digitalis'', URL : http://digitalis-dsp.uc.pt/bitstream/10316.2/24521/1/archai11_artigo11.pdf, consulté le 28 octobre 2025</ref>. Néanmoins, Aristote reconnaît une continuité entre l'homme et l'animal : tous deux sont des vivants sensibles, soumis aux mêmes nécessités biologiques. === Montaigne et la critique de la présomption humaine === À la Renaissance, Montaigne (1533-1592) renouvelle profondément la réflexion sur l'animal dans son ''Apologie de Raimond Sebond'', le plus long essai du livre II des ''Essais''. Sous couvert de défendre la ''Théologie naturelle'' du théologien catalan Raymond Sebond, Montaigne opère en réalité un renversement complet de l'anthropocentrisme traditionnel<ref>Thierry Gontier, « À la frontière de l'humain. La figure ambivalente de l'animal dans l'Apologie de Raimond Sebond de Montaigne », ''Revue de Synthèse'', 143, 2022, pp. 105-134</ref>. Montaigne conteste violemment la « présomption » humaine qui prétend placer l'homme au sommet de la création. Il accumule les exemples d'intelligence, de sociabilité et de vertus animales empruntés à Plutarque et à l'ensemble de la tradition antique<ref>Bénédicte Boudou, ''Montaigne et les animaux'', Paris, Classiques Garnier, 2016</ref>. Le célèbre passage « Quand je joue avec ma chatte, qui sait si elle ne passe pas son temps avec moi plus que je ne fais avec elle ? »<ref>Montaigne, ''Essais'', II, 12, éd. P. Villey, Paris, PUF, 2004, p. 452</ref> illustre ce renversement de perspective : l'homme n'est pas nécessairement le centre du monde animal, il n'en est qu'un élément parmi d'autres. Pour Montaigne, « ce n'est par vrai discours, mais par une fierté folle et opiniâtreté, que nous nous préférons aux autres animaux et nous séquestrons de leur condition et société »<ref>Montaigne, ''Essais'', II, 12, p. 454</ref>. Cette critique de l'arrogance humaine s'inscrit dans une démarche sceptique qui refuse les hiérarchies dogmatiques et reconnaît la valeur propre de l'existence animale. Montaigne défend ainsi une forme de bienveillance à l'égard des bêtes et appelle au respect de la sensibilité du vivant<ref>Sylvia Giocanti, « Montaigne et l'animalité », dans ''École Thema'', ENS Lyon, 2007, disponible sur http://ecole-thema.ens-lyon.fr</ref>. == L'âge classique : rupture et mécanisation == === Descartes et l'animal-machine === Le XVIIe siècle marque une rupture majeure dans la conception de l'animal avec la théorie cartésienne de l'animal-machine. Dans le ''Discours de la méthode'' (1637) et dans sa correspondance, notamment la lettre au marquis de Newcastle du 23 novembre 1646, Descartes développe l'idée que les animaux sont des automates, des machines complexes créées par Dieu mais dépourvues de pensée et d'âme<ref>René Descartes, ''Discours de la méthode'', cinquième partie, Paris, Vrin, 1637 [1992]</ref>. Pour Descartes, la différence entre l'homme et l'animal est absolue. L'homme possède une âme pensante (''res cogitans'') distincte de son corps (''res extensa''), tandis que l'animal n'est que pure étendue, pure matière organisée selon des lois mécaniques. Descartes écrit : « Toutes les choses qu'on fait faire aux chiens, aux chevaux et aux singes, ne sont que des mouvements de leur crainte, de leur espérance, ou de leur joie, en sorte qu'ils les peuvent faire sans aucune pensée »<ref>Descartes, lettre au marquis de Newcastle, 23 novembre 1646, dans Charles Adam et Paul Tannery (éd.), ''Œuvres de Descartes'', Paris, Vrin, 1996, t. IV</ref>. Le critère fondamental de cette distinction est le langage. Seul l'homme possède la capacité de « dire » sa pensée, d'articuler des réponses appropriées à toute situation nouvelle. Les animaux peuvent certes émettre des sons, mais il s'agit de simples mécanismes, non de véritables actes de parole témoignant d'une pensée consciente<ref>Steve Naragon, « Kant on Descartes and the Brutes », ''Kant-Studien'', vol. 81, 1990, pp. 1-23</ref>. Cette thèse de l'animal-machine a des conséquences éthiques considérables : si les animaux ne pensent pas et ne souffrent pas véritablement, alors nous n'avons pas de devoirs moraux directs envers eux. Toutefois, il faut souligner que Descartes lui-même reconnaît que les animaux ont des « sentiments » au sens de sensations, et que la théorie de l'animal-machine a été souvent durcie et caricaturée par ses disciples, notamment Malebranche<ref>Jean-Marie Beyssade, « Descartes et l'animal-machine », dans ''Philosophie Magazine'', 2024, disponible sur www.philomag.com</ref>. === Les critiques de la théorie cartésienne === La thèse de l'animal-machine suscite immédiatement des critiques. Pierre Gassendi (1592-1655) conteste le dualisme cartésien et défend une forme de continuité entre l'homme et l'animal. Au XVIIIe siècle, Étienne Bonnot de Condillac (1714-1780) développe dans son ''Traité des animaux'' (1755) une réfutation systématique de la conception cartésienne<ref>François Dagognet, ''L'animal selon Condillac. Une introduction au Traité des animaux'', Paris, Vrin, « Bibliothèque d'Histoire de la Philosophie - Poche », 2004</ref>. Pour Condillac, puisque la connaissance dérive de la sensation, et que l'animal possède des sensations, il faut lui reconnaître une forme de connaissance, de jugement et de pensée. La différence entre l'homme et l'animal n'est pas de nature mais de degré : elle tient essentiellement au langage conventionnel (les signes d'institution) dont dispose l'homme et qui lui permet de dépasser l'animalité qui ne peut compter que sur des signes naturels (cris et gestes)<ref>Condillac, ''Traité des animaux'', Paris, Vrin, 1755 [2004], introduction</ref>. Condillac affirme ainsi une continuité profonde entre l'homme et l'animal, et récuse l'opposition tranchée héritée de Descartes. == L'animal dans la philosophie moderne : sensibilité et considération morale == === Rousseau et la pitié naturelle === Jean-Jacques Rousseau (1712-1778) inaugure une approche nouvelle de l'animal en philosophie morale. Dans le ''Discours sur l'origine et les fondements de l'inégalité parmi les hommes'' (1755), il fait de la sensibilité, et non de la raison, le critère de la considération morale. Rousseau écrit : « Il semble, en effet, que, si je suis obligé de ne faire aucun mal à mon semblable, c'est moins parce qu'il est un être raisonnable que parce qu'il est un être sensible : qualité qui, étant commune à la bête et à l'homme, doit au moins donner à l'une le droit de n'être point maltraitée inutilement par l'autre »<ref>Jean-Jacques Rousseau, ''Discours sur l'origine et les fondements de l'inégalité parmi les hommes'', Paris, Flammarion, 1755 [2008], préface, p. 95</ref>. Ce déplacement est capital. La pitié, sentiment naturel et universel partagé par l'homme et l'animal, devient le fondement de la moralité. L'homme à l'état de nature possède, selon Rousseau, deux principes : l'amour de soi et la pitié. Cette dernière nous pousse spontanément à éprouver de la répugnance devant la souffrance d'autrui, qu'il soit humain ou animal<ref>Académie de Rennes, « La question de l'animalité dans le second discours de Rousseau », document pédagogique, 2020, disponible sur http://philosophie.ac-besancon.fr</ref>. Rousseau ouvre ainsi la voie à une éthique de la sensibilité qui aura une influence décisive sur les théoriciens ultérieurs de la considération morale des animaux. === Bentham et la capacité de souffrir === Jeremy Bentham (1748-1832), fondateur de l'utilitarisme, radicalise la position rousseauiste. Dans son ''Introduction aux principes de morale et de législation'' (1789), il pose la question célèbre qui marquera toute l'éthique animale contemporaine : « La question n'est pas : Peuvent-ils raisonner ? ni : Peuvent-ils parler ? mais : Peuvent-ils souffrir ? »<ref>Jeremy Bentham, ''Introduction to the Principles of Morals and Legislation'', 1789, chapitre XVII, note</ref>. Pour Bentham, la capacité à souffrir est le critère pertinent pour déterminer si un être mérite une considération morale. Dès lors qu'un organisme est en mesure d'éprouver la douleur, il peut subir un tort et doit être considéré comme un patient moral<ref>Académie de Rennes, « À propos de la souffrance animale : lecture d'un texte célèbre de Jeremy Bentham », 2021, disponible sur https://pedagogie.ac-rennes.fr</ref>. Cette approche, dite pathocentrique, s'oppose à l'anthropocentrisme traditionnel qui réserve la considération morale aux seuls êtres humains. Bentham ne va cependant pas jusqu'à interdire toute mise à mort ou exploitation des animaux. Sa position est plus nuancée : nous ne devons faire souffrir les animaux que lorsque cela est nécessaire pour assurer, parmi tous les êtres sensibles (humains et non-humains), un solde net de plaisir aussi élevé que possible. Ce qui est interdit, c'est de les faire souffrir ''inutilement''<ref>Bentham, manuscrit cité dans Nicolas Delon, « Pour une éthique animale descriptive », ''Klesis'', 2013, pp. 64-87</ref>. == La phénoménologie et l'être-au-monde de l'animal == === Heidegger et la pauvreté en monde === Au XXe siècle, la phénoménologie renouvelle l'approche philosophique de l'animal. Martin Heidegger (1889-1976) développe dans son cours de 1929-1930, ''Les Concepts fondamentaux de la métaphysique : Monde, finitude, solitude'', une thèse devenue célèbre : « la pierre est sans monde (''weltlos''), l'animal pauvre en monde (''weltarm''), l'homme formateur de monde (''weltbildend'') »<ref>Martin Heidegger, ''Les concepts fondamentaux de la métaphysique. Monde – finitude – solitude'', trad. Daniel Panis, Paris, Gallimard, 1992 [1929-1930], § 42</ref>. Cette pauvreté en monde de l'animal ne signifie pas qu'il lui manque quelque chose au sens d'une simple déficience. Elle désigne plutôt une structure ontologique spécifique : l'animal a bien un rapport à son environnement (son milieu, ''Umwelt''), mais ce rapport reste fermé à l'apparaître de l'étant en tant que tel. L'animal est « accaparé » (''benommen'') par ses pulsions, pris dans un comportement qui ne lui permet pas de se rapporter à l'être des choses<ref>Bruce Bégout, « Les animaux chez Heidegger », ''Labyrinthe'', n° 15, 2013, pp. 27-44</ref>. Heidegger s'appuie sur les travaux du biologiste Jakob von Uexküll concernant le monde propre (''Umwelt'') de chaque espèce animale. Chaque animal vit dans un environnement structuré par ses organes sensoriels et ses besoins vitaux. Ainsi, la tique ne perçoit de son environnement que trois stimuli : l'odeur d'acide butyrique, la présence de poils et la chaleur<ref>Inalco, « Episode 2 : Les animaux ont-ils un monde ? », document pédagogique, 2023, disponible sur https://philosophie.ac-versailles.fr</ref>. L'animal reste prisonnier de ce cercle fonctionnel, tandis que l'homme, par le langage et la pensée, peut ouvrir un monde au sens plein. Cette thèse heideggérienne a suscité de nombreuses controverses. Elle semble réintroduire une hiérarchie entre l'homme et l'animal, même si Heidegger lui-même reconnaît que « cette caractérisation de l'animalité par la pauvreté en monde n'est pas originaire, elle n'est pas tirée de l'animalité elle-même »<ref>Heidegger, ''Les concepts fondamentaux de la métaphysique'', op. cit., § 63</ref>. La pauvreté en monde apparaît donc comme une comparaison anthropocentrée plutôt que comme une description objective de l'être-animal. === Merleau-Ponty et la continuité charnelle === Maurice Merleau-Ponty (1908-1961) développe une approche différente de l'animalité, fondée sur la notion de comportement et de forme. Dans ''La Structure du comportement'' (1942), il critique aussi bien le mécanisme béhavioriste que l'idéalisme qui réduirait l'animal à un pur automate ou à une simple projection de la conscience humaine<ref>Maurice Merleau-Ponty, ''La Structure du comportement'', Paris, PUF, 1942 [1972]</ref>. Pour Merleau-Ponty, l'animal est « une autre existence » qui se manifeste comme phénomène perceptif indépendant de toute théorie sur « l'âme des bêtes ». L'animal possède une forme d'intériorité et d'expression corporelle qui témoigne d'un sens immanent à son comportement<ref>Jean-Christophe Goddard, « Une autre existence. En relisant La Structure du comportement de Maurice Merleau-Ponty », dans ''Pensée et rapport au vivant'', Paris, Éditions de la MSH, 2010, pp. 127-151</ref>. Toutefois, Merleau-Ponty maintient qu'« l'homme ne peut jamais être un animal » : même dans sa dimension la plus corporelle et la plus « sauvage », la perception humaine implique toujours déjà une dimension symbolique et langagière qui la distingue de la perception animale<ref>Étienne Bimbenet, « L'homme ne peut jamais être un animal », ''Bulletin d'Analyse Phénoménologique'', vol. 3, 2007</ref>. Dans ses cours sur la nature au Collège de France (1956-1960), Merleau-Ponty approfondit cette réflexion en soulignant que nous pratiquons, qu'on le sache ou non, une forme d'empathie (''Einfühlung'') envers les animaux. Toute zoologie suppose de notre part une capacité à nous mettre à la place de l'animal, à comprendre son monde propre de l'intérieur<ref>Christiane Bailey, « On the Phenomenological Basis of the Distinction between Animality and Humanity », texte disponible sur PhilPapers, 2011</ref>. Cette « parenté étrange » entre l'homme et l'animal ouvre la possibilité d'une compréhension non anthropomorphique de l'animalité. == L'éthique animale contemporaine : droits et libération == === Peter Singer et l'antispécisme utilitariste === La seconde moitié du XXe siècle voit l'émergence d'une nouvelle discipline philosophique : l'éthique animale. L'ouvrage fondateur est ''La Libération animale'' (''Animal Liberation'', 1975) du philosophe australien Peter Singer. S'inscrivant dans une perspective utilitariste, Singer dénonce le « spécisme », qu'il définit par analogie avec le racisme et le sexisme : le fait d'accorder moins de poids aux intérêts d'un être du simple fait qu'il n'appartient pas à l'espèce humaine<ref>Peter Singer, ''La libération animale'', trad. Louise Rousselle, Paris, Grasset, 1993 [1975]</ref>. Pour Singer, ce qui compte moralement, c'est la capacité à ressentir le plaisir et la souffrance, non l'appartenance à telle ou telle espèce. Reprenant le critère benthamien de la sensibilité, il affirme que « un intérêt est un intérêt quelle que soit la personne dont il est l'intérêt »<ref>Peter Singer, ''Questions d'éthique pratique'', trad. Max Marcuzzi, Paris, Bayard, 1997 [1979]</ref>. Dans l'optique de l'utilitarisme des préférences qu'il défend, il nous enjoint de considérer également les intérêts similaires des animaux non-humains et des humains. Cette approche conduit Singer à condamner l'élevage industriel, l'expérimentation animale non nécessaire et la consommation de viande. Si des millions d'animaux souffrent et meurent pour des raisons qui relèvent du simple plaisir gustatif humain ou de convenances économiques, alors nous commettons une injustice morale grave<ref>Valéry Giroux, « La justice et les autres animaux », texte disponible sur PhilPapers, 2012</ref>. Le mouvement de libération animale qu'inspire le livre de Singer vise ainsi l'abolition totale de l'exploitation animale. === Tom Regan et la théorie des droits des animaux === Tom Regan propose dans ''Les Droits des animaux'' (''The Case for Animal Rights'', 1983) une approche déontologique distincte de l'utilitarisme de Singer. Pour Regan, les animaux ne sont pas de simples réceptacles de plaisir et de douleur : ils sont des « sujets-d'une-vie » (''subjects-of-a-life'') possédant une valeur inhérente<ref>Tom Regan, ''Les droits des animaux'', trad. Enrique Utria, Paris, Hermann, 2013 [1983]</ref>. Un être est sujet-d'une-vie s'il possède des croyances, des désirs, une mémoire, un sens du futur, une vie émotionnelle, des préférences et des intérêts. Tous les mammifères normaux âgés d'au moins un an répondent à ces critères. En tant que possesseurs d'une valeur inhérente, ces animaux ont un droit fondamental à être traités avec respect. Ce droit ne peut être violé au nom d'un calcul utilitariste visant à maximiser le bien-être global<ref>Tom Regan, « Pour les droits des animaux », trad. Éric Moreau, ''Cahiers antispécistes'', n° 5, 1992</ref>. La théorie de Regan s'inscrit dans une tradition kantienne : elle affirme que certains êtres ne peuvent jamais être traités comme de simples moyens, mais doivent toujours être respectés comme des fins en soi. Cette approche conduit Regan à défendre l'abolition totale de l'élevage (même non industriel), de l'expérimentation animale et de la chasse<ref>Francione Bailey, « Les autres animaux en droit », texte disponible sur PhilPapers, 2018</ref>. === Les débats contemporains === L'éthique animale contemporaine est traversée par de nombreux débats. Au-delà de l'opposition entre utilitaristes et déontologues, se pose la question de savoir jusqu'où étendre la considération morale. Faut-il se limiter aux animaux sensibles (pathocentrisme) ou inclure tous les vivants (biocentrisme), voire les écosystèmes entiers (écocentrisme) ?<ref>Valéry Giroux, « Pathocentrisme », article disponible sur PhilPapers, 2015</ref> D'autres philosophes interrogent les présupposés impartialistes de l'éthique animale anglo-saxonne. Clare Palmer, par exemple, défend une approche relationnelle qui accorde de l'importance aux relations concrètes que nous entretenons avec les animaux (domestiques, sauvages, etc.) plutôt qu'à une égalité abstraite<ref>Nicolas Delon, « Pour une éthique animale descriptive », ''Klesis'', vol. 27, 2013</ref>. Le véganisme lui-même, souvent présenté comme la conséquence logique de la prise en compte des intérêts animaux, fait l'objet de discussions sur sa pertinence universelle<ref>François Jaquet, « Véganisme (A) », ''L'Encyclopédie philosophique'', 2018, https://encyclo-philo.fr/veganisme-a</ref>. == La déconstruction derridienne de l'animalité == Jacques Derrida (1930-2004) propose une approche radicalement différente de la question animale. Dans ''L'animal que donc je suis'' (2006), il part d'une scène intime : la rencontre avec le regard de son chat alors qu'il se trouve nu dans sa salle de bains. Cette expérience banale devient le point de départ d'une déconstruction de toute la tradition philosophique occidentale qui a construit l'opposition binaire homme/animal<ref>Jacques Derrida, ''L'animal que donc je suis'', Paris, Galilée, 2006</ref>. Derrida montre que cette opposition, loin d'être une évidence naturelle, est un construit philosophique et politique qui a servi à légitimer l'exploitation et la violence envers les animaux. De Descartes à Heidegger, en passant par Kant, Levinas et Lacan, la philosophie occidentale a systématiquement refusé aux animaux ce qu'elle réservait à l'homme : le langage, la raison, la conscience, le rapport à la mort, le deuil, etc.<ref>Jean Grondin, « Derrida et la question de l'animal », ''Cités'', n° 30, 2007, pp. 31-42</ref> Pour Derrida, il faut renoncer à parler de « l'Animal » au singulier, qui n'est qu'une abstraction masquant l'infinie diversité des vivants. Il forge le néologisme « l'animot » pour souligner la dimension langagière de cette construction et la nécessité de penser les animaux au pluriel, dans leur singularité irréductible<ref>Patrick Llored, « L'animal debout – Derrida antispéciste », texte disponible sur Diacritik.com, 2016</ref>. La déconstruction derridienne ouvre ainsi la voie à une pensée de l'altérité radicale de l'animal qui refuse aussi bien l'anthropomorphisme que l'anthropocentrisme. == Conclusion : l'animal, miroir de l'humanité == La question de l'animal traverse toute l'histoire de la philosophie occidentale. D'Aristote à Derrida, en passant par Montaigne, Descartes, Rousseau, Bentham, Heidegger et Singer, les philosophes n'ont cessé de s'interroger sur ce qui nous rapproche et ce qui nous distingue des autres animaux. Cette interrogation n'est jamais purement théorique : elle engage toujours aussi notre compréhension de l'humanité et de nos devoirs moraux. Trois grandes positions structurent ce débat. La première affirme une rupture ontologique entre l'homme et l'animal, fondée sur la possession du logos, de la raison ou du langage (Aristote, Descartes, Heidegger). La deuxième défend une continuité entre l'homme et l'animal, tous deux étant des êtres sensibles soumis aux mêmes lois naturelles (Montaigne, Rousseau, Condillac). La troisième position, plus récente, cherche à déconstruire l'opposition même entre l'homme et l'animal pour penser une multiplicité irréductible des formes de vie (Derrida). Sur le plan éthique, la reconnaissance de la sensibilité animale a conduit à l'émergence d'une discipline nouvelle, l'éthique animale, qui remet en cause le spécisme traditionnel et défend les droits ou les intérêts des animaux. Les débats contemporains sur l'élevage industriel, l'expérimentation animale, la chasse et le véganisme témoignent de l'actualité brûlante de ces questions philosophiques<ref>Florence Burgat, « La personne, une catégorie juridique souple pour accueillir les animaux ? », texte disponible sur PhilPapers, 2023</ref>. Penser l'animal, c'est donc toujours aussi repenser l'humain. La façon dont nous traitons les animaux révèle quelque chose d'essentiel sur notre propre humanité. Comme l'écrivait Montaigne, « ce n'est par vrai discours » que nous nous préférons aux autres animaux, mais par « une fierté folle et opiniâtreté ». La philosophie, en interrogeant cette présomption, nous invite à exercer notre humanité autrement : en reconnaissant l'existence des animaux en tant qu'individus dignes de respect et de considération. == Références == {{references}} == Bibliographie sélective == * Aristote, ''Histoire des animaux'', trad. Pierre Louis, Paris, Les Belles Lettres, « Collection des universités de France », 3 tomes, 1964-1969 * Aristote, ''Les Parties des animaux'', trad. Pierre Louis, Paris, Les Belles Lettres, 1956 * Montaigne, Michel de, ''Les Essais'', éd. Pierre Villey, Paris, PUF, « Quadrige », 2004 * Descartes, René, ''Discours de la méthode'', Paris, Vrin, 1637 [1992] * Rousseau, Jean-Jacques, ''Discours sur l'origine et les fondements de l'inégalité parmi les hommes'', Paris, Flammarion, 1755 [2008] * Bentham, Jeremy, ''Introduction to the Principles of Morals and Legislation'', Londres, 1789 * Condillac, Étienne Bonnot de, ''Traité des animaux'', Paris, Vrin, 1755 [2004] * Heidegger, Martin, ''Les concepts fondamentaux de la métaphysique. Monde – finitude – solitude'', trad. Daniel Panis, Paris, Gallimard, 1992 * Merleau-Ponty, Maurice, ''La Structure du comportement'', Paris, PUF, 1942 * Singer, Peter, ''La libération animale'', trad. Louise Rousselle, Paris, Grasset, 1993 [1975] * Regan, Tom, ''Les droits des animaux'', trad. Enrique Utria, Paris, Hermann, 2013 [1983] * Derrida, Jacques, ''L'animal que donc je suis'', Paris, Galilée, 2006 * Boudou, Bénédicte, ''Montaigne et les animaux'', Paris, Classiques Garnier, 2016 * Chapouthier, Georges, ''Qu'est-ce que l'animal ?'', Paris, Le Pommier, 2004 * Gontier, Thierry, ''De l'homme à l'animal : Montaigne et Descartes ou les paradoxes de la philosophie moderne sur la nature des animaux'', Paris, Vrin, 1998 * Burgat, Florence, ''Une autre existence. La condition animale'', Paris, Albin Michel, 2012 * Lestel, Dominique, ''L'animal est l'avenir de l'homme'', Paris, Fayard, 2010 == Articles et ressources en ligne == * Encyclo-philo.fr : articles « Animal (A) », « Souffrance animale (GP) », « Spécisme (A) », « Véganisme (A) » * PhilPapers : bibliographie complète sur « Animal Minds » et « Animal Ethics » {{Autocat}} nx333dbj5rw4e793jn6s0t8isnvlow0 Dictionnaire de philosophie/Amour 0 83041 768152 759597 2026-06-19T04:14:33Z PandaMystique 119061 Bot : ajout du paramètre lecture=oui au modèle {{DicoPhilo}} 768152 wikitext text/x-wiki {{DicoPhilo|- Amour -|lecture=oui}} L{{'}}'''amour''' est un concept philosophique fondamental qui traverse l'histoire de la pensée occidentale depuis l'Antiquité grecque jusqu'à nos jours. Désignant à la fois un affect, une relation, une vertu et une force cosmique, l'amour constitue un objet privilégié de la réflexion philosophique sur la nature humaine, l'éthique et la métaphysique<ref>Cassin, Barbara (dir.), ''Vocabulaire européen des philosophies. Dictionnaire des intraduisibles'', Paris, Seuil/Le Robert, 2004, p. 33-36</ref>. Le terme français « amour » dérive du latin ''amor'', lui-même possiblement forgé sur ''amma'' (« maman »), suggérant une dimension originaire d'attachement et de soin<ref>Cassin, Barbara (dir.), ''op. cit.'', p. 33</ref>. Cette étymologie témoigne déjà de la polysémie constitutive du concept : l'amour désigne aussi bien la passion érotique que l'affection familiale, l'amitié que la charité, le désir sensuel que l'aspiration spirituelle. == Les distinctions grecques fondamentales == La pensée grecque antique a établi plusieurs distinctions conceptuelles qui structurent encore aujourd'hui notre compréhension philosophique de l'amour. Trois termes principaux organisent cette typologie : === ''Éros'' (ἔρως) : l'amour-désir === L{{'}}''éros'' désigne l'amour passionnel, caractérisé par le désir et le manque. Cette conception trouve son expression la plus élaborée dans le ''Banquet'' de Platon (vers 385-370 av. J.-C.), où plusieurs discours successifs explorent la nature de l'amour<ref>Platon, ''Le Banquet'', trad. fr. Luc Brisson, Paris, Flammarion, coll. « GF », 1998 [vers 385-370 av. J.-C.], 202a-212c</ref>. Dans le discours de Diotime rapporté par Socrate, l'amour est défini comme un ''daimôn'' (δαίμων), être intermédiaire entre les dieux et les hommes, né de Poros (Ressource) et Pénia (Pauvreté). Cette généalogie mythique exprime philosophiquement que « ''l'amour est désir de ce dont on manque'' »<ref>Platon, ''Le Banquet'', 200a-201c</ref>. L'éraste (amant) désire l'éromène (aimé) parce qu'il lui manque : on ne désire que ce qu'on ne possède pas. Cette conception fait de l'amour une aspiration perpétuelle vers la beauté et, ultimement, vers le Bien absolu<ref>Platon, ''Le Banquet'', 210a-212a</ref>. Le philosophe français André Comte-Sponville résume ainsi la position platonicienne : « L'amour est désir, et le désir est manque : on ne désire et donc on n'aime que ce dont on manque »<ref>Comte-Sponville, André, ''L'Amour en quatre leçons'', Paris, Albin Michel, 2003, p. 15-32</ref>. Cette définition implique paradoxalement qu'il n'existe pas d'amour heureux au sens platonicien : dès qu'un désir est satisfait, il cesse d'être désir, donc cesse d'être amour. === ''Philia'' (φιλία) : l'amour-amitié === La ''philia'' aristotélicienne désigne une relation d'égalité et de réciprocité fondée sur la vertu commune. Aristote consacre deux livres entiers de son ''Éthique à Nicomaque'' (livres VIII et IX) à l'analyse de la ''philia'', qu'il considère comme essentielle à la vie bonne<ref>Aristote, ''Éthique à Nicomaque'', livres VIII-IX, trad. fr. Richard Bodéüs, Paris, Flammarion, coll. « GF », 2004 [vers 340-325 av. J.-C.]</ref>. Aristote distingue trois types d{{'}}''amitié'' selon leur objet : * L'amitié fondée sur l'utilité (relation intéressée) * L'amitié fondée sur le plaisir (relation agréable) * L'amitié fondée sur la vertu (amitié parfaite) Seule cette dernière constitue la véritable ''philia'', car elle vise le bien de l'ami pour lui-même, et non pour ce qu'il nous apporte. Aristote écrit : « Aimer, c'est se réjouir »<ref>Aristote, ''Éthique à Nicomaque'', VIII, 2, 1155b27-1156a5</ref>. Cette définition contraste radicalement avec la conception platonicienne : l'amitié aristotélicienne n'est pas manque mais joie, non désir de possession mais célébration de l'existence de l'autre. === ''Agapè'' (ἀγάπη) : l'amour-charité === L{{'}}''agapè'' désigne dans le Nouveau Testament l'amour divin et la charité chrétienne. Ce concept, peu développé dans la philosophie grecque classique, acquiert une importance centrale dans la pensée chrétienne médiévale à travers sa traduction latine ''caritas''<ref>Cassin, Barbara (dir.), ''op. cit.'', p. 34</ref>. Saint Augustin (354-430) fait de la ''caritas'' le principe organisateur de toute sa philosophie morale : « Ille autem iuste et sancte vivit qui rerum integer aestimator est : ipse est autem qui ordinatam dilectionem habet » (« Celui-là vit en juste et en saint qui apprécie toutes choses à leur juste valeur : il possède ainsi un amour ordonné »)<ref>Augustin, ''De doctrina christiana'', I, 28, PL 34, col. 30</ref>. Cette « charité ordonnée » se distingue de l{{'}}''éros'' platonicien par son désintéressement radical et de la ''philia'' aristotélicienne par son universalisme : elle s'adresse également à l'ami et à l'ennemi, au proche et au lointain. == Les théories médiévales de l'amour == === L'amor concupiscentiae et l'amor benevolentiae === Les théologiens scolastiques systématisent une distinction héritée d'Augustin entre deux formes fondamentales d'amour<ref>Goulet, Richard (dir.), ''Dictionnaire des philosophes antiques'', Supplément, Paris, CNRS Éditions, 2003, p. 925-926</ref> : * L{{'}}''amor concupiscentiae'' (amour de convoitise) : désir de possession visant la jouissance personnelle * L{{'}}''amor benevolentiae'' (amour de bienveillance) : volonté du bien de l'autre pour lui-même Thomas d'Aquin (1225-1274) intègre cette distinction dans sa synthèse aristotélico-chrétienne, distinguant l{{'}}''amor concupiscentiae'' qui cherche le bien pour soi, et l{{'}}''amor amicitiae'' qui veut le bien de l'aimé pour lui-même<ref>Thomas d'Aquin, ''Somme théologique'', Ia-IIae, q. 26, a. 4</ref>. === Le débat entre Bernard de Clairvaux et Guillaume de Saint-Thierry === Un débat médiéval important oppose deux conceptions de l'amour divin : Bernard de Clairvaux (1090-1153) célèbre un amour comme ''affectus'', élan du cœur échappant à toute mesure rationnelle. Pour Bernard, l'amour mystique est essentiellement affectif et dépasse la raison<ref>Bernard de Clairvaux, ''Sermons sur le Cantique des Cantiques'', éd. et trad. fr. Raffaele Fassetta et Paul Verdeyen, Paris, Cerf, coll. « Sources chrétiennes », 1996-2007</ref>. Guillaume de Saint-Thierry (vers 1075-1148), disciple de Bernard, développe néanmoins une théorie de l{{'}}''amor-intellectio'' : un amour réglé par la connaissance, où intelligence et affectivité se pénètrent mutuellement<ref>Guillaume de Saint-Thierry, ''De natura et dignitate amoris'', PL 184, col. 379-408</ref>. == Les philosophies modernes de l'amour == === Descartes et l'amour estimatif === René Descartes (1596-1650), dans son dernier ouvrage ''Les Passions de l'âme'' (1649), propose une analyse systématique de l'amour comme passion. Il distingue notamment : « L'amour se distingue des autres affections par l'estime qu'on fait de ce qu'on aime, comparaison de soi-même »<ref>Descartes, René, ''Les Passions de l'âme'', art. 83, in ''Œuvres'', éd. Charles Adam et Paul Tannery, Paris, Vrin, 1996 , t. XI, p. 389</ref>. Descartes insiste sur le rôle de l'estimation intellectuelle dans l'amour : nous aimons selon les jugements que nous portons sur la bonté des objets. Cette conception « estimative » sera influente au XVIIe siècle, notamment chez Corneille. Descartes distingue aussi l'amour de concupiscence (désir de posséder l'objet aimé) et l'amour de bienveillance (volonté du bien de l'aimé), mais affirme que ces deux dimensions sont mêlées dans tout amour véritable<ref>Descartes, René, ''Les Passions de l'âme'', art. 81, p. 387</ref>. === Spinoza et l'amor intellectualis Dei === Baruch Spinoza (1632-1677) révolutionne la pensée de l'amour en le définissant comme « une joie qu'accompagne l'idée d'une cause extérieure »<ref>Spinoza, Baruch, ''Éthique'', III, définition 6, trad. fr. Bernard Pautrat, Paris, Seuil, 1988 , p. 219</ref>. Cette définition rompt radicalement avec la tradition platonicienne : l'amour n'est plus manque mais joie, non désir de possession mais réjouissance de l'existence de l'autre. Pour Spinoza, le désir (''cupiditas'') n'est pas manque mais puissance d'agir (''potentia agendi''). L'amour exprime donc une augmentation de notre puissance d'être, une intensification de notre joie existentielle. Le couronnement de la philosophie spinoziste est l{{'}}''amor Dei intellectualis'' (amour intellectuel de Dieu), où l'âme atteint la béatitude en comprenant sa participation à la substance infinie<ref>Spinoza, Baruch, ''Éthique'', V, prop. 32-36, p. 579-589</ref>. Cet amour, qui « dépasse la raison même et la loi », représente la plénitude de la connaissance et empêche l'âme de se perdre dans les passions-tourments. André Comte-Sponville résume ainsi la position spinoziste : « Je suis joyeux à l'idée que tu existes. [...] C'est une déclaration d'amour qui ne vous demande rien »<ref>Comte-Sponville, André, ''op. cit.'', p. 45-62</ref>. L'amour spinoziste, contrairement au platonicien, permet de penser la possibilité d'un amour heureux. === Kant et la distinction amour pathologique / amour pratique === Emmanuel Kant (1724-1804) oppose radicalement deux formes d'amour dans sa philosophie morale : L{{'}}''amour pathologique'' (au sens kantien de ''pathologisch'', c'est-à-dire relevant de la sensibilité) : inclination affective, sentiment subi, appartenant à l'ordre des penchants naturels. L{{'}}''amour pratique'' : disposition rationnelle de la volonté, commandement moral qui ne repose pas sur un sentiment mais sur le devoir<ref>Kant, Emmanuel, ''Critique de la raison pratique'', I, I, 3, trad. fr. François Picavet, Paris, PUF, 1943 , p. 86-87</ref>. Dans la ''Doctrine de la vertu'' (1797), Kant précise que « l'amitié [...] est quelque chose de si tendre que, si on la fait reposer sur des sentiments et non sur des principes et des règles, elle ne peut être un seul instant assurée contre des interruptions »<ref>Kant, Emmanuel, ''Métaphysique des mœurs'', II, ''Doctrine de la vertu'', § 46, trad. fr. Alain Renaut, Paris, Flammarion, coll. « GF », 1994 , p. 344</ref>. Pour Kant, seul l'amour pratique, fondé sur des principes rationnels et non sur des sentiments instables, peut constituer le fondement d'une éthique universelle. Cette position influencera profondément la philosophie morale ultérieure. == Les approches contemporaines == === Freud et la psychanalyse de l'amour === Sigmund Freud (1856-1939) révolutionne la compréhension de l'amour en l'analysant comme phénomène psychique complexe enraciné dans la libido. Dans son essai « Psychologie des foules et analyse du moi » (1921), Freud note que le terme ''Liebe'' (amour) « reste plein d'ambiguïtés » car il désigne une vaste gamme de relations affectives<ref>Freud, Sigmund, ''Psychologie des foules et analyse du moi'', § 8, in ''Essais de psychanalyse'', trad. fr. Pierre Cotet et al., Paris, Payot, 1981 , p. 172-173</ref>. Freud distingue notamment : * Le ''courant sensuel'' (''sinnliche Strömung'') : pulsions sexuelles directes * Le ''courant tendre'' (''Zärtlichkeitsgefühle'') : sentiments inhibés quant au but sexuel Le développement normal consiste en une synthèse harmonieuse de ces deux courants. À l'inverse, leur clivage pathologique produit des troubles caractéristiques : l'homme qui ne peut être amoureux que de femmes qu'il méprise, ou inversement qui vénère des femmes qu'il ne désire pas<ref>Freud, Sigmund, « Sur un type particulier de choix d'objet chez l'homme », in ''Contributions à la psychologie de la vie amoureuse'', trad. fr. Denise Berger et al., Paris, PUF, 1969 , p. 47-55</ref>. Jacques Lacan (1901-1981) radicalise cette distinction en posant une opposition radicale entre amour et désir : « Quand on aime, il ne s'agit pas de sexe »<ref>Lacan, Jacques, ''Le Séminaire, Livre VIII, Le Transfert (1960-1961)'', Paris, Seuil, 1991, p. 12</ref>. Pour Lacan, l'amour serait « ignorance du désir », sentimentalité désérotisée. Cette conception, bien que tempérée par la reconnaissance du rôle de l'amour dans le transfert analytique, marque une rupture avec la conception freudienne qui maintenait un lien entre amour et libido. === Iris Murdoch et l'épistémologie de l'amour === La philosophe britannique Iris Murdoch (1919-1999) accorde à l'amour une fonction épistémique fondamentale dans son œuvre maîtresse ''The Sovereignty of Good'' (1970). Elle affirme que « l'amour est un concept central en morale » et que « nous avons besoin d'une philosophie morale où le concept d'amour, si rarement mentionné maintenant par les philosophes, puisse à nouveau devenir central »<ref>Murdoch, Iris, ''The Sovereignty of Good'', London, Routledge, 1970, p. 2 et 46</ref>. Pour Murdoch, « l'amour est la perception des individus. L'amour est la réalisation extrêmement difficile que quelque chose d'autre que soi-même est réel. L'amour, et donc l'art et la morale, est la découverte de la réalité »<ref>Murdoch, Iris, « The Sublime and the Good », in ''Existentialists and Mystics'', London, Chatto & Windus, 1959, p. 51</ref>. Murdoch illustre cette thèse par son célèbre exemple de la belle-mère (« M ») qui, initialement hostile à sa belle-fille (« D »), parvient progressivement, par un effort d'attention aimante, à voir en elle des qualités qu'elle n'avait pas perçues auparavant. Cet exemple démontre que l'amour n'est pas simple sentiment subjectif mais méthode cognitive permettant d'accéder à la réalité d'autrui<ref>Murdoch, Iris, ''The Sovereignty of Good'', p. 17-18</ref>. Pour Murdoch, l'amour est une vertu épistémique fondamentale : « Toute vision juste, même dans les problèmes les plus stricts de l'intellect, et a fortiori quand souffrance ou méchanceté doivent être perçues, est une affaire morale. Les mêmes vertus, en fin de compte la même vertu (l'amour), sont requises partout »<ref>Murdoch, Iris, ''The Sovereignty of Good'', p. 70</ref>. L'amour occupe ainsi une place unique dans la hiérarchie des vertus : il est la forme même de toutes les vertus, car toute perception vertueuse requiert l'attention aimante au réel. === Les théories contemporaines de l'amour romantique === La philosophie analytique contemporaine a développé plusieurs théories de l'amour romantique : '''La théorie de l'union''' (Union Theory) : défendue par Robert Nozick et Robert Solomon, elle conçoit l'amour comme formation d'un « nous », union réelle ou métaphorique des amants. « Aimer quelqu'un, c'est former un nous », écrit Nozick<ref>Nozick, Robert, ''The Examined Life'', New York, Simon & Schuster, 1989, p. 68-86</ref>. Cette approche actualise la métaphore platonicienne de l'androgyne du ''Banquet''. '''La théorie de la sollicitude''' (Concern Theory) : l'amour consiste essentiellement dans le souci désintéressé du bien-être de l'aimé pour lui-même, non comme moyen mais comme fin<ref>Frankfurt, Harry, ''The Reasons of Love'', Princeton, Princeton University Press, 2004, p. 42-43</ref>. '''La théorie évaluative''' : l'amour est une forme d'évaluation positive de l'aimé, perception de sa valeur intrinsèque ou de sa beauté<ref>Velleman, J. David, « Love as a Moral Emotion », ''Ethics'', vol. 109, n° 2, 1999, p. 338-374</ref>. Ces théories débattent notamment de la question de savoir si l'amour peut être justifié par des raisons (l'aimé possède-t-il des propriétés qui le rendent digne d'amour ?) ou s'il est sans raison, conférant lui-même la valeur à son objet. == Amor fati : Nietzsche et l'amour du destin == Friedrich Nietzsche (1844-1900) introduit dans sa philosophie tardive le concept d{{'}}''amor fati'' (amour du destin), qui représente une transformation radicale de la conception traditionnelle de l'amour. Dans ''Ecce Homo'' (1888), Nietzsche proclame : « Ma formule pour la grandeur chez un être humain est amor fati : que l'on ne veuille rien de différent, ni en avant, ni en arrière, ni dans toute l'éternité. Non pas seulement supporter le nécessaire, encore moins le dissimuler... mais l'aimer »<ref>Nietzsche, Friedrich, ''Ecce Homo'', « Pourquoi je suis si avisé », § 10, in ''Œuvres philosophiques complètes'', VIII, trad. fr. Jean-Claude Hémery, Paris, Gallimard, 1974 , p. 266</ref>. L{{'}}''amor fati'' nietzschéen se distingue radicalement : * De la résignation stoïcienne : il ne s'agit pas de supporter mais d'aimer * De l'acceptation chrétienne : il ne s'agit pas de se soumettre à la volonté divine mais d'affirmer joyeusement le devenir * De l'optimisme leibnizien : il ne s'agit pas de justifier le monde comme « meilleur des mondes possibles » mais de l'aimer tel qu'il est, y compris dans ses aspects tragiques L{{'}}''amor fati'' est intimement lié à la doctrine de l'éternel retour : aimer sa vie au point de vouloir la revivre éternellement, identique en chaque détail<ref>Han-Pile, Béatrice, « Nietzsche and Amor Fati », ''European Journal of Philosophy'', vol. 19, n° 2, 2011, p. 224-261</ref>. Cette exigence constitue le test ultime de l'affirmation de la vie : « Si vraiment nous sommes heureux de vivre, alors nous devons vouloir revivre éternellement chaque instant de notre vie à l'infini »<ref>Brodsky, Garry M., « Nietzsche's Notion of Amor Fati », ''International Studies in Philosophy'', vol. 30, n° 3, 1998, p. 23-30</ref>. == Perspectives pluridisciplinaires == === Anthropologie et universalité de l'amour === Le philosophe français Francis Wolff défend l'idée que l'amour constitue un « universel anthropologique » : « Dans toutes les sociétés, à tous les moments de l'histoire, il existe une relation entre amants que nous appelons "amour", comme en témoignent les littératures et la poésie du monde entier »<ref>Wolff, Francis, ''Il n'y a pas d'amour parfait'', Paris, Fayard, 2016, p. 15-30</ref>. Selon Wolff, l'amour naît du mélange de trois composantes indépendantes : * L'amitié (''philia'') * La passion (''pathos'') * Le désir sexuel (''éros'') Lorsque deux ou trois de ces composantes fusionnent, surgit ce « quelque chose de nouveau qu'on appelle l'amour ». Cette approche synthétique permet de rendre compte de la diversité des formes d'amour tout en maintenant son unité conceptuelle. === Sociologie de l'amour === Le sociologue français Pierre Bourdieu a esquissé dans ''La Domination masculine'' (1998) une approche de l'amour comme « capital » opérant dans des champs de relations intimes. Bien que Bourdieu ait présenté l'amour comme possibilité d'échapper aux relations de domination, il a aussi compris que l'amour était « produit du travail, inséré dans une économie d'échanges, et susceptible de se voir infusé de domination »<ref>Bourdieu, Pierre, ''La Domination masculine'', Paris, Seuil, 1998, p. 118-126</ref>. Des travaux récents prolongent cette approche en conceptualisant l'amour comme forme de capital social et émotionnel, influençant les structures des champs intimes contemporains<ref>Santos, Carolina, « Bourdieu on Love: A Latent Capital, a Primary Field and a New Research Agenda », ''Sociology'', vol. 58, n° 4, 2024, p. 823-841</ref>. === Neurosciences et biologie de l'amour === Les neurosciences contemporaines ont identifié les corrélats neuronaux de l'expérience amoureuse, notamment l'activation du système de récompense dopaminergique et la libération d'ocytocine et de vasopressine. Certains chercheurs, comme la biologiste Helen Fisher, conceptualisent l'amour romantique comme un « drive » ou système motivationnel fondamental, distinct des émotions proprement dites<ref>Fisher, Helen, ''Why We Love: The Nature and Chemistry of Romantic Love'', New York, Henry Holt, 2004, p. 51-79</ref>. Ces découvertes posent la question philosophique de la réductibilité de l'amour à ses mécanismes neurobiologiques. La plupart des philosophes contemporains défendent une approche non-réductionniste : même si l'amour possède des bases biologiques, son sens et sa valeur ne peuvent être entièrement expliqués en termes neurochimiques. == Conclusion == L'amour demeure l'un des concepts les plus polysémiques et les plus débattus de la philosophie. Depuis Platon jusqu'aux philosophes contemporains, il interroge la nature du désir et du manque, la possibilité du bonheur, la relation entre raison et passion, la constitution du sujet et de l'identité personnelle, ainsi que les fondements de l'éthique et de la vie bonne. Les distinctions grecques classiques entre ''éros'', ''philia'' et ''agapè'' continuent de structurer notre compréhension philosophique, mais elles ont été enrichies et complexifiées par les débats médiévaux, les analyses modernes de Descartes, Spinoza et Kant, les révolutions psychanalytiques de Freud et Lacan, et les approches contemporaines qui intègrent les apports de l'anthropologie, de la sociologie et des neurosciences. La philosophie de l'amour reste un champ de recherche vivant, où se croisent questions métaphysiques (qu'est-ce qu'aimer ?), épistémologiques (l'amour est-il une forme de connaissance ?), éthiques (quelles sont nos obligations envers ceux que nous aimons ?) et politiques (comment penser l'amour dans les structures sociales de domination ?). == Notes et références == {{references}} == Bibliographie sélective == === Sources antiques === * Platon, ''Le Banquet'', trad. fr. Luc Brisson, Paris, Flammarion, coll. « GF », 1998 [vers 385-370 av. J.-C.]. * Aristote, ''Éthique à Nicomaque'', livres VIII-IX, trad. fr. Richard Bodéüs, Paris, Flammarion, coll. « GF », 2004 [vers 340-325 av. J.-C.]. === Sources médiévales === * Augustin, ''De doctrina christiana'', PL 34. * Bernard de Clairvaux, ''Sermons sur le Cantique des Cantiques'', éd. et trad. fr. Raffaele Fassetta et Paul Verdeyen, Paris, Cerf, coll. « Sources chrétiennes », 1996-2007. * Thomas d'Aquin, ''Somme théologique'', Ia-IIae, q. 26-28. === Sources modernes === * Descartes, René, ''Les Passions de l'âme'' (1649), in ''Œuvres'', éd. Charles Adam et Paul Tannery, Paris, Vrin, 1996, t. XI. * Spinoza, Baruch, ''Éthique'' (1677), trad. fr. Bernard Pautrat, Paris, Seuil, 1988. * Kant, Emmanuel, ''Métaphysique des mœurs'' (1797), trad. fr. Alain Renaut, Paris, Flammarion, coll. « GF », 1994. === Sources contemporaines === * Freud, Sigmund, ''Essais de psychanalyse'' (1921), trad. fr. Pierre Cotet et al., Paris, Payot, 1981. * Lacan, Jacques, ''Le Séminaire, Livre VIII, Le Transfert (1960-1961)'', Paris, Seuil, 1991. * Murdoch, Iris, ''The Sovereignty of Good'', London, Routledge, 1970. * Nietzsche, Friedrich, ''Ecce Homo'' (1888), in ''Œuvres philosophiques complètes'', VIII, trad. fr. Jean-Claude Hémery, Paris, Gallimard, 1974. === Études secondaires === * Cassin, Barbara (dir.), ''Vocabulaire européen des philosophies. Dictionnaire des intraduisibles'', Paris, Seuil/Le Robert, 2004, p. 33-36. * Comte-Sponville, André, ''L'Amour en quatre leçons'', Paris, Albin Michel, 2003. * Frankfurt, Harry, ''The Reasons of Love'', Princeton, Princeton University Press, 2004. * Nozick, Robert, ''The Examined Life'', New York, Simon & Schuster, 1989. * Wolff, Francis, ''Il n'y a pas d'amour parfait'', Paris, Fayard, 2016. [[Catégorie:Éthique]] [[Catégorie:Métaphysique]] [[Catégorie:Phénoménologie]] [[Catégorie:Psychologie]] [[Catégorie:Théologie]] {{Autocat}} 5f0wwiiogvosq3xwc3pod2qormptcyw 768161 768152 2026-06-19T05:30:44Z PandaMystique 119061 768161 wikitext text/x-wiki {{DicoPhilo|Amour|lecture=oui}} L{{'}}'''amour''' est un concept philosophique fondamental qui traverse l'histoire de la pensée occidentale depuis l'Antiquité grecque jusqu'à nos jours. Désignant à la fois un affect, une relation, une vertu et une force cosmique, l'amour constitue un objet privilégié de la réflexion philosophique sur la nature humaine, l'éthique et la métaphysique<ref>Cassin, Barbara (dir.), ''Vocabulaire européen des philosophies. Dictionnaire des intraduisibles'', Paris, Seuil/Le Robert, 2004, p. 33-36</ref>. Le terme français « amour » dérive du latin ''amor'', lui-même possiblement forgé sur ''amma'' (« maman »), suggérant une dimension originaire d'attachement et de soin<ref>Cassin, Barbara (dir.), ''op. cit.'', p. 33</ref>. Cette étymologie témoigne déjà de la polysémie constitutive du concept : l'amour désigne aussi bien la passion érotique que l'affection familiale, l'amitié que la charité, le désir sensuel que l'aspiration spirituelle. == Les distinctions grecques fondamentales == La pensée grecque antique a établi plusieurs distinctions conceptuelles qui structurent encore aujourd'hui notre compréhension philosophique de l'amour. Trois termes principaux organisent cette typologie : === ''Éros'' (ἔρως) : l'amour-désir === L{{'}}''éros'' désigne l'amour passionnel, caractérisé par le désir et le manque. Cette conception trouve son expression la plus élaborée dans le ''Banquet'' de Platon (vers 385-370 av. J.-C.), où plusieurs discours successifs explorent la nature de l'amour<ref>Platon, ''Le Banquet'', trad. fr. Luc Brisson, Paris, Flammarion, coll. « GF », 1998 [vers 385-370 av. J.-C.], 202a-212c</ref>. Dans le discours de Diotime rapporté par Socrate, l'amour est défini comme un ''daimôn'' (δαίμων), être intermédiaire entre les dieux et les hommes, né de Poros (Ressource) et Pénia (Pauvreté). Cette généalogie mythique exprime philosophiquement que « ''l'amour est désir de ce dont on manque'' »<ref>Platon, ''Le Banquet'', 200a-201c</ref>. L'éraste (amant) désire l'éromène (aimé) parce qu'il lui manque : on ne désire que ce qu'on ne possède pas. Cette conception fait de l'amour une aspiration perpétuelle vers la beauté et, ultimement, vers le Bien absolu<ref>Platon, ''Le Banquet'', 210a-212a</ref>. Le philosophe français André Comte-Sponville résume ainsi la position platonicienne : « L'amour est désir, et le désir est manque : on ne désire et donc on n'aime que ce dont on manque »<ref>Comte-Sponville, André, ''L'Amour en quatre leçons'', Paris, Albin Michel, 2003, p. 15-32</ref>. Cette définition implique paradoxalement qu'il n'existe pas d'amour heureux au sens platonicien : dès qu'un désir est satisfait, il cesse d'être désir, donc cesse d'être amour. === ''Philia'' (φιλία) : l'amour-amitié === La ''philia'' aristotélicienne désigne une relation d'égalité et de réciprocité fondée sur la vertu commune. Aristote consacre deux livres entiers de son ''Éthique à Nicomaque'' (livres VIII et IX) à l'analyse de la ''philia'', qu'il considère comme essentielle à la vie bonne<ref>Aristote, ''Éthique à Nicomaque'', livres VIII-IX, trad. fr. Richard Bodéüs, Paris, Flammarion, coll. « GF », 2004 [vers 340-325 av. J.-C.]</ref>. Aristote distingue trois types d{{'}}''amitié'' selon leur objet : * L'amitié fondée sur l'utilité (relation intéressée) * L'amitié fondée sur le plaisir (relation agréable) * L'amitié fondée sur la vertu (amitié parfaite) Seule cette dernière constitue la véritable ''philia'', car elle vise le bien de l'ami pour lui-même, et non pour ce qu'il nous apporte. Aristote écrit : « Aimer, c'est se réjouir »<ref>Aristote, ''Éthique à Nicomaque'', VIII, 2, 1155b27-1156a5</ref>. Cette définition contraste radicalement avec la conception platonicienne : l'amitié aristotélicienne n'est pas manque mais joie, non désir de possession mais célébration de l'existence de l'autre. === ''Agapè'' (ἀγάπη) : l'amour-charité === L{{'}}''agapè'' désigne dans le Nouveau Testament l'amour divin et la charité chrétienne. Ce concept, peu développé dans la philosophie grecque classique, acquiert une importance centrale dans la pensée chrétienne médiévale à travers sa traduction latine ''caritas''<ref>Cassin, Barbara (dir.), ''op. cit.'', p. 34</ref>. Saint Augustin (354-430) fait de la ''caritas'' le principe organisateur de toute sa philosophie morale : « Ille autem iuste et sancte vivit qui rerum integer aestimator est : ipse est autem qui ordinatam dilectionem habet » (« Celui-là vit en juste et en saint qui apprécie toutes choses à leur juste valeur : il possède ainsi un amour ordonné »)<ref>Augustin, ''De doctrina christiana'', I, 28, PL 34, col. 30</ref>. Cette « charité ordonnée » se distingue de l{{'}}''éros'' platonicien par son désintéressement radical et de la ''philia'' aristotélicienne par son universalisme : elle s'adresse également à l'ami et à l'ennemi, au proche et au lointain. == Les théories médiévales de l'amour == === L'amor concupiscentiae et l'amor benevolentiae === Les théologiens scolastiques systématisent une distinction héritée d'Augustin entre deux formes fondamentales d'amour<ref>Goulet, Richard (dir.), ''Dictionnaire des philosophes antiques'', Supplément, Paris, CNRS Éditions, 2003, p. 925-926</ref> : * L{{'}}''amor concupiscentiae'' (amour de convoitise) : désir de possession visant la jouissance personnelle * L{{'}}''amor benevolentiae'' (amour de bienveillance) : volonté du bien de l'autre pour lui-même Thomas d'Aquin (1225-1274) intègre cette distinction dans sa synthèse aristotélico-chrétienne, distinguant l{{'}}''amor concupiscentiae'' qui cherche le bien pour soi, et l{{'}}''amor amicitiae'' qui veut le bien de l'aimé pour lui-même<ref>Thomas d'Aquin, ''Somme théologique'', Ia-IIae, q. 26, a. 4</ref>. === Le débat entre Bernard de Clairvaux et Guillaume de Saint-Thierry === Un débat médiéval important oppose deux conceptions de l'amour divin : Bernard de Clairvaux (1090-1153) célèbre un amour comme ''affectus'', élan du cœur échappant à toute mesure rationnelle. Pour Bernard, l'amour mystique est essentiellement affectif et dépasse la raison<ref>Bernard de Clairvaux, ''Sermons sur le Cantique des Cantiques'', éd. et trad. fr. Raffaele Fassetta et Paul Verdeyen, Paris, Cerf, coll. « Sources chrétiennes », 1996-2007</ref>. Guillaume de Saint-Thierry (vers 1075-1148), disciple de Bernard, développe néanmoins une théorie de l{{'}}''amor-intellectio'' : un amour réglé par la connaissance, où intelligence et affectivité se pénètrent mutuellement<ref>Guillaume de Saint-Thierry, ''De natura et dignitate amoris'', PL 184, col. 379-408</ref>. == Les philosophies modernes de l'amour == === Descartes et l'amour estimatif === René Descartes (1596-1650), dans son dernier ouvrage ''Les Passions de l'âme'' (1649), propose une analyse systématique de l'amour comme passion. Il distingue notamment : « L'amour se distingue des autres affections par l'estime qu'on fait de ce qu'on aime, comparaison de soi-même »<ref>Descartes, René, ''Les Passions de l'âme'', art. 83, in ''Œuvres'', éd. Charles Adam et Paul Tannery, Paris, Vrin, 1996 , t. XI, p. 389</ref>. Descartes insiste sur le rôle de l'estimation intellectuelle dans l'amour : nous aimons selon les jugements que nous portons sur la bonté des objets. Cette conception « estimative » sera influente au XVIIe siècle, notamment chez Corneille. Descartes distingue aussi l'amour de concupiscence (désir de posséder l'objet aimé) et l'amour de bienveillance (volonté du bien de l'aimé), mais affirme que ces deux dimensions sont mêlées dans tout amour véritable<ref>Descartes, René, ''Les Passions de l'âme'', art. 81, p. 387</ref>. === Spinoza et l'amor intellectualis Dei === Baruch Spinoza (1632-1677) révolutionne la pensée de l'amour en le définissant comme « une joie qu'accompagne l'idée d'une cause extérieure »<ref>Spinoza, Baruch, ''Éthique'', III, définition 6, trad. fr. Bernard Pautrat, Paris, Seuil, 1988 , p. 219</ref>. Cette définition rompt radicalement avec la tradition platonicienne : l'amour n'est plus manque mais joie, non désir de possession mais réjouissance de l'existence de l'autre. Pour Spinoza, le désir (''cupiditas'') n'est pas manque mais puissance d'agir (''potentia agendi''). L'amour exprime donc une augmentation de notre puissance d'être, une intensification de notre joie existentielle. Le couronnement de la philosophie spinoziste est l{{'}}''amor Dei intellectualis'' (amour intellectuel de Dieu), où l'âme atteint la béatitude en comprenant sa participation à la substance infinie<ref>Spinoza, Baruch, ''Éthique'', V, prop. 32-36, p. 579-589</ref>. Cet amour, qui « dépasse la raison même et la loi », représente la plénitude de la connaissance et empêche l'âme de se perdre dans les passions-tourments. André Comte-Sponville résume ainsi la position spinoziste : « Je suis joyeux à l'idée que tu existes. [...] C'est une déclaration d'amour qui ne vous demande rien »<ref>Comte-Sponville, André, ''op. cit.'', p. 45-62</ref>. L'amour spinoziste, contrairement au platonicien, permet de penser la possibilité d'un amour heureux. === Kant et la distinction amour pathologique / amour pratique === Emmanuel Kant (1724-1804) oppose radicalement deux formes d'amour dans sa philosophie morale : L{{'}}''amour pathologique'' (au sens kantien de ''pathologisch'', c'est-à-dire relevant de la sensibilité) : inclination affective, sentiment subi, appartenant à l'ordre des penchants naturels. L{{'}}''amour pratique'' : disposition rationnelle de la volonté, commandement moral qui ne repose pas sur un sentiment mais sur le devoir<ref>Kant, Emmanuel, ''Critique de la raison pratique'', I, I, 3, trad. fr. François Picavet, Paris, PUF, 1943 , p. 86-87</ref>. Dans la ''Doctrine de la vertu'' (1797), Kant précise que « l'amitié [...] est quelque chose de si tendre que, si on la fait reposer sur des sentiments et non sur des principes et des règles, elle ne peut être un seul instant assurée contre des interruptions »<ref>Kant, Emmanuel, ''Métaphysique des mœurs'', II, ''Doctrine de la vertu'', § 46, trad. fr. Alain Renaut, Paris, Flammarion, coll. « GF », 1994 , p. 344</ref>. Pour Kant, seul l'amour pratique, fondé sur des principes rationnels et non sur des sentiments instables, peut constituer le fondement d'une éthique universelle. Cette position influencera profondément la philosophie morale ultérieure. == Les approches contemporaines == === Freud et la psychanalyse de l'amour === Sigmund Freud (1856-1939) révolutionne la compréhension de l'amour en l'analysant comme phénomène psychique complexe enraciné dans la libido. Dans son essai « Psychologie des foules et analyse du moi » (1921), Freud note que le terme ''Liebe'' (amour) « reste plein d'ambiguïtés » car il désigne une vaste gamme de relations affectives<ref>Freud, Sigmund, ''Psychologie des foules et analyse du moi'', § 8, in ''Essais de psychanalyse'', trad. fr. Pierre Cotet et al., Paris, Payot, 1981 , p. 172-173</ref>. Freud distingue notamment : * Le ''courant sensuel'' (''sinnliche Strömung'') : pulsions sexuelles directes * Le ''courant tendre'' (''Zärtlichkeitsgefühle'') : sentiments inhibés quant au but sexuel Le développement normal consiste en une synthèse harmonieuse de ces deux courants. À l'inverse, leur clivage pathologique produit des troubles caractéristiques : l'homme qui ne peut être amoureux que de femmes qu'il méprise, ou inversement qui vénère des femmes qu'il ne désire pas<ref>Freud, Sigmund, « Sur un type particulier de choix d'objet chez l'homme », in ''Contributions à la psychologie de la vie amoureuse'', trad. fr. Denise Berger et al., Paris, PUF, 1969 , p. 47-55</ref>. Jacques Lacan (1901-1981) radicalise cette distinction en posant une opposition radicale entre amour et désir : « Quand on aime, il ne s'agit pas de sexe »<ref>Lacan, Jacques, ''Le Séminaire, Livre VIII, Le Transfert (1960-1961)'', Paris, Seuil, 1991, p. 12</ref>. Pour Lacan, l'amour serait « ignorance du désir », sentimentalité désérotisée. Cette conception, bien que tempérée par la reconnaissance du rôle de l'amour dans le transfert analytique, marque une rupture avec la conception freudienne qui maintenait un lien entre amour et libido. === Iris Murdoch et l'épistémologie de l'amour === La philosophe britannique Iris Murdoch (1919-1999) accorde à l'amour une fonction épistémique fondamentale dans son œuvre maîtresse ''The Sovereignty of Good'' (1970). Elle affirme que « l'amour est un concept central en morale » et que « nous avons besoin d'une philosophie morale où le concept d'amour, si rarement mentionné maintenant par les philosophes, puisse à nouveau devenir central »<ref>Murdoch, Iris, ''The Sovereignty of Good'', London, Routledge, 1970, p. 2 et 46</ref>. Pour Murdoch, « l'amour est la perception des individus. L'amour est la réalisation extrêmement difficile que quelque chose d'autre que soi-même est réel. L'amour, et donc l'art et la morale, est la découverte de la réalité »<ref>Murdoch, Iris, « The Sublime and the Good », in ''Existentialists and Mystics'', London, Chatto & Windus, 1959, p. 51</ref>. Murdoch illustre cette thèse par son célèbre exemple de la belle-mère (« M ») qui, initialement hostile à sa belle-fille (« D »), parvient progressivement, par un effort d'attention aimante, à voir en elle des qualités qu'elle n'avait pas perçues auparavant. Cet exemple démontre que l'amour n'est pas simple sentiment subjectif mais méthode cognitive permettant d'accéder à la réalité d'autrui<ref>Murdoch, Iris, ''The Sovereignty of Good'', p. 17-18</ref>. Pour Murdoch, l'amour est une vertu épistémique fondamentale : « Toute vision juste, même dans les problèmes les plus stricts de l'intellect, et a fortiori quand souffrance ou méchanceté doivent être perçues, est une affaire morale. Les mêmes vertus, en fin de compte la même vertu (l'amour), sont requises partout »<ref>Murdoch, Iris, ''The Sovereignty of Good'', p. 70</ref>. L'amour occupe ainsi une place unique dans la hiérarchie des vertus : il est la forme même de toutes les vertus, car toute perception vertueuse requiert l'attention aimante au réel. === Les théories contemporaines de l'amour romantique === La philosophie analytique contemporaine a développé plusieurs théories de l'amour romantique : '''La théorie de l'union''' (Union Theory) : défendue par Robert Nozick et Robert Solomon, elle conçoit l'amour comme formation d'un « nous », union réelle ou métaphorique des amants. « Aimer quelqu'un, c'est former un nous », écrit Nozick<ref>Nozick, Robert, ''The Examined Life'', New York, Simon & Schuster, 1989, p. 68-86</ref>. Cette approche actualise la métaphore platonicienne de l'androgyne du ''Banquet''. '''La théorie de la sollicitude''' (Concern Theory) : l'amour consiste essentiellement dans le souci désintéressé du bien-être de l'aimé pour lui-même, non comme moyen mais comme fin<ref>Frankfurt, Harry, ''The Reasons of Love'', Princeton, Princeton University Press, 2004, p. 42-43</ref>. '''La théorie évaluative''' : l'amour est une forme d'évaluation positive de l'aimé, perception de sa valeur intrinsèque ou de sa beauté<ref>Velleman, J. David, « Love as a Moral Emotion », ''Ethics'', vol. 109, n° 2, 1999, p. 338-374</ref>. Ces théories débattent notamment de la question de savoir si l'amour peut être justifié par des raisons (l'aimé possède-t-il des propriétés qui le rendent digne d'amour ?) ou s'il est sans raison, conférant lui-même la valeur à son objet. == Amor fati : Nietzsche et l'amour du destin == Friedrich Nietzsche (1844-1900) introduit dans sa philosophie tardive le concept d{{'}}''amor fati'' (amour du destin), qui représente une transformation radicale de la conception traditionnelle de l'amour. Dans ''Ecce Homo'' (1888), Nietzsche proclame : « Ma formule pour la grandeur chez un être humain est amor fati : que l'on ne veuille rien de différent, ni en avant, ni en arrière, ni dans toute l'éternité. Non pas seulement supporter le nécessaire, encore moins le dissimuler... mais l'aimer »<ref>Nietzsche, Friedrich, ''Ecce Homo'', « Pourquoi je suis si avisé », § 10, in ''Œuvres philosophiques complètes'', VIII, trad. fr. Jean-Claude Hémery, Paris, Gallimard, 1974 , p. 266</ref>. L{{'}}''amor fati'' nietzschéen se distingue radicalement : * De la résignation stoïcienne : il ne s'agit pas de supporter mais d'aimer * De l'acceptation chrétienne : il ne s'agit pas de se soumettre à la volonté divine mais d'affirmer joyeusement le devenir * De l'optimisme leibnizien : il ne s'agit pas de justifier le monde comme « meilleur des mondes possibles » mais de l'aimer tel qu'il est, y compris dans ses aspects tragiques L{{'}}''amor fati'' est intimement lié à la doctrine de l'éternel retour : aimer sa vie au point de vouloir la revivre éternellement, identique en chaque détail<ref>Han-Pile, Béatrice, « Nietzsche and Amor Fati », ''European Journal of Philosophy'', vol. 19, n° 2, 2011, p. 224-261</ref>. Cette exigence constitue le test ultime de l'affirmation de la vie : « Si vraiment nous sommes heureux de vivre, alors nous devons vouloir revivre éternellement chaque instant de notre vie à l'infini »<ref>Brodsky, Garry M., « Nietzsche's Notion of Amor Fati », ''International Studies in Philosophy'', vol. 30, n° 3, 1998, p. 23-30</ref>. == Perspectives pluridisciplinaires == === Anthropologie et universalité de l'amour === Le philosophe français Francis Wolff défend l'idée que l'amour constitue un « universel anthropologique » : « Dans toutes les sociétés, à tous les moments de l'histoire, il existe une relation entre amants que nous appelons "amour", comme en témoignent les littératures et la poésie du monde entier »<ref>Wolff, Francis, ''Il n'y a pas d'amour parfait'', Paris, Fayard, 2016, p. 15-30</ref>. Selon Wolff, l'amour naît du mélange de trois composantes indépendantes : * L'amitié (''philia'') * La passion (''pathos'') * Le désir sexuel (''éros'') Lorsque deux ou trois de ces composantes fusionnent, surgit ce « quelque chose de nouveau qu'on appelle l'amour ». Cette approche synthétique permet de rendre compte de la diversité des formes d'amour tout en maintenant son unité conceptuelle. === Sociologie de l'amour === Le sociologue français Pierre Bourdieu a esquissé dans ''La Domination masculine'' (1998) une approche de l'amour comme « capital » opérant dans des champs de relations intimes. Bien que Bourdieu ait présenté l'amour comme possibilité d'échapper aux relations de domination, il a aussi compris que l'amour était « produit du travail, inséré dans une économie d'échanges, et susceptible de se voir infusé de domination »<ref>Bourdieu, Pierre, ''La Domination masculine'', Paris, Seuil, 1998, p. 118-126</ref>. Des travaux récents prolongent cette approche en conceptualisant l'amour comme forme de capital social et émotionnel, influençant les structures des champs intimes contemporains<ref>Santos, Carolina, « Bourdieu on Love: A Latent Capital, a Primary Field and a New Research Agenda », ''Sociology'', vol. 58, n° 4, 2024, p. 823-841</ref>. === Neurosciences et biologie de l'amour === Les neurosciences contemporaines ont identifié les corrélats neuronaux de l'expérience amoureuse, notamment l'activation du système de récompense dopaminergique et la libération d'ocytocine et de vasopressine. Certains chercheurs, comme la biologiste Helen Fisher, conceptualisent l'amour romantique comme un « drive » ou système motivationnel fondamental, distinct des émotions proprement dites<ref>Fisher, Helen, ''Why We Love: The Nature and Chemistry of Romantic Love'', New York, Henry Holt, 2004, p. 51-79</ref>. Ces découvertes posent la question philosophique de la réductibilité de l'amour à ses mécanismes neurobiologiques. La plupart des philosophes contemporains défendent une approche non-réductionniste : même si l'amour possède des bases biologiques, son sens et sa valeur ne peuvent être entièrement expliqués en termes neurochimiques. == Conclusion == L'amour demeure l'un des concepts les plus polysémiques et les plus débattus de la philosophie. Depuis Platon jusqu'aux philosophes contemporains, il interroge la nature du désir et du manque, la possibilité du bonheur, la relation entre raison et passion, la constitution du sujet et de l'identité personnelle, ainsi que les fondements de l'éthique et de la vie bonne. Les distinctions grecques classiques entre ''éros'', ''philia'' et ''agapè'' continuent de structurer notre compréhension philosophique, mais elles ont été enrichies et complexifiées par les débats médiévaux, les analyses modernes de Descartes, Spinoza et Kant, les révolutions psychanalytiques de Freud et Lacan, et les approches contemporaines qui intègrent les apports de l'anthropologie, de la sociologie et des neurosciences. La philosophie de l'amour reste un champ de recherche vivant, où se croisent questions métaphysiques (qu'est-ce qu'aimer ?), épistémologiques (l'amour est-il une forme de connaissance ?), éthiques (quelles sont nos obligations envers ceux que nous aimons ?) et politiques (comment penser l'amour dans les structures sociales de domination ?). == Notes et références == {{references}} == Bibliographie sélective == === Sources antiques === * Platon, ''Le Banquet'', trad. fr. Luc Brisson, Paris, Flammarion, coll. « GF », 1998 [vers 385-370 av. J.-C.]. * Aristote, ''Éthique à Nicomaque'', livres VIII-IX, trad. fr. Richard Bodéüs, Paris, Flammarion, coll. « GF », 2004 [vers 340-325 av. J.-C.]. === Sources médiévales === * Augustin, ''De doctrina christiana'', PL 34. * Bernard de Clairvaux, ''Sermons sur le Cantique des Cantiques'', éd. et trad. fr. Raffaele Fassetta et Paul Verdeyen, Paris, Cerf, coll. « Sources chrétiennes », 1996-2007. * Thomas d'Aquin, ''Somme théologique'', Ia-IIae, q. 26-28. === Sources modernes === * Descartes, René, ''Les Passions de l'âme'' (1649), in ''Œuvres'', éd. Charles Adam et Paul Tannery, Paris, Vrin, 1996, t. XI. * Spinoza, Baruch, ''Éthique'' (1677), trad. fr. Bernard Pautrat, Paris, Seuil, 1988. * Kant, Emmanuel, ''Métaphysique des mœurs'' (1797), trad. fr. Alain Renaut, Paris, Flammarion, coll. « GF », 1994. === Sources contemporaines === * Freud, Sigmund, ''Essais de psychanalyse'' (1921), trad. fr. Pierre Cotet et al., Paris, Payot, 1981. * Lacan, Jacques, ''Le Séminaire, Livre VIII, Le Transfert (1960-1961)'', Paris, Seuil, 1991. * Murdoch, Iris, ''The Sovereignty of Good'', London, Routledge, 1970. * Nietzsche, Friedrich, ''Ecce Homo'' (1888), in ''Œuvres philosophiques complètes'', VIII, trad. fr. Jean-Claude Hémery, Paris, Gallimard, 1974. === Études secondaires === * Cassin, Barbara (dir.), ''Vocabulaire européen des philosophies. Dictionnaire des intraduisibles'', Paris, Seuil/Le Robert, 2004, p. 33-36. * Comte-Sponville, André, ''L'Amour en quatre leçons'', Paris, Albin Michel, 2003. * Frankfurt, Harry, ''The Reasons of Love'', Princeton, Princeton University Press, 2004. * Nozick, Robert, ''The Examined Life'', New York, Simon & Schuster, 1989. * Wolff, Francis, ''Il n'y a pas d'amour parfait'', Paris, Fayard, 2016. [[Catégorie:Éthique]] [[Catégorie:Métaphysique]] [[Catégorie:Phénoménologie]] [[Catégorie:Psychologie]] [[Catégorie:Théologie]] {{Autocat}} ql0tn1aecytget3zn1icsr7xh9mnbau Dictionnaire de philosophie/Anthropocentrisme 0 83051 768158 767676 2026-06-19T04:15:23Z PandaMystique 119061 Bot : ajout du paramètre lecture=oui au modèle {{DicoPhilo}} 768158 wikitext text/x-wiki {{DicoPhilo|Anthropocentrisme|lecture=oui}} L''''anthropocentrisme''' désigne cette conception philosophique qui place l'être humain au centre de l'univers et appréhende la réalité à travers la seule perspective humaine<ref>CNRTL, « Anthropocentrisme », Centre National de Ressources Textuelles et Lexicales, Paris, 2012</ref>. Du grec ''anthrôpos'' (l'être humain) et ''kentron'' (le centre), ce terme exprime une attitude intellectuelle selon laquelle l'homme constitue l'entité centrale la plus significative de l'existence, et que tout le reste doit être évalué, jugé et compris en fonction de son utilité ou de sa relation avec lui<ref>Larousse, « Anthropocentrisme », Encyclopédie philosophique, 2020</ref>. == Définition et caractérisation == L'anthropocentrisme se caractérise par plusieurs traits constitutifs. D'abord, il considère que seul l'être humain possède une valeur intrinsèque, tous les autres éléments naturels étant relégués au rang d'objets possédés et maîtrisés par l'homme<ref>Cour constitutionnelle de Colombie, Sentence T-622/16, 2016</ref>. Ensuite, il conçoit l'être humain comme l'espèce la plus précieuse et réduit les autres espèces ainsi que la nature à un ensemble d'objets ou de ressources destinés à satisfaire des besoins humains, notamment d'ordre économique<ref>Cour constitutionnelle de l'Équateur, Sentencia 1149-19-JP/20, 2020</ref>. Cette approche se distingue de l'individualisme de la pensée libérale appliqué aux relations intra-humaines. L'individualisme de l'anthropocentrisme concerne surtout l'espèce humaine elle-même dans son rapport aux autres éléments du monde<ref>Marie Walckiers, « Vers un droit des relations entre humains et non-humains », Revue interdisciplinaire d'études juridiques, vol. 88, 2022/1, pp. 1-45</ref>. Il s'accompagne d'une vision court-termiste, limitée dans le temps et dans l'espace, et d'un rapport instrumental à l'environnement : la relation existe, mais l'aspect mercantile et utilitariste prime sur toute considération de protection<ref>Anne-Sophie Tabau, « Éthique environnementale et droits », Notre affaire à tous, 5 janvier 2021</ref>. == Racines historiques et développement == === Origines antiques === L'anthropocentrisme trouve ses premières formulations théoriques dans la philosophie grecque antique. Aristote fut le premier à en développer une théorie systématique, affirmant que toute la nature apparaît au service de l'homme<ref>Pierre Pellegrin, « Aristote : zoologie et éthique », Archai, n° 11, juin 2013, pp. 53-74</ref>. Dans sa conception téléologique, l'homme est l'Être modèle de tous les êtres de la nature, qui lui est donnée comme objet de compréhension du fait de sa capacité supérieure spécifique : la raison (logos)<ref>Archipel du vivant, « Aristote - aux racines de l'anthropocentrisme ? », 11 janvier 2022</ref>. Cette lecture scolastique d'Aristote est bien à la racine de la pensée anthropocentrique occidentale, car d'autres lectures auraient été possibles. Chez Protagoras également, on trouve cette idée centrale : « L'homme est la mesure de toutes choses »<ref>Catherine et Raphaël Larrère, ''Du bon usage de la nature – pour une philosophie de l'environnement'', Aubier, Paris, 1997, p. 89</ref>, suggérant que la réalité est perçue et comprise uniquement à travers l'expérience humaine. === Enracinement judéo-chrétien === La tradition judéo-chrétienne a considérablement renforcé l'anthropocentrisme dans la pensée occidentale. Le christianisme, avec son enseignement selon lequel l'homme a été créé à l'image de Dieu et a reçu la domination sur la Terre, a consolidé la croyance que l'homme est séparé de et supérieur à la nature<ref>Lynn Townsend White Jr., « The Historical Roots of Our Ecologic Crisis », ''Science'', vol. 155, n° 3767, 10 mars 1967, pp. 1203-1207</ref>. Dans la Genèse, il est écrit que Dieu « créa l'homme à son image » et lui dit : « Soyez féconds et multipliez-vous, remplissez la Terre et soumettez-la. Soyez les maîtres des poissons de la mer, des oiseaux du ciel, et de tous les animaux qui vont et viennent sur la Terre. » C'est cette vision « despotique » qui s'est imposée jusqu'à notre modernité, selon l'historien Lynn White<ref>Lynn White, ''Les racines historiques de notre crise écologique'', PUF, Paris, 2019 [1967], p. 43</ref>. En détruisant l'animisme païen, le christianisme aurait permis l'exploitation de la nature : le sacré n'est plus dans les objets naturels ou dans un sanctuaire naturel, mais s'approche par l'humanité seule. White affirme que le christianisme médiéval latin, avec son insistance sur l'action et la transformation du monde, a fourni « un ensemble de présuppositions remarquablement favorables à l'expansion technologique »<ref>Lynn White, op. cit., p. 58</ref>. Cette thèse demeure controversée, mais elle a profondément marqué les débats sur les origines culturelles de la crise écologique<ref>Dominique Bourg, « Les racines chrétiennes de la crise écologique », dans Lynn White, ''Les racines historiques de notre crise écologique'', PUF, Paris, 2019, pp. 93-156</ref>. === Renaissance et humanisme === La Renaissance, avec son renouveau de l'intérêt pour les textes classiques et la culture humaniste, a amplifié la perspective anthropocentrique. Les humanistes de la Renaissance, comme Pico della Mirandola dans son ''Discours sur la dignité de l'homme'' (1486), ont exalté la place unique de l'homme dans l'univers et sa capacité à façonner son propre destin<ref>Jean-Paul Pittion, « La Renaissance et l'anthropocentrisme », in ''Moment impact'', 15 février 2024</ref>. === Modernité et révolution scientifique === Avec l'avènement de l'ère scientifique et la révolution industrielle, l'anthropocentrisme a pris une nouvelle dimension. La science et la technologie ont été vues comme des moyens pour l'humanité de dominer et de contrôler la nature. Cette ère a été marquée par une confiance croissante dans le progrès humain et la suprématie de l'homme sur le monde naturel<ref>François Jarrige et Thomas Le Roux, ''La Contamination du monde. Une histoire des pollutions à l'âge industriel'', Seuil, Paris, 2017, p. 78</ref>. Le « Grand Partage » (souvent décrit comme la séparation « Nature-Culture ») a vraiment pris de l'ampleur à partir du XVIIe siècle. Celui-ci a commencé en Europe dans le domaine de l'Art à la Renaissance avant de s'imposer auprès des modes de pensée des élites au XVIIe siècle et d'atteindre ensuite le reste de la population<ref>Philippe Descola, ''Par-delà nature et culture'', Gallimard, Paris, 2005, pp. 241-242</ref>. Aujourd'hui, cette vision se répand dans le monde via la mondialisation<ref>Chaire de La Rochelle, « Quels centrisme adopter avec les vivants », 9 octobre 2023</ref>. == Anthropocentrisme et philosophie moderne == === Descartes et l'animal-machine === René Descartes (1596-1650) représente une figure centrale dans le développement de l'anthropocentrisme moderne. Dans le ''Discours de la méthode'' (1637), il établit une distinction ontologique radicale entre l'homme et l'animal. Pour Descartes, l'animal n'est qu'une machine sophistiquée, dénuée d'âme et de raison, agissant uniquement selon des mécanismes automatiques<ref>René Descartes, ''Discours de la méthode'', partie V, 1637</ref>. Cette théorie de l'animal-machine repose sur l'idée que seul l'homme possède la ''res cogitans'' (la substance pensante), tandis que les animaux ne sont que de la ''res extensa'' (substance étendue). Comme Marx le notera plus tard, « avec sa définition des animaux comme simples machines, [Descartes] voit les choses avec les yeux de période manufacturière, par opposition au Moyen Âge, où l'animal passait pour l'auxiliaire de l'homme »<ref>Karl Marx, ''Le Capital'', livre I, Éditions sociales, Paris, 1993 [1867], p. 459</ref>. Descartes lui-même écrit : « Je m'étais ici particulièrement arrêté à faire voir que, s'il y avait de telles machines qui eussent les organes et la figure d'un singe ou de quelque autre animal sans raison, nous n'aurions aucun moyen pour reconnaître qu'elles ne seraient pas en tout de même nature que ces animaux ; au lieu que, s'il y en avait qui eussent la ressemblance de nos corps, et imitassent autant nos actions que moralement il serait possible, nous aurions toujours deux moyens très certains pour reconnaître qu'elles ne seraient point pour cela de vrais hommes »<ref>René Descartes, ''Discours de la méthode'', partie V, Adam et Tannery (éd.), vol. VI, p. 56</ref>. Ces deux moyens sont le langage et la polyvalence de l'action, qui témoignent de la pensée proprement humaine. Cette conception cartésienne a profondément marqué la pensée occidentale, légitimant une attitude instrumentale envers les animaux et, plus largement, envers la nature<ref>Camille Delattre, « Représentations de l'animal au temps de la querelle des animaux-machines », ''Cahiers du Centre de recherche'', 2019, pp. 127-143</ref>. === Spinoza et la critique du finalisme === Baruch Spinoza (1632-1677) offre une critique puissante de l'anthropocentrisme à travers sa remise en cause du finalisme, dans l'Appendice de la première partie de l'''Éthique'' (1677). Pour Spinoza, l'origine de tous les préjugés se ramène à une seule source : les hommes, conscients de leurs actions mais ignorants des causes de celles-ci, se figurent être libres ; ils agissent toujours en vue d'une fin, et recherchent ce qu'ils croient leur être utile<ref>Baruch Spinoza, ''Éthique'', I, Appendice, in ''Œuvres complètes'', trad. Charles Appuhn, Garnier-Flammarion, Paris, 1965, p. 81</ref>. Les hommes en viennent ainsi à considérer toutes les choses existant dans la nature non comme des effets de causes réelles, mais comme des moyens pour leur usage. Ils imaginent qu'un Dieu créateur a tout disposé dans leur intérêt. De même, ce qui dans la nature leur est nuisible a dû être disposé par ce créateur comme épreuve ou comme punition. Dans tous les cas, tous les objets naturels sont interprétés en fonction de l'existence humaine<ref>Spinoza, op. cit., p. 82</ref>. Spinoza prend l'exemple d'un accident : une tuile tombe d'un toit et tue un homme passant en dessous. Le préjugé finaliste consiste à dire que cette pierre est tombée précisément dans le but de tuer l'homme ; il n'y a pas de hasard, au sens où il y a une raison, une finalité à tout événement ; c'était son « destin ». On objectera par des causes efficientes et physiques : la pierre est tombée parce que le bâtiment était vieux, et parce que le vent soufflait fort. Mais le finaliste ne s'arrête pas là : pourquoi le vent soufflait fort précisément à ce moment-là ? Pourquoi cet homme est passé à cet endroit, et pas ailleurs ?<ref>Jean-Luc Guichet, « Explication du texte de Spinoza », ''Philolatourelle'', 4 novembre 2024</ref> Ainsi, le finaliste transforme de pures coïncidences en événements dotés de sens. Spinoza montre que le finalisme renverse l'ordre exact de la causalité : le soleil n'existe pas parce qu'il donne la lumière à l'homme, c'est parce qu'il existe qu'il donne de la lumière sur Terre<ref>Pascal Ide, « Spinoza et le préjugé du finalisme », ''Les philosophes'', 2024</ref>. Cette critique spinoziste remet profondément en cause l'anthropocentrisme en montrant qu'il repose sur une double erreur : l'idiosyncrasie (projection de sa propre nature sur le monde extérieur) et l'anthropocentrisme proprement dit (croire que tout converge vers l'homme)<ref>Auguste Comte, ''Cours de philosophie positive'', vol. III, Hermann, Paris, 1975 [1830-1842], p. 289</ref>. === Kant et la dignité humaine === Emmanuel Kant (1724-1804) représente un moment crucial dans la pensée anthropocentrique, tout en tentant de lui donner une fondation rationnelle et morale. Dans les ''Fondements de la métaphysique des mœurs'' (1785), Kant affirme que la dignité (''Würde'') est réservée aux êtres doués de raison. « La dignité de l'humanité, en tant que nature raisonnable », distingue l'homme du reste des êtres de la nature<ref>Emmanuel Kant, ''Fondements de la métaphysique des mœurs'', trad. Victor Delbos, Delagrave, Paris, 1994 [1785], p. 167</ref>. La célèbre seconde formulation de l'impératif catégorique exprime cette position : « Agis de telle sorte que tu traites l'humanité aussi bien dans ta personne que dans la personne de tout autre toujours en même temps comme une fin, et jamais simplement comme un moyen »<ref>Kant, op. cit., p. 105</ref>. Une chose est un moyen ; un être humain n'étant pas une chose, il n'est pas un moyen mais une fin. Kant établit que « ce qui se rapporte aux inclinations et aux besoins généraux de l'homme, cela a un prix marchand ; ce qui, même sans supposer de besoin, correspond à un certain goût, c'est-à-dire à la satisfaction que nous procure un simple jeu sans but de nos facultés mentales, cela a un prix de sentiment ; mais ce qui constitue la condition qui seule peut faire que quelque chose est une fin en soi, cela n'a pas seulement une valeur relative, c'est-à-dire un prix, mais une valeur intrinsèque, c'est-à-dire une dignité »<ref>Kant, op. cit., p. 160</ref>. Cette conception kantienne, bien que fondant une éthique exigeante envers les êtres humains, exclut explicitement les animaux et la nature de la sphère des considérations morales directes. L'anthropocentrisme kantien est donc un anthropocentrisme éthique : seuls les êtres raisonnables méritent une considération morale pour eux-mêmes<ref>Julien Josset, « La dignité de l'homme selon Kant », ''Cahiers philosophiques africains'', vol. 34, n° 3, 2004, pp. 15-32</ref>. == Critiques contemporaines de l'anthropocentrisme == === La crise écologique et ses questionnements === À partir des années 1960, l'anthropocentrisme est devenu l'objet de critiques de plus en plus vives, notamment en raison de la prise de conscience de la crise écologique. George Perkins Marsh, dès 1864, avait averti dans ''Man and Nature'' que l'homme, « agent perturbateur » et « influence hostile », pourrait rendre « la Terre inhospitalière non seulement pour les autres espèces mais également pour lui-même »<ref>George Perkins Marsh, ''Man and Nature; or, Physical Geography as Modified by Human Action'', Scribner, New York, 1864, p. 43</ref>. Cette inquiétude s'est considérablement accrue avec l'entrée présumée dans l'Anthropocène, cette nouvelle ère géologique caractérisée par l'influence critique des activités humaines sur l'environnement terrestre. L'anthropocentrisme apparaît désormais non seulement comme une attitude philosophique discutable, mais comme un danger existentiel pour l'humanité elle-même<ref>Donato Bergandi et Patrick Blandin, « De la protection de la nature au développement durable : genèse d'un oxymore éthique et politique », ''Revue d'histoire des sciences'', tome 65, n° 1, 2012, pp. 103-142</ref>. === Hans Jonas et le Principe responsabilité === Hans Jonas (1903-1993), dans ''Le Principe responsabilité'' (1979), propose une éthique environnementale qui tente de dépasser l'anthropocentrisme traditionnel tout en restant ancrée dans une préoccupation pour l'humanité. Son nouvel impératif catégorique s'énonce : « Agis de façon que les effets de ton action soient compatibles avec la permanence d'une vie authentiquement humaine sur Terre »<ref>Hans Jonas, ''Le Principe responsabilité. Une éthique pour la civilisation technologique'', trad. Jean Greisch, Flammarion, Paris, 1998 [1979], p. 40</ref>. Jonas critique l'anthropocentrisme éthique moderne, notamment la formulation kantienne de la morale, qui ne permet pas d'interdire une éventuelle autodestruction de l'humanité ni d'évaluer les effets de l'agir technique sur la nature<ref>Catherine Larrère, « L'éthique de la vie chez Hans Jonas », in Jean-Claude Gens (dir.), ''L'éthique de la vie chez Hans Jonas'', Éditions de la Sorbonne, Paris, 2013, p. 12</ref>. Il propose une « responsabilité » qui s'étend aux générations futures et à la nature elle-même, fondée sur une ontologie de la vie. Son éthique environnementale est « fondamentalement ouverte sur la biosphère » et « vise à la préservation de la vie sous toutes ses formes humaines et non-humaines ». Elle est donc « ancrée dans une forme d'écocentrisme où la solidarité entre les éléments vivants occupe une place fondamentale »<ref>Sylvie Ferrari, « L'éthique du futur de Jonas », vidéo pédagogique, 2016</ref>. === L'éthique animale : Singer et le pathocentrisme === Peter Singer, avec la publication de ''La Libération animale'' en 1975, a profondément remis en question l'anthropocentrisme éthique. Singer affirme que « l'attribution d'une considération morale exclusive aux seuls êtres humains est qualifiée d'anthropocentrisme »<ref>Valéry Giroux, « Pathocentrisme », in Maxime Kristanek (dir.), ''Encyclopédie philosophique'', 2015</ref>. S'appuyant sur le principe utilitariste de l'égale considération des intérêts, Singer soutient que « si un être souffre, il ne peut y avoir aucune justification morale pour refuser de prendre en considération cette souffrance. Quelle que soit la nature d'un être, le principe d'égalité exige que sa souffrance soit prise en compte de façon égale avec toute souffrance semblable […] de n'importe quel autre être »<ref>Peter Singer, ''La Libération animale'', trad. Louise Rousselle, Payot, Paris, 2012 [1975], p. 39</ref>. Cette approche pathocentrique (centrée sur la sensibilité et la capacité à souffrir) étend la communauté morale bien au-delà de l'espèce humaine. David DeGrazia souligne « l'étrangeté » de la thèse selon laquelle l'appartenance à l'espèce humaine suffit pour jouir d'un statut moral supérieur, rappelant que l'évolution du vivant s'est faite de manière graduelle et que les êtres humains sont les très proches cousins des chimpanzés du point de vue phylogénétique<ref>David DeGrazia, ''Taking Animals Seriously: Mental Life and Moral Status'', Cambridge University Press, Cambridge, 1996, p. 56</ref>. === Philippe Descola et la critique anthropologique === L'anthropologue Philippe Descola, dans ''Par-delà nature et culture'' (2005), offre une critique radicale de l'anthropocentrisme en montrant que la séparation nature/culture qui le fonde n'a rien d'universel. À partir de ses observations auprès des Achuar d'Amazonie équatorienne, Descola montre que ces populations « ne font pas de distinction entre la nature et la société, les non-humains y sont vus comme des personnes »<ref>Philippe Descola, interview dans ''Usbek & Rica'', « Il faut combattre l'anthropocentrisme », 25 janvier 2020</ref>. Descola distingue quatre « ontologies » ou modes d'identification des êtres : l'animisme, le totémisme, l'analogisme et le naturalisme. Le naturalisme, propre aux sociétés occidentales modernes, est la seule ontologie qui instaure une coupure radicale entre nature et culture. « La nature n'existe pas », martèle Descola, pour qui cette notion abstraite a séparé artificiellement l'homme du reste du monde et du vivant<ref>Philippe Descola, « Il faut repenser les rapports entre humains et non-humains », interview dans ''Le Journal du CNRS'', 9 avril 2024</ref>. Cette anthropologie comparative montre que l'anthropocentrisme n'est pas une donnée naturelle de la condition humaine, mais une construction culturelle spécifique à un moment et un espace donnés. Descola conclut que le « Grand Partage » entre nature et culture est « une pure convention sociale » qui a conduit à faire de la nature « un champ d'investigation, que nous cherchons à contrôler et que nous concevons comme une ressource extérieure à nous-mêmes »<ref>Philippe Descola, ''L'écologie des autres. L'anthropologie et la question de la nature'', Quae, Versailles, 2011, p. 31</ref>. == Alternatives à l'anthropocentrisme == === Biocentrisme === Le biocentrisme propose d'inclure l'ensemble des êtres vivants dans la sphère des individus méritant une considération morale directe. Paul Taylor, dans ''Respect for Nature'' (1986), considère que tout être vivant est un « centre-téléologique-de-vie ». Les organismes vivants ont leur finalité, ils possèdent un bien qui leur est propre, l'accomplissement de leurs fonctions biologiques, qu'ils poursuivent par leurs propres moyens. Selon l'égalitarisme biocentrique, tous les êtres vivants ont la même valeur, et cette valeur nous impose le respect<ref>Paul W. Taylor, ''Respect for Nature: A Theory of Environmental Ethics'', Princeton University Press, Princeton, 1986, p. 99</ref>. Arne Næss (1912-2009), philosophe norvégien fondateur de l'écologie profonde (''deep ecology''), affirme que « l'ensemble des membres de la grande famille du vivant appartient à la grande toile de la Vie ». Selon lui, tous les êtres vivants et la nature ont « une valeur intrinsèque, indépendante de leur utilité pour les êtres humains ». Le « droit de toute forme de vie à vivre est un droit universel qui ne peut pas être quantifié. Aucune espèce vivante n'a plus de ce droit particulier de vivre et de s'étendre qu'une autre espèce »<ref>Arne Næss, « The Shallow and the Deep, Long-Range Ecology Movement », ''Inquiry'', vol. 16, 1973, pp. 95-100</ref>. === Écocentrisme === L'écocentrisme invite à prendre en compte dans la délibération morale non seulement les individus vivants, mais aussi les entités supra-individuelles, comme les espèces ou les écosystèmes. Elles ont, comme les êtres vivants, un bien propre qu'il est possible de promouvoir ou d'entraver par nos actions, et qui devrait donc nous imposer certaines obligations morales<ref>Virginie Maris, ''Philosophie de la biodiversité – petite éthique pour une nature en péril'', Buchet-Chastel, Paris, 2010, p. 87</ref>. Dans le préambule de la Convention sur la diversité biologique (1992), les 189 pays signataires se déclarent conscients de la « valeur intrinsèque » de la biodiversité. L'écocentrisme met l'accent sur l'interconnexion des formes de vie au sein d'un tout complexe et harmonieux. Poussant cette logique à l'extrême, l'écologie profonde considère que les espèces et leurs habitats, en plus de leur valeur pour l'homme et de leur valeur en tant qu'éléments essentiels d'un tout, ont une valeur dite « intrinsèque », c'est-à-dire inhérente, par elles-mêmes et pour elles-mêmes<ref>Franck Courchamp, ''L'écologie pour les nuls'', First éditions, Paris, 2008, p. 234</ref>. En 1985, Bill Devall et George Sessions résument en huit postulats l'éthique de l'écologie profonde, dont le premier affirme : « Le bien-être et l'épanouissement des formes de vie humaines et non humaines de la Terre ont une valeur en elles-mêmes (synonyme : valeur intrinsèque, valeur inhérente). Cette valeur est indépendante de l'utilité du monde non humain pour les besoins humains »<ref>Bill Devall et George Sessions, ''Deep Ecology: Living as if Nature Mattered'', Gibbs Smith, Salt Lake City, 1985, p. 70</ref>. == Débats actuels == === Anthropocentrisme faible vs anthropocentrisme fort === Certains philosophes, comme Bryan G. Norton, distinguent entre « anthropocentrisme fort » et « anthropocentrisme faible ». L'anthropocentrisme fort considère que seules les satisfactions des préférences ressenties par les humains ont une valeur. L'anthropocentrisme faible, en revanche, « accorde de la valeur aux objets naturels dans la mesure où ils sont nécessaires à la satisfaction des besoins considérés et éclairés de l'humanité »<ref>Bryan G. Norton, « L'éthique environnementale et l'anthropocentrisme faible » (1984), in Hicham-Stéphane Afeissa (dir.), ''Éthique de l'environnement'', Vrin, Paris, 2007, p. 281</ref>. Cette distinction permet de maintenir une perspective centrée sur l'humain tout en reconnaissant l'importance de protéger la nature pour des raisons qui dépassent l'utilité immédiate. Norton affirme qu'« une éthique environnementale renvoie donc, en tout premier lieu, aux règles susceptibles d'affecter l'usage que les autres êtres humains peuvent avoir de l'environnement. En second lieu, une éthique environnementale renvoie aux règles d'allocation qui affectent sur le long terme la santé de la biosphère considérée comme unité organique en fonctionnement »<ref>Norton, op. cit., p. 281</ref>. === La question de l'inévitabilité de l'anthropocentrisme === Un débat important porte sur la possibilité même de sortir de l'anthropocentrisme. Comme le note Fabrice Flipo, « il me semble que l'éthique environnementale est particulièrement peu claire sur ce terme, "anthropocentrisme", ce qui génère toutes sortes de confusions et d'accusations un peu absurdes contre lesquelles il faut se défendre dès lors qu'on veut en sortir. Savoir qui évalue par exemple n'est pas ce qui fait débat : c'est l'homme, évidemment »<ref>Fabrice Flipo, commentaire dans François Sarrazin et Jane Lecomte, « Peut-on dépasser l'anthropocentrisme dans nos relations avec la biodiversité ? », ''Regard SFE'', n° 59, 14 avril 2021</ref>. L'opposition valeur intrinsèque/anthropocentrisme renvoie non pas à l'opposition valeur en soi/valeur pour l'homme, en général, mais à l'opposition valeur non-économique/valeur économique, ou plus exactement valeur non-moderne/valeur moderne. Le vrai débat concerne l'idée qu'on se fait de l'homme, donc l'humanisme. Pour la modernité, l'humanisme est (en gros) le marché (donc la croissance infinie et la technologie issue de la division infinie du travail) plus la démocratie représentative. Être écocentré (ou évocentré) signifie qu'on regarde non pas la valeur ajoutée, mais la valeur étendue à la prise en compte de la biosphère<ref>Flipo, op. cit.</ref>. === La reconnaissance juridique === Ces dernières années, certains systèmes juridiques ont commencé à reconnaître des droits à des entités naturelles, remettant en cause l'anthropocentrisme juridique. En 2008, l'Équateur a inscrit les droits de la nature (''Pachamama'') dans sa Constitution. En Nouvelle-Zélande, le fleuve Whanganui a obtenu le statut de personne juridique en 2017<ref>Catherine Larrère, « L'écoféminisme ou comment faire de la politique autrement », ''Travail, genre et sociétés'', n° 46, 2021, pp. 29-47</ref>. Ces évolutions juridiques reflètent une remise en question progressive de l'idée que seuls les êtres humains peuvent être sujets de droit. Elles s'inscrivent dans une tentative de « sortir d'une conception anthropocentrée du droit de l'environnement », comme l'écrit Marie Walckiers : « un détour par l'anthropologie est nécessaire pour sortir d'une conception anthropocentrée du droit de l'environnement »<ref>Walckiers, op. cit., p. 8</ref>. == Conclusion == L'anthropocentrisme, loin d'être une donnée naturelle et universelle de la pensée humaine, apparaît comme une construction historique et culturelle spécifique à la tradition occidentale. Né de la confluence de la philosophie grecque, de la théologie judéo-chrétienne et de la science moderne, il a façonné notre rapport au monde et légitimé l'exploitation intensive de la nature. Face à la crise écologique contemporaine, l'anthropocentrisme est de plus en plus contesté. Les alternatives proposées – biocentrisme, écocentrisme, écologie profonde – tentent de repenser la place de l'être humain dans le monde, non plus comme centre et maître, mais comme membre d'une communauté plus vaste du vivant. Comme l'écrit Baptiste Morizot, « l'opposition entre engagement écologique et engagement humanitaire montre les limites de l'infrastructure de la formulation du problème, c'est-à-dire de l'opposition entre anthropocentrisme humaniste et biocentrisme antihumaniste »<ref>Baptiste Morizot, « L'écologie contre l'Humanisme », ''Essais'', n° 13, 2018, pp. 43-68</ref>. La question demeure ouverte de savoir si un dépassement complet de l'anthropocentrisme est possible ou souhaitable, ou s'il faut plutôt viser à un « anthropocentrisme faible » qui reconnaît la valeur intrinsèque de la nature tout en maintenant la spécificité de la responsabilité humaine. Ce qui est certain, c'est que cette réflexion est devenue indispensable à l'heure de l'Anthropocène, où l'avenir même de l'humanité dépend de sa capacité à repenser sa relation au monde vivant. == Notes et références == {{references}} == Bibliographie == * Bergandi, Donato et Patrick Blandin. « De la protection de la nature au développement durable : genèse d'un oxymore éthique et politique ». ''Revue d'histoire des sciences'', tome 65, n° 1, 2012, pp. 103-142. * Descola, Philippe. ''Par-delà nature et culture''. Gallimard, Paris, 2005. * Descola, Philippe. ''L'écologie des autres. L'anthropologie et la question de la nature''. Quae, Versailles, 2011. * Descartes, René. ''Discours de la méthode''. 1637. * Devall, Bill et George Sessions. ''Deep Ecology: Living as if Nature Mattered''. Gibbs Smith, Salt Lake City, 1985. * Giroux, Valéry. « Pathocentrisme ». In Maxime Kristanek (dir.), ''Encyclopédie philosophique'', 2015. * Jonas, Hans. ''Le Principe responsabilité. Une éthique pour la civilisation technologique''. Trad. Jean Greisch. Flammarion, Paris, 1998 [1979]. * Kant, Emmanuel. ''Fondements de la métaphysique des mœurs''. Trad. Victor Delbos. Delagrave, Paris, 1994 [1785]. * Larrère, Catherine et Raphaël Larrère. ''Du bon usage de la nature – pour une philosophie de l'environnement''. Aubier, Paris, 1997. * Maris, Virginie. ''Philosophie de la biodiversité – petite éthique pour une nature en péril''. Buchet-Chastel, Paris, 2010. * Marsh, George Perkins. ''Man and Nature; or, Physical Geography as Modified by Human Action''. Scribner, New York, 1864. * Morizot, Baptiste. « L'écologie contre l'Humanisme ». ''Essais'', n° 13, 2018, pp. 43-68. * Næss, Arne. « The Shallow and the Deep, Long-Range Ecology Movement ». ''Inquiry'', vol. 16, 1973, pp. 95-100. * Norton, Bryan G. « L'éthique environnementale et l'anthropocentrisme faible » (1984). In Hicham-Stéphane Afeissa (dir.), ''Éthique de l'environnement''. Vrin, Paris, 2007, pp. 269-295. * Singer, Peter. ''La Libération animale''. Trad. Louise Rousselle. Payot, Paris, 2012 [1975]. * Spinoza, Baruch. ''Éthique''. In ''Œuvres complètes''. Trad. Charles Appuhn. Garnier-Flammarion, Paris, 1965. * Taylor, Paul W. ''Respect for Nature: A Theory of Environmental Ethics''. Princeton University Press, Princeton, 1986. * White, Lynn Townsend Jr. « The Historical Roots of Our Ecologic Crisis ». ''Science'', vol. 155, n° 3767, 10 mars 1967, pp. 1203-1207. == Voir aussi == * Biocentrisme * Écocentrisme * Écologie profonde * Éthique environnementale * Humanisme * Naturalisme (ontologie) * Pathocentrisme * Spécisme * Théocentrisme == Liens externes == * [https://encyclo-philo.fr/anthropocentrisme-a Anthropocentrisme] sur l'Encyclopédie philosophique * [https://www.larousse.fr/encyclopedie/philosophie/anthropocentrisme/191221 Anthropocentrisme] sur Larousse Encyclopédie * [https://www.cnrtl.fr/definition/anthropocentrisme Anthropocentrisme] sur le CNRTL {{Autocat}} 1mdoeh8cot2p63ibeyui0vpbyo94op8 Dictionnaire de philosophie/Aliénation 0 83138 768148 767668 2026-06-19T04:13:53Z PandaMystique 119061 Bot : ajout du paramètre lecture=oui au modèle {{DicoPhilo}} 768148 wikitext text/x-wiki {{DicoPhilo|Aliénation|lecture=oui}} Le terme « aliénation » vient du latin ''alienus'', signifiant « autre » ou « étranger », lui-même dérivé de ''aliud'' (autre chose). Dans son acception juridique originelle, aliéner désigne l'action de transférer un bien, de le céder à autrui, comme lors d'une vente ou d'une donation. Mais au-delà de cette signification première, l'aliénation devient dans le langage philosophique l'expression d'une dépossession bien plus profonde : celle par laquelle l'individu ou le collectif perd la maîtrise de soi-même, devient étranger à sa propre essence, à ses productions, à ses forces propres. Cette métamorphose conceptuelle traverse l'histoire de la pensée moderne et contemporaine, revêtant des colorations distinctes selon les auteurs et les contextes historiques. === Origines et premières élaborations philosophiques === ==== Rousseau et l'aliénation totale : liberté par le renoncement ==== Jean-Jacques Rousseau donne au terme « aliénation » une dimension politique ambivalente dans le ''Contrat social'' (1762). Il y expose un paradoxe fondateur qui deviendra un point de référence constant pour la philosophie ultérieure : pour que l'association politique garantisse effectivement la liberté de tous, chaque citoyen doit consentir à une « aliénation totale » de lui-même et de tous ses droits à la communauté<ref>Jean-Jacques Rousseau, ''Du Contrat social ou Principes du droit politique'', Livre I, chapitre 6, Amsterdam, Marc Michel Rey, 1762, p. 23</ref>. Cette formule surprenante mérite d'être comprise dans sa subtilité véritable plutôt que prise en surface. Rousseau écrit précisément : « Ces clauses, bien entendues, se réduisent toutes à une seule : savoir, l'aliénation totale de chaque associé avec tous ses droits à toute la communauté ; car, premièrement, chacun se donnant tout entier, la condition est égale pour tous ; et la condition étant égale pour tous, nul n'a intérêt de la rendre onéreuse aux autres<ref>Ibid., p. 23-24</ref>. » Le raisonnement est remarquable : en se dépouillant totalement de tout sans réserve aucune, chaque individu ne se soumet à personne en particulier, mais seulement à la volonté générale dont il demeure partie intégrante. L'aliénation devient ainsi un acte d'échange mutuel et réciproque qui fonde la légitimité politique du contrat. En renonçant délibérément à sa liberté naturelle (liberté théorique et illusoire), on gagne en retour la liberté civile véritable et la propriété légitime de ce que l'on possède<ref>Ibid., p. 25</ref>. Cette conception possède donc une tonalité étrangement positive : loin d'être dénoncée, l'aliénation apparaît comme la condition sine qua non de la liberté civile authentique. Cependant, cette réconciliation rousseauiste porte en germe les critiques que développeront les penseurs ultérieurs, particulièrement Marx. Car si l'aliénation totale fonde théoriquement l'égalité, elle peut facilement devenir le prétexte à une nouvelle forme de domination dès lors que la volonté générale est accaparée ou corrompue par les plus forts. Le texte rousseauiste révèle déjà l'ambiguïté : comment s'assurer que cette aliénation mutuelle demeurera véritablement réciproque et égale? ==== L'aliénation dialectique chez Hegel : le devenir-autre nécessaire ==== Georg Wilhelm Friedrich Hegel confère à l'aliénation (''Entfremdung'' en allemand) un rôle central et constitutif dans sa ''Phénoménologie de l'Esprit'' (1807), ouvrage fondamental où le concept acquiert ses lettres de noblesse dans la pensée allemande. L'aliénation n'y désigne pas une simple perte ou une régression, mais le mouvement dialectique nécessaire par lequel la conscience se pose face à elle-même comme quelque chose d'autre, d'étrange, d'extérieur, pour ensuite se réapproprier dans un mouvement de retour enrichi de nouveaux contenus. Il faut distinguer chez Hegel deux concepts connexes : ''Entäusserung'' (extériorisation, objectification) et ''Entfremdung'' (aliénation stricto sensu, devenir-étranger). Tandis qu'Entäusserung désigne l'objectification nécessaire de l'esprit, un processus potentiellement positif d'externalisation créatrice, Entfremdung caractérise l'état où cette extériorisation devient hostile, où l'esprit ne reconnaît plus son propre produit<ref>Stéphane Haber, « Le terme « aliénation » (« entfremdung ») et ses dérivés », dans ''Archives de philosophie'', tome 68, 2005, p. 32</ref>. Dans la ''Phénoménologie de l'Esprit'', l'esprit (Geist) ne parvient à la connaissance authentique de soi qu'en passant inévitablement par cette mise à distance, cette mise en étrangeté qui fait de lui temporairement un autre. Le processus se décrit ainsi : l'esprit s'extériorise, devient monde objectif, corps social, institutions ; il se perd ainsi dans cette extériorité ; mais du sein même de cette perte, il advient à une connaissance profondément enrichie lorsqu'il se reconnaît dans son produit aliéné. Hegel affirmait : « l'esprit s'est montré à nous [...] comme ce mouvement du soi qui s'extériorise de soi-même et s'immerge dans sa substance et, à partir d'elle, est aussi bien allé en soi comme sujet et fait aussi bien d'elle l'objet et le contenu qu'il dépasse cette différence de l'objectivité et du contenu<ref>Georg Wilhelm Friedrich Hegel, ''Phänomenologie des Geistes'', Bamberg et Würzburg, Joseph Anton Goebhardt, 1807, p. 527</ref>. » L'aliénation hégélienne possède donc une double dimension fondamentale : elle est à la fois négation (perte temporaire de soi dans l'altérité) et condition productive (moment nécessaire à l'enrichissement de la conscience). La fameuse dialectique du maître et de l'esclave illustre avec force cette dynamique paradoxale. La conscience de soi n'advient que médiatisée par la reconnaissance d'une autre conscience. Chacun cherche initialement à se faire reconnaître par l'autre ; cela génère une lutte à mort. Le vaincu devient esclave, aliéné dans son travail au service du maître. Mais c'est précisément dans cette aliénation, dans ce travail pour l'autre, que l'esclave développe progressivement sa véritable conscience de soi, en transformant le monde par son activité productive, tandis que le maître s'enfonce paradoxalement dans la dépendance totale envers celui qui travaille pour lui<ref>Ibid., p. 145-155</ref>. L'aliénation apparaît ainsi comme le moteur dialectique de l'histoire, le point de basculement où la négation engendre sa propre dépasser. Le chapitre intitulé « L'Esprit aliéné de soi » approfondit cette analyse en examinant la culture moderne (''Bildung'') comme processus généralisé d'aliénation. L'individu doit nécessairement se soumettre aux normes, aux institutions, aux traditions sociales ; il perd son immédiateté naturelle pour devenir véritablement sujet dans et par la médiation culturelle. Cette aliénation n'est donc ni contingente ni malveillante : elle constitue la structure même de la formation (Bildung) de l'esprit humain. Seul le savoir absolu, le moment ultime de la Phénoménologie, peut complètement dépasser cette aliénation en intégrant tous les moments antérieurs de l'expérience consciente<ref>Ibid., p. 360-415</ref>. ==== Feuerbach : l'aliénation religieuse comme projection de l'humain ==== Ludwig Feuerbach opère un renversement matérialiste de la dialectique hégélienne en appliquant systématiquement la notion d'aliénation à la critique de la religion dans ''L'Essence du christianisme'' (''Das Wesen des Christentums'', 1841). Pour Feuerbach, la religion ne constitue pas une révélation surnaturelle venant de l'extérieur, mais une projection aliénée de l'essence générique de l'humanité. Les hommes attribuent à Dieu la totalité de leurs propres qualités génériques (raison, volonté, amour, justice, infinité), en les magnifiant infiniment et en les détachant de leur source terrestre. Ils créent ainsi un être transcendant qui leur devient progressivement étranger et oppressif. Feuerbach formule le cœur de sa théorie en ces termes : « La conscience de Dieu est la conscience de soi de l'homme, la connaissance de Dieu est la connaissance de soi de l'homme. À partir de son Dieu tu connais l'homme, et inversement à partir de l'homme, son Dieu : les deux ne font qu'un<ref>Ludwig Feuerbach, ''Das Wesen des Christentums'', Leipzig, Otto Wigand, 1841, p. 47</ref>. » Cette affirmation, révolutionnaire pour l'époque, signifie que la théologie n'est jamais qu'une anthropologie inversée et magnifiée. En adorant Dieu, l'homme adore une puissance abstrait et idéalisée de lui-même qu'il ne reconnaît plus comme sienne, dont il s'est volontairement dépouillé. Le processus d'aliénation religieuse se décrit en trois moments : premièrement, l'homme projette en Dieu ses qualités essentielles, accomplissant une externalisation de lui-même ; deuxièmement, ces qualités, devenues attributs divins, se retournent contre l'homme qui se perçoit désormais comme faible, limité, pécheur, indigne ; troisièmement, l'homme se soumet à cette puissance extérieure qu'il a lui-même créée, perdant progressivement confiance dans ses propres capacités humaines. Cette aliénation religieuse appauvrit donc l'humanité réelle en siphonnant vers un être imaginaire la puissance créatrice que les hommes possèdent collectivement en tant qu'espèce. Feuerbach conclut que la désaliénation passe nécessairement par la prise de conscience de ce mécanisme projectif. Il ne suffit pas de critiquer abstraitement la religion ; il faut montrer comment elle fonctionne, comment elle se perpétue. L'homme doit se réapproprier les qualités qu'il a aliénées dans la figure divine et construire un humanisme athée fondé sur l'amour vivant et concret entre les êtres humains, non sur la dépendance envers une abstraction céleste<ref>Ibid., p. 408-415</ref>. Cette critique feurbachienne du religieux servira de point de départ à Marx pour développer sa critique de l'aliénation économique, qu'il considérera comme plus fondamentale encore. === Marx et la critique systématique de l'aliénation capitaliste === ==== Les ''Manuscrits économico-philosophiques de 1844'' : l'analyse du travail aliéné ==== Karl Marx reprend la notion d'aliénation à Hegel et à Feuerbach mais l'ancre résolument sur le terrain matériel de l'économie politique. Dans les ''Manuscrits économico-philosophiques de 1844'' (''Ökonomisch-philosophische Manuskripte''), inédits jusqu'au XX<sup>e</sup> siècle, il développe une analyse méthodique du travail aliéné qui deviendra centrale dans sa critique du capitalisme. Pour Marx, l'aliénation n'est pas d'abord un phénomène religieux, culturel ou purement spirituel : elle trouve sa racine historique et matérielle dans les rapports sociaux concrets de production capitaliste. Partant des observations les plus immédiates de l'expérience ouvrière, Marx systématise le concept d'aliénation en le déclinant selon quatre dimensions interdépendantes<ref>Karl Marx, ''Ökonomisch-philosophische Manuskripte aus dem Jahre 1844'', in ''Marx-Engels Gesamtausgabe'', Erste Abteilung, Band 2, Berlin, Dietz Verlag, 1982, p. 364-375</ref>. '''Première forme : l'aliénation du travailleur par rapport au produit de son travail.''' L'objet que le travailleur produit par son activité ne lui appartient nullement. Il devient non seulement extérieur, mais hostile, se dressant face au producteur « comme un être étranger, une puissance indépendante et étrangère ». Plus le travailleur produit de richesses objectives, de valeurs marchandes, plus son propre monde s'appauvrit, car ces richesses ne lui restituent rien. Elles vont grossir le capital du propriétaire, se retournant contre le travailleur sous forme de domination. Le produit du travail se transforme en capital, cette force collective qui ensuite asservit celui qui l'a créée. '''Deuxième forme : l'aliénation dans l'activité productive elle-même.''' Le travail n'est pas librement choisi selon les aspirations propres du travailleur, mais imposé, contraint par la nécessité économique. Marx exprime ce diagnostic avec une force remarquable : « l'ouvrier ne s'affirme donc pas dans son travail, mais s'y nie, [...] il ne s'y sent pas bien, mais malheureux, [...] il n'y déploie pas une énergie physique et spirituelle libre, mais y mortifie son physique et y ruine son esprit<ref>Ibid., p. 365</ref>. » Le travail, qui devrait être l'expression de l'essence humaine créatrice, devient une souffrance quotidienne, un simple moyen de subsistance, une servitude. Le travailleur se voit réduit à la condition d'une machine animée, exécutant mécaniquement les ordres. '''Troisième forme : l'aliénation de l'être générique de l'homme.''' Le travail aliéné réduit l'activité vitale libre et consciente – celle qui distingue fondamentalement l'homme de l'animal – à un simple moyen de satisfaire les besoins biologiques immédiats. L'homme ne travaille plus pour transformer intentionnellement le monde selon sa vision propre, pour laisser son empreinte créatrice, mais pour subsister. Il demeure en permanence préoccupé par la satisfaction des besoins élémentaires, sans pouvoir s'élever à une activité véritablement libre. Cela signifie que l'aliénation du travail entrave le développement de l'essence générique humaine, cette capacité à agir conscieusement et librement. '''Quatrième forme : l'aliénation de l'homme par rapport à ses semblables.''' L'aliénation travail engendre nécessairement une séparation entre les hommes. Le capitaliste s'approprie le produit du travail d'autrui, s'enrichissant de la dépossession d'un autre. Les rapports sociaux se transforment en rapports d'exploitation et de domination où chacun voit en l'autre non pas un frère ou un semblable, mais un concurrent économique ou un simple instrument à utiliser. La solidarité de l'espèce s'effrite face à la concurrence généralisée. Marx démontre que ces quatre formes d'aliénation ne sont pas des accidents, des erreurs rectifiables, mais des conséquences nécessaires de la propriété privée des moyens de production. Le travailleur, dépossédé de tous les outils et matières premières, n'a d'autre choix que de vendre sa force de travail au capitaliste, sa capacité à travailler devenant elle-même une marchandise. Cette vente transforme le travail en marchandise soumise aux lois du marché capitaliste. Pour Marx, l'émancipation authentique du travailleur passe nécessairement par l'abolition de la propriété privée capitaliste et l'instauration d'une forme de production où les travailleurs contrôlent collectivement les moyens de production<ref>Ibid., p. 390-391</ref>. ==== Du ''Capital'' : le fétichisme de la marchandise comme aliénation systématique ==== Dans ''Le Capital'' (''Das Kapital'', 1867), son opus magnum, Marx appelle à dépasser l'analyse philosophique pour mener une critique systématique de l'économie politique capitaliste. Bien qu'il utilise désormais moins fréquemment le terme explicite « d'aliénation », le concept demeure central, transformé et intégré dans une analyse plus complexe. Le concept-clé devient celui de « fétichisme de la marchandise ». Dans une économie capitaliste généralisée, les rapports sociaux entre les êtres humains – les échanges intentionnels, les arrangements sociaux – prennent mystérieusement l'apparence de rapports matériels entre des choses inanimées. Marx expose cette dynamique critique : « Le caractère mystique de la marchandise ne provient donc pas de sa valeur d'usage. [...] D'où provient donc le caractère énigmatique du produit du travail, dès qu'il revêt la forme de la marchandise ? Manifestement de cette forme elle-même<ref>Karl Marx, ''Das Kapital. Kritik der politischen Ökonomie'', Erster Band, Hamburg, Verlag von Otto Meissner, 1867, p. 38</ref>. » Les hommes ne perçoivent plus les liens sociaux vivants qui les unissent dans la production collective ; ils ne voient que des objets échangeables sur un marché abstrait régulé par l'offre et la demande. Cette réification généralisée des rapports sociaux constitue une forme d'aliénation systématique englobante : on ne voit que des prix, des valeurs marchandes, des chiffres, oubliant que derrière chaque marchandise se cache du travail humain réellement effectué. Marx démontre par ailleurs comment l'exploitation capitaliste repose précisément sur l'appropriation de la plus-value. Le capitaliste achète la force de travail du travailleur à un prix correspondant à sa valeur (ce qui est nécessaire à la reproduction de cette force : nourriture, logement, éducation minimale), mais s'approprie toute la valeur supplémentaire créée au-delà de ce temps de travail nécessaire. Cette extraction systématique de survaleur constitue la source du profit capitaliste, mais aussi le fondement matériel de l'aliénation : le travailleur produit bien davantage qu'il ne reçoit, enrichissant le capital qui le domine et qui se retourne progressivement contre lui<ref>Ibid., p. 207-245</ref>. Le fétichisme de la marchandise s'autorise d'une fausse apparence de naturalité. Les lois du marché semblent être des lois naturelles, inexorables, comme la loi de la gravité. Personne ne semble responsable de la misère ou de l'exploitation ; c'est « le marché » qui décide, comme si une force impersonnelle gouvernait l'économie. Or cette apparence masque une réalité sociale : ce sont les rapports de force entre classes sociales, les décisions des capitalistes, les lois que les États votent, qui produisent ces résultats. Reconnaître cela, c'est commencer à se désaliéner. ==== Continuité et transformation de la pensée marxienne ==== Pendant longtemps, notamment sous l'influence de la lecture althussérienne, on a cru voir une rupture épistémologique nette entre le « jeune Marx » humaniste des ''Manuscrits de 1844'', préoccupé avant tout par l'aliénation humaine, et le Marx « mature » du ''Capital'', qui se serait tourné vers une analyse scientifique rigoureuse de l'économie en abandonnant les concepts philosophiques jugés trop abstraits. Cette interprétation, bien que défendue par des penseurs importants, a été largement remise en cause par la recherche contemporaine. Les travaux récents montrent qu'il existe une profonde continuité et articulation dans la pensée de Marx : le concept d'aliénation ne disparaît pas comme une peau de serpent qu'on jette, mais se transforme, se matérialise et s'approfondit dans l'analyse du fétichisme de la marchandise, de la réification et de l'exploitation<ref>Jean Quetier, « L'aliénation chez Marx : d'une théorie à l'autre », ''Cause commune'', décembre 2020</ref>. Les ''Grundrisse'' (''Esquisse d'une critique de l'économie politique'', 1857-1858), manuscrits préparatoires au ''Capital'', montrent de manière éloquente que Marx continue d'utiliser pleinement le vocabulaire et l'analyse de l'aliénation. Il y décrit comment les conditions objectives du travail – les moyens de production, les machines, les bâtiments – deviennent face au travailleur autant de « puissances étrangères » qui le dominent, qui le façonnent<ref>Karl Marx, ''Grundrisse der Kritik der politischen Ökonomie'', Berlin, Dietz Verlag, 1953, p. 364-371</ref>. L'aliénation n'est donc point un concept abandonné ou dépassé, mais intégré dans une compréhension progressivement plus concrète, plus matériellement fondée des rapports sociaux capitalistes. === Les prolongements et transformations au XX{{e}} siècle === ==== Lukács et la réification comme totalité sociale ==== Georg Lukács, critique marxiste hongrois et théoricien du communisme, renouvelle magistralement la critique marxienne de l'aliénation à travers le concept de réification (''Verdinglichung'' : littéralement, « chosification ») dans son ouvrage majeur ''Histoire et conscience de classe'' (''Geschichte und Klassenbewusstsein'', 1923). Cette œuvre, immédiatement reconnue comme fondatrice, prolonge l'analyse marxienne du fétichisme de la marchandise en montrant comment, dans le capitalisme parvenu à sa maturité industrielle, la forme-marchandise pénètre progressivement tous les aspects de la vie sociale, idéologique et mentale. Lukács affirme avec force : « Le problème de la marchandise ne se présente pas seulement comme problème isolé, ni même comme problème central de l'économie prise en tant que science particulière, mais comme le problème structurel central de la société capitaliste sous tous ses aspects<ref>Georg Lukács, ''Geschichte und Klassenbewusstsein. Studien über marxistische Dialektik'', Berlin, Malik-Verlag, 1923, p. 94</ref>. » Ce qui distingue Lukács, c'est son refus de cantonner la réification au seul domaine économique. Elle affecte aussi la conscience, la vie quotidienne, l'intimité. Les rapports humains, les facultés intellectuelles, les relations affectives, la sexualité elle-même tendent progressivement à prendre la forme de choses quantifiables, échangeables, dotées d'une objectivité apparente qui dissimule leur caractère profondément social et historique. La réification transforme les qualités humaines vivantes en propriétés détachées et indépendantes, ressemblant à des marchandises. L'individu se perçoit lui-même comme une machine, comme un ensemble de compétences vendables sur le marché du travail. Ses émotions mêmes sont objectifiées : on « gère » ses émotions, on les optimise comme on optimise une production. Les individus deviennent progressivement des rouages d'un mécanisme impersonnel qui les dépasse et qu'ils ne maîtrisent plus, perpétuant ainsi l'aliénation à l'échelle microtextuelle de la conscience individuelle. Pour Lukács, cependant, seule la conscience de classe du prolétariat peut briser cette totalité réifiée. En tant que classe vendue collectivement comme marchandise vivante (vendant sa force de travail), le prolétariat est la seule classe capable de prendre conscience de la nature réellement sociale et historique des rapports capitalistes. Cette conscience de classe, fruit de l'expérience collective de l'exploitation, constitue la condition nécessaire de la révolution sociale qui pourra transformer les bases mêmes de la réification<ref>Ibid., p. 170-188</ref>. ==== Sartre : l'aliénation existentielle et la mauvaise foi ==== Jean-Paul Sartre transpose la question de l'aliénation du registre socio-économique vers le terrain de l'ontologie phénoménologique existentialiste. Dans ''L'Être et le Néant'' (1943), son monumental traité ontologique, il développe l'idée d'une aliénation qui affecte constitutionnellement la condition humaine, liée essentiellement au regard d'autrui et à la structure même de l'existence libre. Pour Sartre, la conscience en tant que néant, pure liberté transcendante, ne coïncide jamais pleinement avec elle-même. Mais la présence d'autrui introduit une aliénation existentielle plus profonde et irréductible : quand l'autre me regarde, il me transforme en objet, il me fige dans une essence que je ne maîtrise pas et dont je ne suis pas entièrement responsable. Sartre le formule de manière philosophiquement dense : « Si l'autre me voit, j'ai un dehors, j'ai une nature ; ma chute originelle c'est l'existence de l'autre<ref>Jean-Paul Sartre, ''L'Être et le Néant. Essai d'ontologie phénoménologique'', Paris, Gallimard, 1943, p. 321</ref>. » L'émotion de honte révèle précisément cette aliénation : je découvre soudainement que je suis « bien cet objet qu'autrui regarde, perçoit et juge ». Cette objectivation involontaire par le regard de l'autre constitue une forme d'aliénation ontologiquement irréductible : une partie de mon être m'échappe, existe pour l'autre d'une manière que je ne peux entièrement contrôler ou modifier. Sartre introduit par ailleurs la notion centrale de « mauvaise foi » (''mauvaise foi'' ou ''bad faith''), qui désigne l'attitude par laquelle la conscience fuit activement sa liberté propre en se donnant une essence fictive et fixe. La mauvaise foi est un mensonge à soi-même, une tromperie de soi : je me prétends défini par une nature inchangeable (« je suis naturellement timide », « je suis ouvrier de père en fils », « je suis un salaud »), utilisant cette prétendue essence pour échapper à l'angoisse vertigineuse de la liberté et de la responsabilité. C'est une forme d'auto-aliénation, où je me chosifie volontairement (bien que sans en avoir conscience) pour ne pas assumer ma transcendance, ma capacité infinie à me créer moi-même<ref>Ibid., p. 85-106</ref>. À partir de la ''Critique de la raison dialectique'' (1960), Sartre entreprend d'intégrer explicitement la dimension marxiste et socio-économique de l'aliénation dans son framework existentialiste, cherchant laborieusement à articuler liberté ontologique et aliénation socio-économique concrète. Il distingue avec soin la liberté ontologique (structure invariante de la conscience, son caractère de néant) de la liberté existentielle ou pratique (possibilité concrète et effective de se réaliser dans une situation donnée). En tant qu'ontologiquement libre, l'homme demeure librement responsable ; cependant, l'aliénation sociale et économique, bien qu'elle n'annule pas cette liberté ontologique, entrave gravement son exercice concret, la rend partiellement inaccessible<ref>Jean-Paul Sartre, ''Critique de la raison dialectique'', Paris, Gallimard, 1960, p. 338 et suivantes</ref>. ==== Fromm : la psychanalyse de l'aliénation dans la modernité capitaliste ==== Erich Fromm, membre de l'influente école de Francfort et psychanalyste de formation, propose dans ''Société aliénée et société saine'' (''The Sane Society'', 1955) une analyse novatrice de l'aliénation qui conjugue systématiquement Marx, Freud et une perspective humaniste personnelle. Fromm décrit l'individu contemporain, dans les sociétés capitalistes avancées, comme profondément devenu étranger à son travail, aux objets qu'il consomme, à ses semblables et, tragiquement, à lui-même. La personnalité individuelle n'exprime plus un libre développement de ses potentialités propres mais résulte d'un conditionnement social intensif qui prive chacun d'autonomie véritable et de spontanéité créatrice. Fromm diagnostique avec clarté un phénomène capital : le passage d'une société historiquement fondée sur l'« être » (l'accomplissement de sa nature propre, le développement de ses capacités) à une société contemporaine de l'« avoir » (l'accumulation de possessions et la consommation). Dans le capitalisme tardif et mondialisé, la valeur d'une personne humaine se mesure exclusivement à ce qu'elle possède et consomme, à son pouvoir d'achat, non à ce qu'elle authentiquement est en termes de développement humain. Cette inversion des valeurs humanistes engendre une aliénation profonde : les individus matériellement prospères souffrent fréquemment d'un mal-être psychique symptomatique de leur dépossession existentielle intérieure<ref>Erich Fromm, ''The Sane Society'', New York, Rinehart & Company, 1955, p. 110-135</ref>. Fromm appelle concrètement à créer une « société saine » fondée sur des valeurs humanistes, où les structures économiques, politiques et culturelles favoriseraient l'épanouissement véritable des individus plutôt que leur simple instrumentalisation et exploitation. À cette fin, il propose des pistes concrètes comme le revenu universel de base, la décentralisation du pouvoir économique, la transformation du travail salarié en autogestion coopérative – autant de propositions qui, largement anticipatrices, alimentent encore les débats politiques contemporains<ref>Ibid., p. 270-293</ref>. ==== Arendt : la division tripartite du travail et l'aliénation moderne ==== Hannah Arendt, philosophe politique d'origine allemande exilée en Amérique, propose dans ''Condition de l'homme moderne'' (''The Human Condition'', 1958) une analyse remarquable et souvent méconnue qui éclaire différentes formes d'aliénation à travers une tipologie novatrice des activités humaines. Elle distingue rigoureusement trois types fondamentalement distincts d'activités : le ''travail'' (labor), lié aux nécessités biologiques du corps et au cycle répétitif de la consommation ; l'œuvre (work), qui fabrique et crée des objets matériels durables constituant un monde commun stable ; l'action (action), activité éminemment politique par laquelle les hommes se révèlent dans leur unicité singulière et initient du nouveau dans le monde. Arendt diagnostique une aliénation spécifiquement moderne et caractéristique : le primat tyrannique du travail sur l'œuvre et surtout sur l'action politique. La modernité capitaliste et industrielle aurait progressivement transformé l'être humain en ''animal laborans'' (l'animal travailleur), préoccupé exclusivement par la production et la consommation matérielle, au détriment de l'œuvre créatrice durable et de l'action politique libre. « L'aliénation par rapport au monde est toujours une forme d'aliénation de soi<ref>Hannah Arendt, ''The Human Condition'', Chicago, University of Chicago Press, 1958, p. 254</ref>. » Quand l'homme devient entièrement absorbé par le travail, quand même l'œuvre se réduit à production consommable, quand l'action politique se vide de sens, l'humain s'aliène de ce qui le constitue authentiquement en tant qu'être capable de liberté. Arendt adresse une critique sévère à Marx lui-même pour avoir, selon elle, contribué à cette réduction en glorifiant le travail comme essence de l'homme et source d'émancipation, alors que pour elle, seules l'œuvre créatrice durable et l'action politique révèlent véritablement et complètement l'humanité. La société moderne, obsédée par la croissance économique infinie et la productivité perpétuelle, a perdu le sens de la durabilité stable du monde (l'œuvre) et, bien pire encore, de la liberté politique autentique fondée sur le jugement partagé entre égaux (l'action)<ref>Ibid., p. 79-135</ref>. Cette critique arendtienne demeure profondément troublante pour nos sociétés contemporaines. === La théorie critique contemporaine et ses renouvellements === ==== Honneth : de la réification à la théorie de la reconnaissance ==== Axel Honneth, philosophe allemand contemporain et héritier fidèle de la tradition de l'école de Francfort, renouvelle profondément la compréhension de la réification et de l'aliénation dans son ouvrage majeur ''La réification. Petit traité de Théorie critique'' (''Verdinglichung'', 2005). Refusant résolument l'idée que la réification serait une conséquence exclusive et déterminante de l'économie capitaliste (position classique depuis Lukács), Honneth la réinterprète originalement à partir de son concept central et novateur de reconnaissance (''Anerkennung''). Cette approche redéfinit l'aliénation moins comme un phénomène économique déterminé que comme un phénomène de relation intersubjective. Pour Honneth, la réification n'est pas d'abord un processus objectif économique maîtrisable et mesurable, mais un « oubli de la reconnaissance ». Avant tout acte de connaissance objective, avant toute attitude théorique distanciée, nous entretenons avec le monde et avec autrui une relation primordiale d'engagement affectif et éthique, une attitude de reconnaissance mutuelle impliquant empathie et engagement personnel. La réification survient quand cette reconnaissance originaire, cette attitude engagée, est oubliée, désactivée ou supprimée, quand nous traitons les autres, nous-mêmes ou le monde comme de simples objets manipulables, calculables, interchangeables. Honneth explique : « Nous réifions quand nous oublions que nous avons d'abord reconnu<ref>Axel Honneth, ''Verdinglichung. Eine anerkennungstheoretische Studie'', Frankfurt am Main, Suhrkamp Verlag, 2005, p. 57</ref>. » Cette réinterprétation élargit considérablement la critique de l'aliénation bien au-delà du seul cadre économique et politique. La réification peut survenir dans de multiples sphères de la vie sociale : relations amoureuses réduites à des calculs économiques, instrumentalisation du corps humain, mépris social systématique envers certains groupes, dévalorisation professionnelle, etc. Honneth cherche ainsi à formuler une théorie critique capable d'identifier les pathologies sociales contemporaines multiformes en se fondant rigoureusement sur les expériences vécues de non-reconnaissance<ref>Axel Honneth, ''La société du mépris. Vers une nouvelle théorie critique'', Paris, La Découverte, 2006, p. 240-278</ref>. ==== Applications contemporaines : aliénation numérique et économie des plateformes ==== Les transformations technologiques et économiques récentes des modes de travail ont suscité des analyses novatrices sur l'aliénation. L'émergence de l'économie des plateformes numériques (dénommée ''gig economy'') – Uber, Deliveroo, Amazon, Instacart, etc. – produit des formes véritablement inédites de précarisation, d'atomisation et de contrôle algorithmique des travailleurs. Les travailleurs des plateformes, bien que formellement présentés comme « indépendants » et « entrepreneurs de leurs propres services », demeurent en réalité soumis à une surveillance constante et à une direction permanente par des systèmes algorithmiques opaques qui échappent totalement à leur compréhension et maîtrise. Aucune instance humaine ne rend compte des décisions du système. Cette situation génère une aliénation spécifique et structurellement nouvelle : le travailleur n'a aucune prise véritable sur les conditions concrètes de son activité, lesquelles sont déterminées unilatéralement par des algorithmes mathématiques qui fonctionnent comme des boîtes noires incompréhensibles. Le travailleur se trouve atomisé, isolé, privé de tout collectif de travail où il pourrait partager ses frustrations, négocier des conditions, construire une solidarité. L'exploitation est « soft », masquée sous le langage de la liberté individuelle et de l'entrepreneuriat personnel, rendant plus difficile la prise de conscience de l'aliénation elle-même<ref>Sarrah Kassem, ''Work and Alienation in the Platform Economy – Amazon and the Power of Organization'', Londres, Pluto Press, 2023, p. 34-67</ref>. Pour répondre à ces nouvelles formes d'aliénation, la directive européenne sur les travailleurs des plateformes (2024) tente, encore timidement, de garantir des droits minimaux et d'exiger une supervision véritablement humaine des décisions algorithmiques<ref>Directive européenne 2024/2831 relative à l'amélioration des conditions de travail dans le travail via des plateformes</ref>. Cependant, ces mesures demeurent largement insuffisantes face à la puissance des mégacorporations numériques. === Perspectives non-occidentales et critique postcoloniale === ==== Fanon : aliénation coloniale, raciale et libération ==== Frantz Fanon, psychiatre martiniquais engagé de manière organique dans la lutte pour l'indépendance algérienne, élabore une pensée véritablement originale et irréductiblement propre de l'aliénation dans ses deux œuvres majeures : ''Peau noire, masques blancs'' (1952) et ''Les Damnés de la terre'' (1961). Fanon montre de manière irrécusable que le colonialisme produit une double aliénation structurellement compliquée : celle du colonisé, systématiquement dépossédé de son humanité, infériorisé ontologiquement, et celle du colon lui-même, enfermé dans un complexe de supériorité psychologique qui le coupe profondément de sa propre humanité véritable. L'aliénation coloniale se distingue de l'aliénation économique analysée par Marx, bien qu'elle s'y articule. Elle est d'abord psychologique et existentielle, affectant la structure même du rapport à soi et au monde. Le colonisé intériorise progressivement le regard méprisant et déshumanisant du colonisateur et en vient à se percevoir lui-même comme intrinsèquement inférieur, génétiquement inadapté, culturellement arriéré. « Le Noir n'a pas de résistance ontologique aux yeux du Blanc<ref>Frantz Fanon, ''Peau noire, masques blancs'', Paris, Éditions du Seuil, 1952, p. 87</ref>. » Cette négation systématique de l'être conduit à deux réactions pathologiques : soit l'assimilation destructrice (le colonisé renie sa propre culture, sa langue, son identité pour « devenir blanc »), soit un rejet violent qui reste malgré tout prisonnier du regard de l'autre. Les deux attitudes demeurent aliénées car structurées par la relation coloniale. Fanon refuse catégoriquement tout essentialisme identitaire comme réponse. Il récuse vigoureusement la tentation de répondre au racisme blanc par un « racisme antiraciste » qui essentialiserait à son tour les identités collectives. « Le Nègre n'est pas. Pas plus que le Blanc<ref>Frantz Fanon, ''Les Damnés de la terre'', Paris, François Maspero, 1961, p. 174</ref>. » L'identité n'est pas une essence figée mais une construction historique. La désaliénation passe par la lutte de libération nationale et anti-impérialiste qui permet au colonisé de reconquérir son humanité dans l'action collective, dans la praxis révolutionnaire, et par la construction d'un humanisme authentiquement universel débarrassé définitivement du racisme, du colonialisme et de l'impérialisme<ref>Ibid., p. 233-250</ref>. La pensée fanonienne ouvre ainsi l'aliénation sur l'horizon politique de la décolonisation. === Conclusion : continuité et actualité de l'aliénation === La notion d'aliénation traverse et structure ainsi l'ensemble de la philosophie moderne et contemporaine comme un fil rouge incessamment renoué, se transformant continuellement au gré des contextes historiques, des questions épocales et des préoccupations théoriques. Du transfert juridique de propriété chez Rousseau au moment dialectique constitutif chez Hegel, de la critique de la projection religieuse chez Feuerbach à l'analyse systématique de l'exploitation économique chez Marx, de la réification lukácsienne pénétrant tous les domaines du social à l'aliénation existentielle sartrienne, en passant par l'oubli psychanalytique fromien et la critique arendtienne de la réduction du monde au travail, jusqu'à l'oubli de reconnaissance chez Honneth et l'aliénation coloniale et raciale chez Fanon, le concept ne cesse de se multiplier, de se déplacer, de s'enrichir. Cette polysémie constitutive n'est nullement une faiblesse conceptuelle, mais témoigne plutôt de la fécondité philosophique et politique d'une notion qui permet de penser, d'analyser et de critiquer la dépossession sous ses multiples formes historiquement déterminées. L'aliénation désigne toujours, dans tous ses usages, un processus complexe par lequel l'individu ou le collectif devient étranger à lui-même, perd la maîtrise effective de ses propres forces, de ses productions matérielles et immatérielles, de son essence propre. Cependant, les mécanismes concrets et les manifestations phénoménales de cette dépossession varient considérablement : elle peut être essentiellement économique (exploitation capitaliste systématique), politique (domination d'État, colonialisme), religieuse ou idéologique (projection dans un au-delà inaccessible), existentielle et ontologique (fuite devant la liberté, mauvaise foi), psychologique (conditionnement social profond), ou coloniale (négation raciale de l'humanité). L'actualité brûlante du concept se vérifie quotidiennement dans les analyses politiques et philosophiques contemporaines du travail précarisé et atomisé, de l'économie numérique et algorithmique, des pathologies sociales multiples, des formes renouvelées de domination technologique, des inégalités exacerbées et des crises environnementales. Les débats contemporains sur le revenu de base, sur la reconnaissance politique des minorités systématiquement niées, sur les droits fondamentaux des travailleurs des plateformes, sur la décolonisation effective des savoirs et des institutions, mobilisent tous, explicitement ou implicitement, la question critique de l'aliénation. À l'heure où le capitalisme néolibéral tardif intensifie continuellement les formes anciennes et crée incessamment de nouvelles modalités de réification et de dépossession, où les technologies numériques génèrent des mécanismes inédits de contrôle et d'aliénation comportementale, où les inégalités s'approfondissent mondialement, comprendre dans toute sa profondeur et sa complexité les mécanismes, les causes profondes et les formes multiples de l'aliénation demeure un enjeu philosophique et politique fondamental et irrécusablement urgent. == Notes et références == {{references}} === Bibliographie indicative === * Hegel G. W. F., ''Phänomenologie des Geistes'', Bamberg et Würzburg, Joseph Anton Goebhardt, 1807 * Feuerbach L., ''Das Wesen des Christentums'', Leipzig, Otto Wigand, 1841 * Marx K., ''Ökonomisch-philosophische Manuskripte aus dem Jahre 1844'', in ''Marx-Engels Gesamtausgabe'', Berlin, Dietz Verlag, 1982 * Marx K., ''Das Kapital. Kritik der politischen Ökonomie'', Hamburg, Verlag von Otto Meissner, 1867 * Lukács G., ''Geschichte und Klassenbewusstsein'', Berlin, Malik-Verlag, 1923 * Sartre J.-P., ''L'Être et le Néant'', Paris, Gallimard, 1943 * Sartre J.-P., ''Critique de la raison dialectique'', Paris, Gallimard, 1960 * Fanon F., ''Peau noire, masques blancs'', Paris, Seuil, 1952 * Fanon F., ''Les Damnés de la terre'', Paris, François Maspero, 1961 * Fromm E., ''The Sane Society'', New York, Rinehart & Company, 1955 * Arendt H., ''The Human Condition'', Chicago, University of Chicago Press, 1958 * Honneth A., ''Verdinglichung. Eine anerkennungstheoretische Studie'', Frankfurt am Main, Suhrkamp Verlag, 2005 * Haber S., « Le terme « aliénation » (« entfremdung ») et ses dérivés », ''Archives de philosophie'', tome 68, 2005, p. 31-51 === Voir aussi === * [[Travail]] * [[Liberté]] * [[Reconnaissance]] * [[Réification]] * [[Conscience de classe]] * [[Capitalisme]] * [[Dialectique]] * [[Mauvaise foi]] * [[Fétichisme de la marchandise]] {{AutoCat}} engerjfd15kjj2krqtrpp3o9qif2u5b Dictionnaire de philosophie/Anaxagore 0 83143 768154 764916 2026-06-19T04:14:53Z PandaMystique 119061 Bot : ajout du paramètre lecture=oui au modèle {{DicoPhilo}} 768154 wikitext text/x-wiki {{DicoPhilo|Anaxagore de Clazomènes|lecture=oui}} == Vie et contexte historique == {{wikisource|Auteur:Anaxagore_de_Clazomènes|Anaxagore de Clazomènes}} Les données biographiques concernant Anaxagore sont, comme le souligne l'''Oxford Classical Dictionary'', en grande partie « confuses et déroutantes » (''confused and confusing''), et la plupart des anecdotes transmises par la tradition antique doivent être abordées avec une prudence critique. Les récits qui nous sont parvenus proviennent en effet de sources tardives, séparées d'Anaxagore par plusieurs siècles : Plutarque (I{{er}}-II{{e}} siècle ap. J.-C.) dans ses ''Vies parallèles'', Valère Maxime (I{{er}} siècle ap. J.-C.) dans ses ''Faits et dits mémorables'', puis Diogène Laërce (première moitié du III{{e}} siècle ap. J.-C.) dans ses ''Vies et doctrines des philosophes illustres''. Ces auteurs compilent eux-mêmes des traditions doxographiques antérieures, parfois stylisées à des fins rhétoriques ou moralisatrices, parfois clairement légendaires. Anaxagore (en grec ancien Ἀναξαγόρας, « maître de l'assemblée » ou « chef au forum ») naît vers 500 av. J.-C. à Clazomènes, cité grecque d'Ionie située sur la côte occidentale de l'actuelle Turquie, à une trentaine de kilomètres à l'ouest d'Izmir<ref>Diogène Laërce, ''Vies et doctrines des philosophes illustres'', II, 6 (DK 59 A 1). Apollodore d'Athènes, cité par Diogène Laërce, place la naissance d'Anaxagore à la 70{{e}} Olympiade (500-496 av. J.-C.).</ref>. Fils d'Hégésibule (certaines sources mentionnent Eubule), il appartient, selon la tradition ancienne, à une famille aristocratique et aurait possédé un patrimoine important<ref>Diogène Laërce, II, 6-7 ; Valère Maxime, ''Faits et dits mémorables'', VIII, 7, ext. 5.</ref>. Selon Diogène Laërce, Anaxagore aurait abandonné ses biens à ses proches afin de se consacrer entièrement à la philosophie<ref>Diogène Laërce, II, 7 : « Il négligea ses biens par amour de la sagesse. »</ref>. Une autre tradition, rapportée tant par Valère Maxime que par Diogène Laërce, raconte qu'Anaxagore, revenant d'un long voyage, aurait trouvé ses propriétés en ruine et aurait déclaré : « Si cela n'avait pas péri, c'est moi qui aurais péri »<ref>Valère Maxime, ''Faits et dits mémorables'', VIII, 7, ext. 5 ; Diogène Laërce, II, 6-7. Valère Maxime commente la sentence comme exemple de la sagesse la plus parfaite.</ref>. Ces récits, qu'ils soient authentiques ou pour partie légendaires, illustrent l'image qu'Anaxagore a laissée dans la mémoire doxographique : celle du philosophe contemplatif, détaché des affaires domestiques et consacré à l'étude du cosmos. Une anecdote célèbre, rapportée par plusieurs sources anciennes, témoigne de ce détachement. Interrogé sur son attachement à sa patrie, Anaxagore aurait répondu en levant la main vers le ciel : « J'ai un soin extrême de ma patrie », signifiant par là que le véritable philosophe considère l'univers entier comme sa demeure<ref>Plutarque, ''Vie de Périclès'', 4, 3-5 ; Aristote, ''Éthique à Eudème'', 1215b6-8.</ref>. Lorsqu'on lui demanda quel était l'homme le plus heureux, il aurait répondu, sur le même mode paradoxal, qu'aucun de ceux auxquels on songe ordinairement ne saurait prétendre à ce titre, et que le véritable bonheur paraîtrait même étrange à son interlocuteur<ref>Aristote, ''Éthique à Eudème'', 1215b6-8.</ref>. À quelqu'un qui lui demandait encore pour quelle raison on devrait choisir de naître plutôt que de ne pas être, il aurait répondu : « Afin de contempler les cieux et l'ordre de l'univers entier »<ref>Aristote, ''Éthique à Eudème'', 1216a11-14. Cette phrase, qui condense toute une conception de la vie philosophique comme ''theoria'', sera reprise par les moralistes anciens et par la tradition philosophique jusqu'à l'époque romaine.</ref>. === L'arrivée à Athènes et l'activité philosophique === La chronologie exacte de la vie d'Anaxagore demeure l'objet de débats parmi les historiens modernes, en raison de divergences importantes entre les sources anciennes<ref>Leonard Woodbury, « Anaxagoras and Athens », ''Phoenix'', vol. 35, n{{o}} 4, 1981, p. 295-315 ; Jaap Mansfeld, « The Chronology of Anaxagoras' Athenian Period and the Date of His Trial », ''Mnemosyne'', vol. 32-33, 1979-1980, p. 39-69 et p. 85-95 ; Malcolm Schofield, ''An Essay on Anaxagoras'', Cambridge, Cambridge University Press, 1980, p. 33-35.</ref>. Selon la chronologie établie par Apollodore d'Athènes et rapportée par Diogène Laërce, Anaxagore serait arrivé à Athènes vers 480 av. J.-C., à l'âge de vingt ans, au moment des guerres médiques<ref>Diogène Laërce, II, 7. Cette tradition est soutenue par certains chercheurs modernes : Patricia O'Brien, « Anaxagoras and the Diurnal Revolution », ''Phronesis'', vol. 13, 1968, p. 133-143 ; Leonard Woodbury, 1981 ; Daniel Graham, ''Science before Socrates'', Oxford, Oxford University Press, 2006.</ref>. D'autres savants, notamment Jaap Mansfeld, proposent une date plus tardive, vers 456 av. J.-C.<ref>Jaap Mansfeld, 1979-1980 ; cf. également David Sider, ''The Fragments of Anaxagoras'', Sankt Augustin, Academia Verlag, 2005, p. 1-18, pour une discussion approfondie des problèmes chronologiques.</ref>. La question n'est pas définitivement tranchée, mais la majorité des historiens s'accorde sur une période d'activité philosophique à Athènes s'étendant sur près de trente ans, probablement entre 480/456 et 450/437 av. J.-C.<ref>Diogène Laërce, II, 7 ; Malcolm Schofield, 1980, p. 33-35.</ref>. Quelle que soit la date précise de son arrivée, Anaxagore est présenté par la tradition antique comme le premier philosophe à introduire la spéculation cosmologique et la philosophie naturelle ionienne dans la cité athénienne<ref>Clément d'Alexandrie, ''Stromates'', I, 14, 63, 3 (DK 59 A 7) : « Anaxagore transporta d'Ionie à Athènes la philosophie. » Cf. également Plutarque, ''Vie de Périclès'', 4, 2 ; Isocrate, ''Sur l'échange'', 268.</ref>. Athènes, en pleine expansion culturelle et politique après sa victoire sur les Perses à Marathon (490 av. J.-C.) et à Salamine (480 av. J.-C.), deviendra rapidement le centre intellectuel du monde grec. C'est dans ce contexte que la tradition situe l'enseignement d'Anaxagore. La tradition biographique antique, dominée par le récit de Plutarque dans la ''Vie de Périclès'', rapporte qu'Anaxagore se serait lié à Périclès, l'homme d'État athénien qui dominera la vie politique de la cité de 454 à 431 av. J.-C.<ref>Plutarque, ''Vie de Périclès'', 4-5, 16, 32 (DK 59 A 15, A 17). Platon, ''Phèdre'', 269e-270a, évoque également l'influence d'Anaxagore sur l'éloquence de Périclès.</ref>. Selon cette tradition, Anaxagore aurait compté parmi les maîtres intellectuels de Périclès, et le surnom d'« instructeur de Périclès » lui aurait été attaché dès l'Antiquité<ref>Plutarque, ''Vie de Périclès'', 4, 5 ; Diogène Laërce, II, 10, 13. Les instruments de référence modernes (''Oxford Classical Dictionary'', s.v. « Anaxagoras ») restent toutefois prudents sur la portée exacte de cette relation, dont les témoignages sont tardifs.</ref>. Il convient cependant de ne pas transformer cette tradition en déclaration politique publique avérée : les sources dont nous disposons sont tardives, souvent biographiques ou rhétoriques, et la figure de l'« instructeur de Périclès » appartient en partie à la construction doxographique. L'idée que le grand orateur démocratique d'Athènes ait trouvé dans les leçons d'un philosophe naturaliste la source de son éloquence élevée et de son détachement aristocratique correspond à un topos biographique commode, qu'il convient de ne pas surinterpréter en termes de dette intellectuelle publique. Parmi les disciples ou auditeurs d'Anaxagore, les sources anciennes mentionnent aussi le poète tragique Euripide<ref>Diogène Laërce, II, 10 ; Héracléide du Pont, cité par Aulu-Gelle, ''Nuits attiques'', XV, 20 (DK 59 A 17). Certaines idées cosmologiques présentes dans les pièces d'Euripide semblent refléter l'enseignement d'Anaxagore.</ref>, le musicien et sophiste Damon<ref>Plutarque, ''Vie de Périclès'', 4.</ref>, et peut-être Archélaos, qui aurait ensuite été le maître de Socrate<ref>Diogène Laërce, II, 16, 23 (DK 60 A 1, A 4).</ref>. Concernant Socrate lui-même, la question de savoir s'il a personnellement rencontré Anaxagore demeure controversée. Dans le ''Phédon'', Platon fait dire à Socrate qu'il a entendu quelqu'un lire dans le livre d'Anaxagore (la tradition ancienne a identifié ce lecteur à Archélaos)<ref>Platon, ''Phédon'', 97b-99d. L'identité du lecteur n'est pas précisée par Platon, mais la tradition ancienne l'a identifié à Archélaos.</ref>, ce qui suggère que Socrate n'a probablement pas eu de contact direct avec le philosophe de Clazomènes. Dans l'''Apologie'', Platon fait par ailleurs référence au fait que les livres d'Anaxagore étaient en vente pour une drachme à l'orchestre du théâtre<ref>Platon, ''Apologie'', 26d. Cette remarque témoigne de la large diffusion de l'œuvre d'Anaxagore à Athènes à la fin du V{{e}} siècle av. J.-C.</ref>, ce qui indique que ses idées étaient largement connues à Athènes, même en l'absence d'enseignement oral direct. === L'œuvre écrite === Anaxagore a composé un traité intitulé ''Sur la nature'' (Περὶ φύσεως), rédigé en prose ionienne<ref>Diogène Laërce, II, 6 ; Simplicius, ''Commentaire sur la Physique d'Aristote'', 27, 2 (DK 59 A 41).</ref>. Selon les témoignages anciens, il n'aurait écrit qu'un seul livre<ref>Diogène Laërce, I, 16 ; II, 6-7.</ref>, bien que Platon emploie le pluriel τὰ Ἀναξαγόρου βιβλία dans l'''Apologie''<ref>Platon, ''Apologie'', 26d.</ref>. Cette apparente contradiction s'explique probablement par le fait que l'ouvrage, même relativement court, était copié sur plusieurs rouleaux de papyrus, ce qui était l'usage courant à l'époque pour les œuvres en prose. Diogène Laërce rapporte qu'Anaxagore fut le premier à publier un livre contenant des figures et des diagrammes<ref>Diogène Laërce, II, 11.</ref>, détail qui témoigne de la dimension scientifique et pédagogique qu'on lui prêtait dans l'Antiquité tardive. Le traité d'Anaxagore était rédigé dans un style sobre et dense, caractérisé par une prose ionienne archaïsante<ref>Karl Deichgräber, « Anaxagoras Stil », ''Philologus'', vol. 87, 1933, p. 15-26 ; Hermann Fränkel, ''Dichtung und Philosophie des frühen Griechentums'', Munich, C.H. Beck, 1962, p. 529-547.</ref>. Contrairement aux poèmes philosophiques de Parménide et d'Empédocle, rédigés en hexamètres dactyliques à la manière d'Homère ou d'Hésiode, Anaxagore choisit la prose comme véhicule de sa pensée, s'inscrivant ainsi dans la tradition ionienne des philosophes naturalistes inaugurée par Anaximandre et Anaximène. De ce traité, il ne subsiste aujourd'hui qu'une vingtaine de fragments authentiques, principalement conservés par Simplicius de Cilicie (VI{{e}} siècle ap. J.-C.) dans ses commentaires sur Aristote<ref>L'édition de référence des fragments et témoignages demeure celle de Hermann Diels et Walther Kranz, ''Die Fragmente der Vorsokratiker'', 6{{e}} édition, Berlin, Weidmann, 1951-1952, vol. II, p. 5-44 (59 A et B). Une édition plus récente est celle d'André Laks et Glenn Most, ''Early Greek Philosophy'', Loeb Classical Library, 9 vol., Cambridge (Mass.), Harvard University Press, 2016, qui a introduit un nouveau système de numérotation ; éditions et traductions anglaises : Patricia Curd, ''Anaxagoras of Clazomenae : Fragments and Testimonia'', Toronto, University of Toronto Press, 2007 ; David Sider, ''The Fragments of Anaxagoras'', Sankt Augustin, Academia Verlag, 2005.</ref>. Simplicius, conscient de la rareté de l'ouvrage à son époque, prit soin de citer longuement les premières parties du traité, qui exposaient les principes généraux du système<ref>Simplicius, ''Commentaire sur la Physique d'Aristote'', 155, 23-157, 4 (fragments B1-B4) ; 164, 24-166, 1 (fragment B12).</ref>. === Le procès et l'exil === Les circonstances du départ d'Anaxagore d'Athènes et de sa fin de vie sont particulièrement controversées dans les sources anciennes. Diogène Laërce rapporte pas moins de quatre versions contradictoires du procès d'Anaxagore<ref>Diogène Laërce, II, 12-15. Ces quatre récits divergent sur l'identité de l'accusateur, la nature précise des charges, le déroulement du procès et son issue.</ref>. Selon une première version, attribuée à Sotion, Anaxagore aurait été accusé d'impiété (ἀσέβεια) par Cléon pour avoir déclaré que le soleil était une masse de métal incandescent ; Périclès l'aurait défendu, et Anaxagore aurait été condamné à une amende de cinq talents et à l'exil<ref>Sotion, dans Diogène Laërce, II, 12.</ref>. Selon Satyre, l'accusateur aurait été Thucydide (l'adversaire politique de Périclès, et non l'historien), les charges auraient inclus non seulement l'impiété mais aussi la trahison (sympathies pro-perses ou « médisme »), et Anaxagore aurait été condamné à mort par contumace<ref>Satyre, dans Diogène Laërce, II, 12-13.</ref>. Deux autres versions, attribuées respectivement à Hermippe et à Hiéronymos de Rhodes, présentent des variantes sur le rôle de Périclès et l'issue du procès<ref>Hermippe et Hiéronymos de Rhodes, dans Diogène Laërce, II, 13-14.</ref>. Plutarque, dans la ''Vie de Périclès'', fournit une version différente. Selon lui, un devin et politicien athénien nommé Diopeithès aurait fait voter un décret (le « décret de Diopeithès ») autorisant les poursuites judiciaires contre ceux qui ne reconnaissaient pas les dieux ou enseignaient des doctrines sur les phénomènes célestes<ref>Plutarque, ''Vie de Périclès'', 32, 1-2. Ce décret, daté approximativement de 433-432 av. J.-C., aurait visé Anaxagore mais aussi, indirectement, Périclès.</ref>. Selon cette version, Anaxagore aurait été accusé d'impiété pour avoir soutenu que le soleil n'était pas une divinité mais une pierre incandescente, et que la lune était une terre<ref>Plutarque, ''Vie de Périclès'', 32, 2 ; Platon, ''Apologie'', 26d, où Mélètos accuse Socrate de professer les mêmes opinions qu'Anaxagore.</ref>. Grâce à l'intervention de Périclès, Anaxagore aurait échappé à la condamnation à mort mais aurait dû s'exiler d'Athènes<ref>Plutarque, ''Vie de Périclès'', 32, 5.</ref>. L'historicité même de ce procès a été mise en doute par certains historiens modernes, qui soulignent l'absence de témoignages contemporains et les ressemblances troublantes avec le procès de Socrate<ref>J. A. Davison, « Protagoras, Democritus, and Anaxagoras », ''Classical Quarterly'', vol. 3, 1953, p. 33-45, exprime un scepticisme extrême.</ref>. Néanmoins, la plupart des spécialistes admettent aujourd'hui qu'un procès a bien eu lieu, même si les détails précis nous échappent<ref>Leonard Woodbury, 1981 ; Daniel Graham, 2006, p. 311-318, défendent l'historicité du procès tout en reconnaissant les difficultés chronologiques.</ref>. La date du procès demeure elle aussi incertaine : certains savants la placent vers 450 av. J.-C.<ref>Cette date traditionnelle est défendue notamment dans l'''Oxford Classical Dictionary'', 2{{e}} édition, 1970, s.v. « Anaxagoras ».</ref>, d'autres vers 437-436 av. J.-C.<ref>Mansfeld, 1979-1980.</ref>, d'autres encore vers 433-432 av. J.-C.<ref>Woodbury, 1981.</ref>. Quelle que soit la date précise, Anaxagore se retire à Lampsaque, colonie grecque d'Asie Mineure située sur l'Hellespont (l'actuel détroit des Dardanelles), où, selon la tradition, il est accueilli avec honneur<ref>Diogène Laërce, II, 14-15 ; Valère Maxime, ''Faits et dits mémorables'', VIII, 7, ext. 5.</ref>. Il y meurt en 428 av. J.-C., à l'âge de soixante-douze ans selon Apollodore<ref>Apollodore, dans Diogène Laërce, II, 7.</ref>. Les habitants de Lampsaque lui vouent, selon les sources tardives, un culte et célèbrent sa mémoire pendant plus d'un siècle après sa mort. Ils auraient élevé un autel dédié à l'Esprit et à la Vérité (Νοῦς καὶ Ἀλήθεια) en son honneur, et observé l'anniversaire de sa mort comme un jour férié pour les enfants des écoles<ref>Diogène Laërce, II, 15 ; Élien, ''Histoire variée'', VIII, 19 ; Cicéron, ''Tusculanes'', V, 36, 104.</ref>. Une inscription fut placée sur sa tombe, dont le texte exact ne nous est malheureusement pas parvenu, mais qui témoignait, selon Diogène Laërce, de l'estime dans laquelle les citoyens de Lampsaque tenaient le philosophe<ref>Diogène Laërce, II, 15.</ref>. === Portrait et anecdotes === Les sources anciennes ont conservé de nombreuses anecdotes sur Anaxagore qui, même si leur authenticité historique ne peut être garantie, témoignent de l'image du philosophe dans la tradition biographique antique. Galien rapporte qu'Anaxagore, apprenant la mort de son fils, aurait déclaré avec le plus grand calme : « Je savais qu'il était mortel quand je l'ai engendré »<ref>Galien, ''Des opinions d'Hippocrate et de Platon'', IV, 7, 41 (DK 59 A 33).</ref>. Ces récits contribuèrent à faire d'Anaxagore le modèle, dans la tradition, du philosophe détaché des contingences matérielles et consacré à la contemplation de la nature. Dans le ''Phèdre'' de Platon, Socrate attribue l'éloquence de Périclès à l'influence d'Anaxagore, qui lui aurait appris à s'élever au-dessus des préoccupations quotidiennes par la spéculation sur la nature de l'intelligence (νοῦς) et de la folie<ref>Platon, ''Phèdre'', 269e-270a.</ref>. Cette remarque témoigne de la réputation d'Anaxagore dans l'Athènes classique : celle d'un penseur dont les spéculations abstraites et « météorologiques » (au sens ancien de l'étude des phénomènes célestes) pouvaient paraître étranges ou excessives aux yeux du commun, mais qui exerçaient une fascination certaine sur les esprits cultivés. Cette image se reflète jusque dans la comédie d'Aristophane, ''Les Nuées'', où les spéculations cosmologiques tournées en ridicule semblent en partie inspirées par les doctrines d'Anaxagore, bien que ce soit Socrate qui soit présenté sur scène<ref>Aristophane, ''Les Nuées'', passim. Cf. Kenneth Dover, ''Aristophanes Clouds'', Oxford, Clarendon Press, 1968, p. xxxii-xlvii, pour la discussion du rapport entre les théories cosmologiques ridiculisées dans la pièce et celles d'Anaxagore.</ref>. === L'école de Lampsaque === À Lampsaque, Anaxagore fonda ou du moins anima une école philosophique qui continua son enseignement après sa mort<ref>Malcolm Schofield, 1980, p. 1 ; W. K. C. Guthrie, ''A History of Greek Philosophy'', vol. II, Cambridge, Cambridge University Press, 1965, p. 266-267.</ref>. Parmi ses disciples à Lampsaque, les sources mentionnent Métrodore de Lampsaque<ref>Diogène Laërce, II, 17 ; Plutarque, ''Des opinions des philosophes'', 888e (DK 61).</ref>, qui poursuivit et développa les interprétations allégoriques d'Homère dans un esprit anaxagoréen. L'influence de l'école de Lampsaque se prolongea au moins jusqu'à la fin du V{{e}} siècle av. J.-C. Cette présence d'Anaxagore à Lampsaque explique peut-être pourquoi ses idées ont continué à circuler et à être discutées dans le monde grec, malgré son départ d'Athènes et le caractère fragmentaire de la tradition de son œuvre écrite. == Les principes métaphysiques fondamentaux == La philosophie d'Anaxagore se construit en réponse directe aux exigences métaphysiques établies par Parménide d'Élée<ref>Patricia Curd, ''The Legacy of Parmenides: Eleatic Monism and Later Presocratic Thought'', Princeton, Princeton University Press, 1998, p. 123-142 ; Malcolm Schofield, ''An Essay on Anaxagoras'', Cambridge, Cambridge University Press, 1980, p. 27-47.</ref>. Dans son poème philosophique, Parménide avait posé deux principes fondamentaux : « l'être est et ne peut pas ne pas être » (ἔστιν εἶναι) et « le non-être n'est pas et ne peut pas être » (οὐκ ἔστι μὴ εἶναι)<ref>Parménide, fragment B2, DK 28 B 2, 3-5 ; cf. également B6, 1-2 et B8, 1-2.</ref>. De ces prémisses, Parménide concluait que toute génération et toute corruption véritables sont impossibles, car elles impliqueraient un passage de l'être au non-être ou du non-être à l'être, transitions logiquement impossibles puisque le non-être ne peut en aucune manière être<ref>Parménide, B8, 6-21 ; Aristote, ''Physique'', I, 8, 191a23-31.</ref>. Plus encore, Parménide soutenait que l'être véritable devait être un, continu, homogène, immuable et éternel<ref>Parménide, B8, 22-25 : « Il n'est pas divisible, puisqu'il est tout entier semblable » (οὐδὲ διαιρετόν ἐστιν, ἐπεὶ πᾶν ἐστιν ὁμοῖον).</ref>. Anaxagore accepte les principes éléatiques fondamentaux, c'est-à-dire l'impossibilité du passage de l'être au non-être et inversement, mais refuse d'en tirer la conclusion que le monde sensible et le changement sont illusoires<ref>Aristote, ''Métaphysique'', I, 3, 984a11-16 ; Simplicius, ''Commentaire sur la Physique d'Aristote'', 25, 19-26 (DK 59 A 52).</ref>. Selon Simplicius, « Anaxagore de Clazomènes, qui fut un disciple de la philosophie d'Anaximène, fut le premier à s'opposer à Parménide »<ref>Simplicius, ''Commentaire sur la Physique'', 25, 19-21 (DK 59 A 52). L'affirmation qu'Anaxagore fut disciple d'Anaximène est chronologiquement problématique et doit être comprise au sens large d'une appartenance à la tradition ionienne.</ref>. Plutôt que de nier la réalité du changement et de la diversité, Anaxagore cherche à fonder une cosmologie conforme aux exigences parménidiennes tout en rendant compte de la multiplicité et du mouvement observables dans la nature<ref>Malcolm Schofield, 1980, p. 38-42 ; G. E. L. Owen, « Eleatic Questions », ''Classical Quarterly'', vol. 10, 1960, p. 84-102.</ref>. Comme l'a remarqué G. E. L. Owen, la phrase d'ouverture du traité d'Anaxagore, « Toutes choses étaient ensemble », est « manifestement formulée comme une contradiction plate de Parménide sur plusieurs questions majeures »<ref>G. E. L. Owen, « The Place of the Timaeus in Plato's Dialogues », ''Classical Quarterly'', vol. 3, 1953, p. 79-95, cité dans Malcolm Schofield, 1980, p. 64.</ref>. === Le principe de conservation === Le premier principe métaphysique fondamental qu'Anaxagore énonce se trouve dans le fragment B17 : « Les Grecs ne pensent pas correctement au sujet de la génération et de la corruption. Aucune chose ne naît ni ne périt, mais à partir des choses qui sont, il y a mélange et séparation. Ainsi, ils appelleraient correctement la génération "mélange" (σύγκρισις) et la corruption "séparation" (διάκρισις) »<ref>Anaxagore, fragment B17, cité par Simplicius, ''Commentaire sur la Physique'', 163, 20-24 (DK 59 B 17).</ref>. Ce principe de conservation constitue le fondement de toute sa physique et sa réponse directe à l'interdit parménidien. Ce qui apparaît comme génération n'est en réalité qu'un réarrangement d'éléments préexistants qui se mélangent (συμμίσγεται). Ce qui semble être corruption n'est que la dissociation (διακρίνεται) de ces mêmes éléments<ref>Anaxagore, B17 ; cf. également Aristote, ''Génération et corruption'', I, 1, 314a18-20 (DK 59 A 52) : « Anaxagore et d'autres disent que la génération et la corruption sont mélange et séparation. »</ref>. Rien ne naît du néant (ex nihilo nihil fit), rien ne retourne au néant : les composants élémentaires de la réalité existent de toute éternité et demeurent inaltérables dans leur nature propre. Aristote souligne qu'Anaxagore, comme d'autres philosophes naturalistes, fonde explicitement ce principe sur l'axiome parménidien<ref>Aristote, ''Physique'', I, 4, 187a26-31.</ref>. Le principe prend chez Anaxagore une forme plus spécifique encore dans le fragment B10, où il pose la question rhétorique : « Comment le cheveu pourrait-il provenir de ce qui n'est pas cheveu, et la chair de ce qui n'est pas chair ? » (πῶς γὰρ ἂν ἐκ μὴ τριχὸς γένοιτο θρὶξ καὶ σὰρξ ἐκ μὴ σαρκός;)<ref>Anaxagore, fragment B10, conservé dans une scholie à Grégoire de Nazianze (DK 59 B 10).</ref>. Cette formulation, qui deviendra proverbiale dans l'Antiquité, exprime ce que les commentateurs modernes appellent le « principe du semblable par le semblable » (similia similibus) : une substance ne peut provenir que de la même substance, déjà présente sous une forme latente<ref>Aristote, ''Physique'', I, 4, 187a26-29 ; cf. Malcolm Schofield, 1980, p. 51-58 ; Jonathan Barnes, ''The Presocratic Philosophers'', Londres, Routledge, 1982, p. 309-315.</ref>. Ce principe présente une analogie frappante avec celui qu'Antoine-Laurent de Lavoisier formulera en 1789 comme principe de conservation de la matière, et la sentence « Rien ne se perd, rien ne se crée, tout se transforme » en est parfois rapprochée. Il convient cependant de ne pas surinterpréter cette analogie : les mécanismes qu'Anaxagore propose pour expliquer les transformations (mélange et séparation d'ingrédients éternels) sont qualitatifs et ne relèvent pas d'une conception chimique quantitative au sens moderne<ref>Antoine-Laurent de Lavoisier, ''Traité élémentaire de chimie'', Paris, Cuchet, 1789, vol. I, p. 101 : « Rien ne se crée, ni dans les opérations de l'art, ni dans celles de la nature, et l'on peut poser en principe que, dans toute opération, il y a une égale quantité de matière avant et après l'opération. » Le rapprochement avec Anaxagore relève plus de l'analogie conceptuelle rétrospective que d'une filiation historique documentée.</ref>. L'intuition conservatrice d'Anaxagore partage avec le principe lavoisien l'idée que rien ne se perd ni ne se crée dans le devenir physique, mais il serait anachronique d'y voir l'un des principes cardinaux de la chimie moderne. === Tout est dans tout === Le deuxième principe métaphysique fondamental d'Anaxagore s'énonce ainsi : « Il y a une part de tout en toute chose » (ἐν παντὶ παντὸς μοῖρα ἔνεστι, fragment B11)<ref>Anaxagore, fragment B11, cité par Simplicius, ''Commentaire sur la Physique'', 164, 26 (DK 59 B 11).</ref>. Ce principe, souvent désigné par la formule latine ''omnia in omnibus'' (« toutes choses dans toutes choses »), constitue sans doute la thèse la plus caractéristique et la plus déroutante de la philosophie d'Anaxagore<ref>Cf. Gregory Vlastos, « The Physical Theory of Anaxagoras », ''Philosophical Review'', vol. 59, 1950, p. 31-57 ; Colin Strang, « The Physical Theory of Anaxagoras », ''Archiv für Geschichte der Philosophie'', vol. 45, 1963, p. 101-118.</ref>. Il signifie que chaque portion de matière, si infime soit-elle, contient en elle-même des portions de toutes les autres substances qui existent dans l'univers. Il n'existe aucune substance pure, aucun élément qui puisse être isolé de tous les autres<ref>Anaxagore, B6 : « Puisqu'il est impossible qu'il y ait un minimum, il ne serait pas possible que [quelque chose] soit séparé, ni ne vienne à l'être par soi-même » (ἐπεὶ δὲ οὐκ ἔστι τοῦ ὀλίγου τὸ ἐλάχιστον, οὐκ ἂν γένοιτο χωρίς, οὐδὲ γένοιτο καθ᾽ ἑαυτό).</ref>. Dans un morceau d'or, il y a non seulement de l'or en proportion dominante, mais aussi de la chair, des os, du chaud, du froid, du sec, de l'humide, et ainsi de suite pour toutes les qualités et substances possibles<ref>Aristote, ''Métaphysique'', I, 3, 984a13-16 ; Simplicius, ''Commentaire sur la Physique'', 34, 29-35, 9 (DK 59 A 45).</ref>. Cette thèse découle logiquement du principe de conservation et du principe du semblable par le semblable combinés. En effet, comment la chair pourrait-elle provenir du pain et du lait que nous consommons, si le pain et le lait ne contenaient pas déjà de la chair ? La question rhétorique du fragment B10 impose cette conclusion. La nourriture que nous ingérons doit nécessairement contenir en elle-même, quoique de manière imperceptible en raison de la petitesse des parties, toutes les substances qui composent notre corps : cheveux, ongles, veines, artères, nerfs, os<ref>Scholie anonyme à Grégoire de Nazianze, DK 59 B 10 : « Dans le même liquide séminal, il y a des cheveux, des ongles, des veines et des artères, des nerfs et des os, et ils sont imperceptibles en raison de la petitesse des parties (δι᾽ ὀλιγότητα), mais lorsqu'ils croissent, ils se séparent graduellement. »</ref>. C'est par un processus de séparation graduelle (ἀποκρίνεσθαι), au cours de la croissance, que ces éléments préexistants dans la nourriture viennent s'ajouter aux parties correspondantes de notre organisme. Le principe « tout est dans tout » s'applique non seulement aux substances naturelles comme la chair et les os, mais aussi aux qualités opposées. Anaxagore affirme que « le noir est dans le blanc et le blanc dans le noir » et qu'il en va de même pour le lourd et le léger, le chaud et le froid<ref>Anaxagore, B15, cité par Simplicius, ''Commentaire sur le Ciel'', 608, 26 (DK 59 B 15) ; Simplicius, ''Commentaire sur la Physique'', 175, 11-14.</ref>. Ces oppositions qualitatives ne sont pas absolues mais relatives : ce qui nous paraît blanc contient en réalité du noir, mais en proportion si faible que cette part de noir demeure invisible à nos sens. De même, ce qui est léger contient du lourd, et inversement<ref>Anaxagore, B1, B4b ; Aristote, ''Physique'', I, 4, 187b1-7 (DK 59 A 52).</ref>. Cette doctrine a suscité d'intenses débats interprétatifs depuis l'Antiquité. Aristote la présente comme une tentative de résoudre le problème de la nutrition tout en respectant les contraintes éléatiques<ref>Aristote, ''Physique'', III, 4, 203a19-b3 ; cf. W. K. C. Guthrie, ''A History of Greek Philosophy'', vol. II, Cambridge, Cambridge University Press, 1965, p. 289-294.</ref>. Les interprètes modernes se divisent sur la question de savoir si Anaxagore conçoit ces « portions » (μοῖραι) comme des particules infinitésimales ou comme des qualités interpénétrées sans structure corpusculaire déterminée<ref>Pour la première interprétation « particulaire », voir Gregory Vlastos, 1950 ; Arthur L. Peck, « Anaxagoras : Predication as a Problem in Physics », ''Classical Quarterly'', vol. 25, 1931, p. 27-37 et p. 112-120. Pour la seconde interprétation « non-particulaire », voir Colin Strang, 1963 ; Daniel Graham, « Was Anaxagoras a Reductionist? », ''Ancient Philosophy'', vol. 24, 2004, p. 1-18 ; Anna Marmodoro, « Anaxagoras's Qualitative Gunk », ''British Journal for the History of Philosophy'', vol. 23, 2015, p. 402-422.</ref>. Quoi qu'il en soit, ce principe constitue la clé de voûte du système physique d'Anaxagore. === Pas de plus petit ni de plus grand === Le troisième principe métaphysique, exposé dans le fragment B3, stipule qu'« il n'y a pas de plus petit dans le petit, mais toujours un plus petit encore, car il est impossible que ce qui est cesse d'être par division (οὐ γάρ ἐστι τοῦ ἀποκεκρίσθαι τὸ ἐλάχιστον). Mais il y a aussi toujours un plus grand que le grand, et il est égal au petit en multitude (πλῆθος) ; mais par rapport à elle-même, chaque chose est à la fois grande et petite »<ref>Anaxagore, fragment B3, cité par Simplicius, ''Commentaire sur la Physique'', 164, 17-20 (DK 59 B 3).</ref>. Ce principe garantit la divisibilité infinie de la matière et s'oppose frontalement à toute conception atomiste de type démocritéen<ref>Leucippe et Démocrite, fragments DK 67-68 ; Aristote, ''Génération et corruption'', I, 2, 315b28-317a2 ; I, 8, 325a23-b5.</ref>. Contrairement à Leucippe et Démocrite, qui postulent l'existence d'atomes insécables (ἄτομα, littéralement « indivisibles »), Anaxagore maintient que toute portion de matière, aussi petite soit-elle, peut encore être divisée, et que cette division révélera toujours la présence de toutes les substances selon le principe « tout est dans tout »<ref>Démocrite, fragments B9, B125, B156, B164 ; cf. Aristote, ''De la génération et de la corruption'', I, 8, 325a23-b5 ; Simplicius, ''Commentaire sur le Ciel'', 294, 33-295, 22 (DK 68 A 37).</ref>. Pour Anaxagore, la divisibilité peut être infinie sans que la matière s'évanouisse dans le néant, précisément parce que chaque fragment, si petit soit-il, contient encore toutes les substances<ref>Anaxagore, B6 : « Puisque les parts du grand et du petit sont égales en nombre, ainsi également toutes choses seraient dans toute chose. Il n'est pas possible qu'elles soient séparées, mais toutes choses ont une part de toute chose » (ἴσαι γὰρ ἀριθμῷ μοῖραί εἰσι καὶ τοῦ μεγάλου καὶ τοῦ σμικροῦ· καὶ οὕτως ἂν εἴη πάντα ἐν παντί).</ref>. Cette infinité dans la petitesse se combine avec l'infinité dans la grandeur. Il n'existe pas de limite supérieure à l'extension d'une substance, pas plus qu'il n'existe de limite inférieure<ref>Anaxagore, B3 : « Mais il y a aussi toujours un plus grand que le grand, et il est égal au petit en multitude » (ἀλλὰ καὶ μεγάλου ἀεὶ ἔστι μεῖζον· καὶ ἴσον ἐστὶ τῷ σμικρῷ πλήθει).</ref>. Cette double infinité, à la fois de division et d'extension, constitue un trait distinctif de la métaphysique d'Anaxagore et pose des problèmes interprétatifs considérables aux commentateurs, tant anciens que modernes<ref>Margaret Furth, « A Philosophical Hero? Anaxagoras and the Eleatics », ''Oxford Studies in Ancient Philosophy'', vol. 9, 1991, p. 95-129 ; David Furley, « Anaxagoras, Plato and Naming of Parts », dans ''Presocratic Philosophy: Essays in Honour of Alexander Mourelatos'', éd. Victor Caston et Daniel Graham, Aldershot, Ashgate, 2002, p. 119-126.</ref>. Le principe de non-minimum a une conséquence métaphysique importante : il assure que le mélange universel « tout est dans tout » ne pourra jamais être défait. En effet, puisqu'il n'existe pas de plus petite quantité d'une substance, celle-ci ne pourra jamais être entièrement extraite d'un mélange. On pourra réduire sa proportion indéfiniment, mais elle demeurera toujours présente en quelque mesure<ref>Anaxagore, B6 ; Simplicius, ''Commentaire sur la Physique'', 164, 20-22 : « Car si tout est dans tout et si tout se sépare de tout, alors du prétendu minimum quelque chose de plus petit que lui sera séparé, et du prétendu maximum quelque chose de plus grand que lui a été séparé. »</ref>. Ainsi, le principe de mélange universel est garanti de manière structurelle par le principe de divisibilité infinie. Comme l'a remarqué Colin Strang, « la complexité structurelle n'est pas, dans la théorie d'Anaxagore, fonction de la taille »<ref>Colin Strang, 1963, p. 366 : « Structural complexity is not, on Anaxagoras' theory, a function of size. »</ref>. La justification qu'Anaxagore donne de ce principe est explicitement parménidienne : « car il est impossible que ce qui est cesse d'être » (οὐ γὰρ ἔστι τοῦ εἶναι τὸ μὴ εἶναι)<ref>Anaxagore, B3 ; cette formulation reprend directement l'axiome de Parménide, B2, 3.</ref>. Si l'on pouvait diviser la matière jusqu'à la faire disparaître complètement, cela impliquerait un passage de l'être au non-être, ce qui viole l'interdit fondamental. Toute division, aussi poussée soit-elle, doit donc laisser subsister quelque chose, et ce quelque chose, par application du principe « tout est dans tout », contiendra encore des portions de toutes les substances<ref>Simplicius, ''Commentaire sur la Physique'', 164, 23-165, 1 (commentaire sur B3).</ref>. === Le principe de prédominance === Du principe « tout est dans tout » découle une difficulté évidente : si chaque chose contient une part de toutes les autres, comment expliquer que nous percevions des objets distincts et identifiables ? Comment distinguer l'or de la chair, le noir du blanc, si l'or contient de la chair et la chair contient de l'or, si le noir contient du blanc et le blanc contient du noir ? Anaxagore résout cette difficulté par ce que les commentateurs modernes appellent le « principe de prédominance » (bien qu'Anaxagore lui-même n'emploie pas ce terme technique)<ref>Le terme « principe de prédominance » (predominance principle) a été introduit par les interprètes modernes, notamment Gregory Vlastos, 1950, p. 47-50 ; Malcolm Schofield, 1980, p. 88-101.</ref>. Dans le fragment B12, il affirme : « Chaque chose est et était très manifestement (ἐμφανέστατα) constituée de celles des choses dont il y a le plus en elle »<ref>Anaxagore, fragment B12, cité par Simplicius, ''Commentaire sur la Physique'', 156, 1-157, 4, à 156, 10-11 (DK 59 B 12).</ref>. Autrement dit, une chose tire son identité et ses propriétés apparentes des substances qui prédominent en elle. Un morceau d'or nous apparaît comme de l'or parce que la substance or y est présente en proportion largement supérieure à toutes les autres substances. De même, notre chair nous semble être de la chair parce que la substance chair y domine quantitativement<ref>Simplicius, ''Commentaire sur la Physique'', 34, 29-35, 9 : « Chaque chose semble être cela dont elle a le plus, comme elle l'était auparavant » (δοκεῖν δ᾽ ἕκαστον εἶναι ταῦτα ὧν ἂν πλεῖστα ἐνῇ, ὥσπερ καὶ πρότερον).</ref>. Cette prédominance n'est pas absolue, puisque toutes les autres substances demeurent présentes en quelque proportion, mais elle est suffisante pour conférer à l'objet ses caractéristiques perceptibles<ref>Anaxagore, B12 ; Aristote, ''Physique'', I, 4, 187b1-7.</ref>. Le principe de prédominance permet à Anaxagore de concilier son ontologie de mélange universel avec notre expérience quotidienne d'un monde composé d'objets distincts et identifiables. Il rend compte aussi du changement : lorsqu'un objet semble se transformer en un autre, par exemple lorsque le pain que nous mangeons devient chair, ce qui se produit en réalité est une modification des proportions relatives des substances présentes. La chair, déjà présente dans le pain mais en proportion imperceptible, vient s'ajouter à la chair de notre corps à mesure que les autres composants du pain se dispersent ou que leurs proportions relatives diminuent<ref>Anaxagore, B10 ; Aristote, ''Génération des animaux'', II, 4, 740b26-29 ; Simplicius, ''Commentaire sur la Physique'', 460, 4-465, 19 (DK 59 A 45).</ref>. Contrairement aux apparences sensibles, il n'y a pas de transformation qualitative véritable, mais seulement des réarrangements quantitatifs<ref>Malcolm Schofield, 1980, p. 88-101 ; Daniel Graham, ''Explaining the Cosmos: The Ionian Tradition of Scientific Philosophy'', Princeton, Princeton University Press, 2006, p. 137-152.</ref>. Théophraste, dans son traité ''Sur les sensations'', rapporte qu'Anaxagore soutenait que « toute sensation s'accompagne de douleur » (πᾶσαν αἴσθησιν μετὰ λύπης εἶναι) précisément parce que percevoir implique un contact entre des qualités opposées<ref>Théophraste, ''De Sensibus'', 1, 27-29 (DK 59 A 92). Cf. également Aétius, IV, 9, 1 (DK 59 A 92).</ref>. Si le principe de prédominance explique pourquoi nous percevons des objets distincts, il explique aussi pourquoi cette perception n'est jamais parfaitement exacte : les sens ne peuvent discriminer que les différences marquées de proportion, mais les différences subtiles leur échappent<ref>Sextus Empiricus, ''Contre les mathématiciens'', VII, 90 (DK 59 B 21) : « Les apparences sont une vision des choses non-manifestes » (ὄψις τῶν ἀδήλων τὰ φαινόμενα).</ref>. === Synthèse : la réponse d'Anaxagore à Parménide === Les quatre principes métaphysiques que nous venons d'examiner, soit la conservation, le « tout est dans tout », la divisibilité infinie et la prédominance, forment un système cohérent qui constitue la réponse d'Anaxagore au défi parménidien<ref>Patricia Curd, 1998, p. 123-165 ; Malcolm Schofield, 1980, p. 27-86.</ref>. Anaxagore accepte l'impossibilité du passage de l'être au non-être, mais rejette les conséquences que Parménide en tire concernant l'unicité, l'immobilité et l'homogénéité de l'être. Premièrement, en remplaçant la génération et la corruption par le mélange et la séparation (B17), Anaxagore sauve les phénomènes sans violer l'interdit éléatique : rien ne naît véritablement, rien ne périt véritablement, il n'y a que réarrangement de ce qui existe déjà de toute éternité. Deuxièmement, en posant que tout est dans tout (B11, B6), Anaxagore explique comment des substances apparemment nouvelles peuvent émerger sans être créées ex nihilo : elles étaient déjà présentes dans le mélange, simplement imperceptibles en raison de leur faible proportion. Troisièmement, en affirmant la divisibilité infinie (B3, B6), Anaxagore garantit que le mélange universel ne pourra jamais être entièrement défait. Quatrièmement, en introduisant le principe de prédominance (B12), Anaxagore rend compte de la diversité phénoménale et de la possibilité de la perception, tout en maintenant l'ontologie du mélange universel. Anaxagore parvient ainsi à préserver les intuitions fondamentales de Parménide, à savoir la permanence de l'être, l'impossibilité du non-être et l'immutabilité substantielle, tout en rendant compte de la pluralité, du changement et du devenir qui caractérisent notre expérience du monde<ref>Patricia Curd, 1998, p. 165 : « Anaxagoras accepts the fundamental Eleatic constraint that what-is-not cannot be, but offers an account of the world that preserves both plurality and change. » Cf. également Daniel Graham, 2006, p. 137-152 ; G. E. R. Lloyd, ''Early Greek Science: Thales to Aristotle'', Londres, Chatto & Windus, 1970, p. 47-52.</ref>. == Les ingrédients primordiaux == La question de savoir quels sont exactement les ingrédients élémentaires (τὰ χρήματα) qui composent l'univers d'Anaxagore a suscité d'intenses débats parmi les commentateurs, depuis Aristote jusqu'aux spécialistes contemporains<ref>Pour une vue d'ensemble des débats, voir Malcolm Schofield, ''An Essay on Anaxagoras'', Cambridge, Cambridge University Press, 1980, p. 99-138 ; Patricia Curd, ''Anaxagoras of Clazomenae : Fragments and Testimonia'', Toronto, University of Toronto Press, 2007, essais 2-4 ; Daniel Graham, « Was Anaxagoras a Reductionist? », ''Ancient Philosophy'', vol. 24, 2004, p. 1-18.</ref>. Le problème est rendu particulièrement complexe par le fait qu'Anaxagore ne fournit pas de liste systématique et exhaustive de ces ingrédients, et que les fragments conservés mentionnent des entités de natures apparemment différentes. Comme le souligne Malcolm Schofield, « malgré le rôle cardinal de la doctrine du "tout est dans tout" dans sa philosophie, les fragments qui ont survécu indiquent que dans son exposition, Anaxagore assigna au moins autant d'importance à son récit du mélange primordial et à sa description du Noûs et de son activité cosmogonique »<ref>Malcolm Schofield, 1980, p. 99.</ref>. === Les opposés === Dans les fragments B1, B2, B4b, B8, B12 et B15, Anaxagore énonce explicitement plusieurs paires d'opposés (τὰ ἐναντία) : l'humide et le sec (τὸ ὑγρόν καὶ τὸ ξηρόν), le chaud et le froid (τὸ θερμόν καὶ τὸ ψυχρόν), le lumineux et l'obscur (τὸ λαμπρόν καὶ τὸ ζοφερόν), le dense et le rare (τὸ πυκνόν καὶ τὸ ἀραιόν)<ref>Anaxagore, B1, B2, B4b, B8, B12, B15.</ref>. Ces qualités opposées jouent un rôle fondamental dans la cosmologie d'Anaxagore. Ce sont elles qui, par leur séparation progressive (ἀποκρίνεσθαι) à partir du mélange originel et leur réagencement ultérieur, donnent naissance à la diversité des phénomènes naturels<ref>Anaxagore, B12, B13, B15, B16 ; Aristote, ''Physique'', I, 4, 187b1-7 (DK 59 A 52).</ref>. Les opposés ne doivent pas être compris comme de simples attributs qui qualifieraient une substance sous-jacente. Dans la pensée présocratique en général, et chez Anaxagore en particulier, la distinction ultérieure entre substance et qualité n'existe pas encore avec la netteté qu'elle acquerra chez Aristote<ref>G. E. L. Owen, « Tithenai ta Phainomena », dans ''Aristotle et les problèmes de méthode'', éd. Suzanne Mansion, Louvain, Publications Universitaires, 1961, p. 83-103 ; Jonathan Barnes, ''The Presocratic Philosophers'', Londres, Routledge, 1982, p. 316-321.</ref>. Le chaud (τὸ θερμόν) n'est pas simplement une propriété qui affecterait une matière indéterminée ; c'est une réalité substantielle en soi, qui peut être présente en plus ou moins grande proportion dans un mélange donné. Comme l'a remarqué F. M. Cornford, ces opposés doivent être compris comme des « choses-qualités » (quality-things)<ref>F. M. Cornford, « Anaxagoras' Theory of Matter », ''Classical Quarterly'', vol. 24, 1930, p. 14-30, aux pages 16-17.</ref>. Gregory Vlastos précise que ces opposés doivent plutôt être compris « comme des formes d'énergie ou de puissance (δύναμις) »<ref>Gregory Vlastos, « The Physical Theory of Anaxagoras », ''Philosophical Review'', vol. 59, 1950, p. 31-57.</ref>. === L'interprétation « austère » : les opposés seuls === Paul Tannery, à la fin du XIXe siècle, fut le premier à contester l'interprétation aristotélicienne selon laquelle Anaxagore aurait postulé l'existence de « particules homéomères » (particules de chair, d'os, etc.)<ref>Paul Tannery, « La théorie de la matière d'Anaxagore », ''Revue Philosophique'', vol. 22, 1886, p. 255-274 ; repris dans ''Pour l'histoire de la science hellène'', Paris, Alcan, 1887, p. 275-290.</ref>. Tannery soutenait qu'Anaxagore ne parlait que de qualités : l'humide, le sec, le chaud, le froid, etc. John Burnet adopta une position similaire dans son ouvrage influent ''Early Greek Philosophy'', reconnaissant que « même lorsque la notion de qualité (ποιότης) avait été définie, cette manière de penser survécut »<ref>John Burnet, ''Early Greek Philosophy'', 4{{e}} édition, Londres, Adam and Charles Black, 1930, p. 256-264, citation p. 263.</ref>. Burnet s'appuyait notamment sur Galien, qui affirme dans son commentaire sur Hippocrate que « ce sont les qualités qui sont éternelles » chez Anaxagore<ref>Galien, ''Commentaire sur le traité hippocratique Des humeurs'', XVI, 32 Kühn.</ref>. Cette interprétation présente plusieurs avantages. Premièrement, elle se fonde étroitement sur les fragments conservés d'Anaxagore lui-même, plutôt que sur les reconstructions d'Aristote, qui écrivait près de cent cinquante ans après Anaxagore et avait ses propres préoccupations philosophiques. Deuxièmement, elle rend compte du rôle cosmologique crucial des opposés dans les fragments B12, B13, B15 et B16, où ce sont explicitement les opposés qui se séparent lors de la cosmogonie<ref>Malcolm Schofield, 1980, p. 107-113 ; Colin Strang, « The Physical Theory of Anaxagoras », ''Archiv für Geschichte der Philosophie'', vol. 45, 1963, p. 101-118.</ref>. Cette interprétation a été défendue au XXe siècle par plusieurs spécialistes éminents, notamment F. M. Cornford, Gregory Vlastos (avec certaines réserves), Colin Strang, Malcolm Schofield (avec des nuances importantes), Brad Inwood, David Sedley, et plus récemment Anna Marmodoro<ref>F. M. Cornford, 1930 ; Gregory Vlastos, 1950, p. 329-333 ; Colin Strang, 1963 ; Malcolm Schofield, 1980, p. 99-138 ; Brad Inwood, « Anaxagoras and Infinite Divisibility », ''Illinois Classical Studies'', vol. 11, 1986, p. 17-33 ; David Sedley, ''Creationism and Its Critics in Antiquity'', Berkeley, University of California Press, 2007, p. 24-26 ; Anna Marmodoro, « Anaxagoras's Qualitative Gunk », ''British Journal for the History of Philosophy'', vol. 23, 2015, p. 402-422.</ref>. === L'interprétation aristotélicienne : les homéomères === Toutefois, la question devient plus complexe lorsqu'on prend en considération les témoignages indirects, notamment ceux d'Aristote. Dans plusieurs passages, Aristote attribue à Anaxagore une doctrine des « homéomères » (τὰ ὁμοιομερῆ), c'est-à-dire des substances dont chaque partie est semblable au tout<ref>Aristote, ''Métaphysique'', I, 3, 984a11-16 ; Aristote, ''Génération et corruption'', I, 1, 314a18-24 (DK 59 A 46).</ref>. Les exemples donnés par Aristote incluent la chair, les os, le sang, la moelle, l'or, le bois, autant de substances naturelles que nous rencontrons dans l'expérience quotidienne. Cependant, le terme même « homéomère » n'apparaît nulle part dans les fragments conservés d'Anaxagore. C'est Aristote qui l'a introduit pour caractériser ce qu'il comprenait être la position d'Anaxagore<ref>Le terme ὁμοιομερής apparaît d'abord chez Aristote, ''Parties des animaux'', II, 1, 646b10-20 ; ''Génération et corruption'', I, 1, 314a18 sq. Cf. Pierre Pellegrin, « La théorie aristotélicienne des homéomères », ''Revue de Métaphysique et de Morale'', vol. 86, 1981, p. 449-467.</ref>. Cette discordance entre les fragments authentiques, qui mentionnent principalement des opposés, et l'interprétation aristotélicienne, qui privilégie les substances naturelles comme la chair et les os, a conduit à une longue controverse parmi les spécialistes modernes. Comme le souligne W. K. C. Guthrie, « le fait le plus gênant pour ceux qui souhaitent suivre Aristote est que le terme homéomères n'apparaît jamais dans les fragments d'Anaxagore lui-même, et que les fragments ne mentionnent jamais explicitement la chair, les os ou le sang comme des ingrédients élémentaires »<ref>W. K. C. Guthrie, 1965, p. 284-285.</ref>. L'interprétation « expansive », qui accepte pleinement le témoignage aristotélicien, a néanmoins été défendue par plusieurs spécialistes, notamment Arthur L. Peck dans les années 1920 et 1930, et plus récemment par George Kerferd<ref>Arthur L. Peck, « Anaxagoras : Predication as a Problem in Physics », ''Classical Quarterly'', vol. 25, 1931, p. 27-37 et p. 112-120 ; George B. Kerferd, « Anaxagoras and the Concept of Matter before Aristotle », ''Bulletin of the John Rylands Library'', vol. 52, 1969, p. 129-143.</ref>. === L'interprétation médiane === Une troisième voie, une interprétation « médiane », a été proposée notamment par Malcolm Schofield et Patricia Curd<ref>Malcolm Schofield, 1980, p. 99-138 ; Patricia Curd, 1998, p. 123-165 ; Patricia Curd, 2007, essais 2-4.</ref>. Selon cette lecture, l'ontologie d'Anaxagore comprend plusieurs catégories d'entités : les opposés, les substances naturelles fondamentales comme les métaux, la terre, l'air et l'éther, et les ingrédients biologiques comme la chair, le sang et les os. En revanche, les plantes, les animaux et leurs parties organiques ne seraient pas des éléments primordiaux mais des constructions naturelles résultant de l'agencement des ingrédients plus fondamentaux<ref>Patricia Curd, 2007, essais 2-3, p. 157-191 ; Malcolm Schofield, 1980, p. 132-138.</ref>. Cette interprétation médiane présente l'avantage de tenir compte à la fois des fragments authentiques et des témoignages d'Aristote, sans les opposer frontalement. Elle reconnaît que les opposés jouent un rôle cosmologique crucial, puisque c'est leur séparation qui déclenche la formation du cosmos (fragments B12, B13, B15), tout en admettant que les substances naturelles ont également une place dans l'ontologie d'Anaxagore. === Les semences (σπέρματα) === Un élément supplémentaire de complexité est introduit par la mention des « semences » (σπέρματα) dans les fragments B4a et B4b. Dans le fragment B4b, après avoir mentionné les opposés, Anaxagore ajoute : « et il y avait beaucoup de terre présente, et des semences infinies en nombre, ne se ressemblant en rien les unes aux autres » (πολλὴ δὲ γῆ ἐνῆν καὶ σπέρματα ἄπειρα πλῆθος οὐδὲν ἐοικότα ἀλλήλοις)<ref>Anaxagore, fragment B4b, cité par Simplicius, ''Commentaire sur la Physique'', 34, 29-35, 9 (DK 59 B 4b).</ref>. Le fragment B4a est encore plus explicite : « Il est juste de penser qu'il y avait dans toutes les choses qui étaient rassemblées beaucoup de choses de toutes sortes, et des semences de toutes choses, possédant des formes et des couleurs et des saveurs de toute espèce »<ref>Anaxagore, fragment B4a, cité par Simplicius, ''Commentaire sur la Physique'', 34, 18-29 (DK 59 B 4a).</ref>. La nature exacte de ces semences a fait l'objet de débats considérables parmi les commentateurs. Gregory Vlastos a proposé que σπέρμα soit un terme technique introduit par Anaxagore pour désigner un agrégat infinitésimal contenant tous les ingrédients, mais dans lequel un seul prédomine<ref>Gregory Vlastos, 1950, p. 338-342 ; cf. également J. E. Raven, « The Basis of Anaxagoras' Cosmology », ''Classical Quarterly'', vol. 4, 1954, p. 123-137.</ref>. David Lloyd a suggéré que les semences soient des portions pures (ou quasi-pures) d'opposés<ref>David Lloyd, « Anaxagoras on Life and Mind », ''Phronesis'', vol. 14, 1969, p. 246-251, note 1.</ref>. Une position intermédiaire, défendue par Malcolm Schofield, David Sedley, Patricia Curd et Daniel Gershenson, suggère que les semences doivent être comprises littéralement comme des semences biologiques ordinaires, c'est-à-dire des graines de plantes et des semences animales<ref>Malcolm Schofield, 1980, p. 119-132 ; David Sedley, 2007, p. 24-26 ; Patricia Curd, 2007, essai 2 ; Daniel E. Gershenson et Daniel A. Greenberg, ''Anaxagoras and the Birth of Scientific Method'', New York, Blaisdell, 1964, p. 15-17.</ref>. Cette dernière interprétation présente plusieurs avantages. Elle ne fait pas violence au langage : lorsqu'Anaxagore parle de σπέρματα, il utilise le terme ordinaire pour « semences » sans lui donner un sens technique inhabituel. Elle explique la diversité infinie des semences mentionnée dans B4b. Elle est en outre corroborée par des témoignages anciens sur la biologie d'Anaxagore : Théophraste rapporte qu'« Anaxagore dit que l'air contient des semences de toutes choses, et que celles-ci, lorsqu'elles sont emportées avec l'eau, engendrent les plantes »<ref>Théophraste, ''Causes des plantes'', I, 5, 2 (DK 59 A 117).</ref>. De même, Hippolyte rapporte qu'« au commencement, les animaux naquirent de l'humide, du chaud et du terreux, puis plus tard les uns des autres »<ref>Hippolyte, ''Réfutation de toutes les hérésies'', I, 8, 12 (DK 59 A 42).</ref>. == L'état originel : tout ensemble == Le traité d'Anaxagore s'ouvrait par l'une des déclarations les plus célèbres et les plus discutées de la philosophie présocratique : « Toutes choses étaient ensemble » (ὁμοῦ πάντα χρήματα ἦν, fragment B1)<ref>Anaxagore, fragment B1, cité par Simplicius, ''Commentaire sur la Physique'', 155, 23-26 (DK 59 B 1). Diogène Laërce, II, 6, rapporte qu'Anaxagore « commença son traité d'une manière très attrayante ».</ref>. Cette formule programmatique, placée en position d'ouverture, exprime la thèse cosmogonique fondamentale d'Anaxagore concernant l'état primordial de l'univers. Plusieurs commentateurs, notamment G. E. L. Owen, ont souligné que la formulation d'Anaxagore constitue une réponse directe et délibérée à Parménide<ref>G. E. L. Owen, « The Place of the Timaeus in Plato's Dialogues », ''Classical Quarterly'', vol. 3, 1953, p. 79-95 ; repris dans ''Logic, Science and Dialectic'', Londres, Duckworth, 1986, p. 65-84.</ref>. Là où Parménide avait affirmé que l'être « est maintenant, tout ensemble, un, continu » (νῦν ἔστιν ὁμοῦ πᾶν, ἕν, συνεχές)<ref>Parménide, fragment B8, 5-6 (DK 28 B 8).</ref>, Anaxagore proclame que « toutes choses étaient ensemble ». Parménide affirmait l'unicité, la continuité, l'éternité présente et l'immobilité de l'être ; Anaxagore lui oppose la pluralité, la diversibilité infinie, l'existence passée et le devenir cosmogonique<ref>Malcolm Schofield, 1980, p. 64-65 ; Patricia Curd, 1998, p. 123-142.</ref>. === La description du mélange originel === Le fragment B1, dont Simplicius nous dit qu'il se trouvait près du début du traité d'Anaxagore, fournit une description plus complète de cet état primordial : <blockquote>Toutes choses étaient ensemble, illimitées et en multitude et en petitesse, car le petit aussi était illimité. Et toutes choses étant ensemble, rien n'était manifeste en raison de la petitesse. Car l'air et l'éther recouvraient toutes choses, tous deux étant illimités ; car ce sont eux qui sont les plus grands dans la totalité des choses, et en multitude et en grandeur.<ref>Anaxagore, fragment B1, cité par Simplicius, ''Commentaire sur la Physique'', 155, 23-157, 4 (DK 59 B 1).</ref></blockquote> Ce passage dense pose plusieurs problèmes interprétatifs considérables qui ont occupé les commentateurs depuis l'Antiquité. Quatre caractéristiques principales du mélange originel y sont énoncées : toutes choses étaient ensemble ; elles étaient illimitées en multitude et en petitesse ; rien n'était manifeste en raison de la petitesse ; l'air et l'éther recouvraient toutes choses. L'expression « illimitées en multitude et en petitesse » a suscité d'intenses débats interprétatifs. Deux lectures principales s'affrontent, que Malcolm Schofield a désignées respectivement comme l'interprétation « particulaire » et l'interprétation « proportionnelle »<ref>Malcolm Schofield, 1980, p. 70-99.</ref>. L'interprétation particulaire comprend « illimitées en multitude » comme signifiant qu'il existait un nombre infini de choses distinctes dans le mélange originel<ref>Gregory Vlastos, 1950, p. 31-57 ; W. K. C. Guthrie, 1965, p. 277-285 ; David Sider, 2005, p. 56-62.</ref>. L'interprétation proportionnelle, en revanche, refuse de comprendre le mélange originel comme une collection de particules discrètes : « illimitées en petitesse » signifierait plutôt que chaque ingrédient était présent dans le mélange en une proportion infiniment petite par rapport à la totalité<ref>Malcolm Schofield, 1980, p. 75-89 ; Colin Strang, 1963, p. 101-118 ; Jonathan Barnes, 1982, p. 39-53.</ref>. Le débat entre ces deux interprétations n'est pas résolu, et chacune présente des avantages et des difficultés<ref>Pour une discussion équilibrée des deux positions, voir Patricia Curd, 2007, essai 4, p. 192-213 ; Daniel Graham, 2006, p. 137-152.</ref>. === L'imperceptibilité du mélange === La troisième caractéristique du mélange originel est son indistinction : « rien n'était manifeste » (οὐδὲν ἔνδηλον ἦν). Anaxagore explique cette imperceptibilité par deux facteurs complémentaires : « en raison de la petitesse » (ὑπὸ σμικρότητος), et parce que « l'air et l'éther recouvraient toutes choses » (πάντα γὰρ ἀὴρ καὶ αἰθὴρ κατεῖχε). L'air (ἀήρ) désigne ici, conformément à l'usage ionien archaïque, une substance sombre, humide, froide et dense<ref>Anaximène, fragments DK 13 A 7, B 2 ; cf. Charles Kahn, ''Anaximander and the Origins of Greek Cosmology'', New York, Columbia University Press, 1960, p. 133-162 ; Daniel Graham, 2006, p. 93-102.</ref>. L'éther (αἰθήρ), en revanche, désigne la substance lumineuse, chaude, sèche et rare<ref>Anaxagore, B15. Cf. W. K. C. Guthrie, 1965, p. 301-304 ; Malcolm Schofield, 1980, p. 81-83.</ref>. Ces deux substances, affirme Anaxagore, « sont les plus grandes dans la totalité des choses, et en multitude et en grandeur ». Cela signifie qu'elles étaient présentes dans le mélange originel en proportions largement supérieures à tous les autres ingrédients. Le fragment B4b confirme cette description : <blockquote>Mais avant que ces choses ne fussent séparées, lorsque toutes choses étaient ensemble, aucune couleur n'était manifeste. Car le mélange de toutes choses l'empêchait : celui du sec et de l'humide, du chaud et du froid, du lumineux et de l'obscur, ainsi que d'une grande quantité de terre présente et de semences illimitées en multitude, ne se ressemblant en rien les unes aux autres.<ref>Anaxagore, fragment B4b (DK 59 B 4b).</ref></blockquote> Ce passage confirme que l'indistinction du mélange originel n'était pas due à l'absence des ingrédients, mais à leur mélange si intime que leurs caractéristiques respectives se neutralisaient mutuellement. === L'immobilité originelle === Plusieurs témoignages anciens rapportent qu'avant l'intervention du Noûs, le mélange universel était au repos<ref>Aristote, ''Physique'', VIII, 1, 250b24-26 (DK 59 A 64).</ref>. Cette immobilité primordiale pose un problème philosophique considérable : si le mélange était éternellement au repos, qu'est-ce qui a pu le mettre en mouvement ? Anaxagore répond en postulant l'existence du Noûs (Νοῦς, Intellect ou Esprit), une entité distincte de toutes les substances matérielles, qui possède le pouvoir d'initier le mouvement<ref>Anaxagore, B12.</ref>. Mais cette réponse soulève elle-même de nouvelles difficultés, qui seront examinées plus loin. === L'étendue du mélange originel === Le fragment B1 affirme que l'air et l'éther « tous deux étaient illimités » (ἄμφω ἄπειρα ἐόντα), et le fragment B2 précise : « L'air et l'éther se séparent de la multitude environnante, et la multitude environnante est illimitée en quantité »<ref>Anaxagore, fragment B2 (DK 59 B 2).</ref>. Ces affirmations suggèrent que le mélange originel était spatialement infini<ref>Aristote, ''Physique'', III, 4, 203a19-23 (DK 59 A 43).</ref>. Le fragment B12 indique que « le Noûs commença à exercer son pouvoir à partir d'un petit commencement, puis la rotation s'étendit sur une région plus grande, et s'étendra sur une région plus grande encore »<ref>Anaxagore, B12 (DK 59 B 12).</ref>. Cela suggère que le processus cosmogonique, bien qu'il soit en cours depuis un temps considérable, n'a pas encore affecté la totalité du mélange infini. Cette conception d'un univers partiellement ordonné, où la cosmogonie est encore en cours dans les régions périphériques tandis que notre monde déjà structuré occupe une région centrale, est l'une des idées les plus originales d'Anaxagore<ref>W. K. C. Guthrie, 1965, p. 327-331 ; Patricia Curd, 2007, essai 5, p. 214-237 ; Daniel Graham, 2006, p. 148-152.</ref>. == Le Noûs : l'Intellect cosmique == Le fragment B12 d'Anaxagore, le plus long et le plus célèbre de tous les fragments conservés, est entièrement consacré au Noûs (Νοῦς, « Intellect » ou « Esprit »). Ce passage, d'une grandeur solennelle et d'une intensité remarquable, constitue l'un des textes les plus puissants de toute la prose grecque archaïque<ref>Malcolm Schofield, ''An Essay on Anaxagoras'', Cambridge, Cambridge University Press, 1980, p. 3-32 ; Karl Deichgräber, « Anaxagoras Stil », ''Philologus'', vol. 87, 1933, p. 15-26.</ref>. Dans ce fragment, Anaxagore expose sa doctrine du Noûs comme principe du mouvement cosmogonique et source d'ordre dans l'univers. Le Noûs représente l'innovation philosophique la plus originale d'Anaxagore<ref>W. K. C. Guthrie, 1965, p. 272-279 ; Diogène Laërce, II, 6 (DK 59 A 1), rapporte qu'Anaxagore était surnommé « Monsieur Intellect » (ὁ Νοῦς) en raison de l'importance centrale qu'il donnait à cette notion.</ref>. Il convient d'emblée de préciser, afin d'éviter un contresens répandu dans la littérature secondaire ancienne comme moderne, que le Noûs d'Anaxagore est d'abord une ''cause motrice'' du cosmos : il initie et contrôle le mouvement rotatoire qui produit la séparation des ingrédients à partir du mélange originel. Anaxagore ne dit nulle part, dans les fragments conservés, que l'Intellect ordonne les choses ''parce qu'il serait meilleur qu'elles soient ainsi''. Or, c'est précisément cette affirmation que Socrate et Platon auraient voulu trouver chez le philosophe de Clazomènes, et dont ils lui reprocheront ensuite l'absence dans le passage célèbre du ''Phédon'' (97b-98c). La lecture proprement « téléologique » du Noûs, qui en fait une cause finale organisant le monde selon la Raison du Bien, est donc une reconstruction rétrospective, due à Platon puis à Aristote, et répercutée par toute une tradition doxographique postérieure. Elle projette sur Anaxagore les exigences explicatives du platonisme et de l'aristotélisme, exigences qu'Anaxagore ne partage pas sous cette forme. Plus fondamentalement encore, appliquer sans précaution aux présocratiques la distinction aristotélicienne des quatre causes (matérielle, formelle, efficiente, finale) relève d'un anachronisme conceptuel. Cette distinction est une construction d'Aristote, élaborée dans la ''Physique'' et la ''Métaphysique'' pour penser son propre rapport critique à ses prédécesseurs. La plupart des penseurs antérieurs à Aristote, Anaxagore compris, ne disposent pas d'un tel vocabulaire et n'organisent pas leur réflexion autour de cette quadripartition. Le Noûs d'Anaxagore ne peut être intégralement rangé dans aucune des quatre catégories aristotéliciennes : il est quelque chose comme une cause motrice doublée d'un principe ordonnateur, sans que cet ordre implique nécessairement une référence à un bien objectif. Il est donc plus juste de parler, comme le font les spécialistes contemporains, d'une fonction kinétique et cognitive du Noûs, plutôt que d'y voir la première formulation d'une téléologie rigoureuse<ref>Sur ce point, voir Patricia Curd, « Anaxagoras », ''Stanford Encyclopedia of Philosophy'', 2007 (révision substantielle 2019), section sur le Noûs ; Malcolm Schofield, 1980, p. 55-70 ; James Lesher, « Mind's Knowledge and Powers of Control in Anaxagoras », ''Phronesis'', vol. 40, 1995, p. 125-142. Sur l'anachronisme que représente l'application des quatre causes aristotéliciennes aux physiciens présocratiques, voir l'article « Presocratic Philosophy », ''Stanford Encyclopedia of Philosophy'', éd. Daniel Graham, 2019. Cf. également Christian Vassallo, « Nous, Motion, and Teleology in Anaxagoras », ''Oxford Studies in Ancient Philosophy'', vol. 50, 2016, p. 1-32, qui défend une lecture téléologique minimale et nuancée, restée minoritaire.</ref>. === La séparation du Noûs d'avec toutes choses === Le fragment B12 s'ouvre par une affirmation qui constitue la thèse fondamentale d'Anaxagore concernant le Noûs : <blockquote>Les autres choses ont une part de tout, mais le Noûs est illimité et autonome, et il n'a été mélangé à aucune chose, mais il existe seul, lui-même par lui-même.<ref>Anaxagore, fragment B12, cité par Simplicius, ''Commentaire sur la Physique'', 156, 13-15 (DK 59 B 12).</ref></blockquote> Cette phrase affirme que le Noûs constitue une exception au principe universel « tout est dans tout ». Tandis que toutes les substances matérielles contiennent en elles-mêmes des portions de toutes les autres substances, le Noûs, lui, demeure entièrement pur et séparé<ref>Anaxagore, B11 : « Dans toute chose il y a une part de toute chose, excepté le Noûs ; et il y a certaines choses dans lesquelles il y a aussi du Noûs ».</ref>. Trois attributs sont explicitement prédiqués du Noûs : il est « illimité » (ἄπειρον), « autonome » (αὐτοκρατές), et « non mélangé à aucune chose ». Anaxagore justifie cette séparation par un argument remarquable : <blockquote>Car s'il n'existait pas par lui-même, mais s'il avait été mélangé à quelque autre chose, il participerait de toutes les choses, s'il avait été mélangé à quoi que ce soit. Car dans toute chose il y a une part de toute chose, comme je l'ai dit précédemment. Et les choses mélangées avec lui l'empêcheraient, de sorte qu'il ne dominerait aucune chose de la même manière qu'il la domine en fait, étant seul par lui-même.<ref>Anaxagore, B12, lignes 156, 15-20.</ref></blockquote> L'argument procède ainsi : si le Noûs était mélangé à quoi que ce soit, il contiendrait une part de tout ; les substances mélangées l'empêcheraient d'exercer son pouvoir de contrôle ; or le Noûs exerce effectivement ce pouvoir ; donc le Noûs n'est mélangé à aucune chose<ref>Malcolm Schofield, 1980, p. 12-14 ; Jonathan Barnes, 1982, p. 375-377.</ref>. Plusieurs lectures de la prémisse cruciale, c'est-à-dire de la raison pour laquelle le mélange empêcherait l'action du Noûs, ont été proposées et ne sont pas incompatibles entre elles<ref>Patricia Curd, 2007, essai 5, p. 220-225 ; Christian Vassallo, « Nous, Motion, and Teleology in Anaxagoras », ''Oxford Studies in Ancient Philosophy'', vol. 50, 2016, p. 1-32, aux pages 8-18.</ref>. === Les attributs du Noûs === Après avoir établi la séparation du Noûs, Anaxagore énonce une série d'attributs qui caractérisent sa nature. Le style employé ici est celui de la « prédication solennelle » (feierliche Prädikation), identifié par Karl Deichgräber comme caractéristique du style hymnico-religieux archaïque<ref>Karl Deichgräber, 1933, p. 16-22 ; Eduard Norden, ''Agnostos Theos'', Leipzig, Teubner, 1913, p. 3-29 ; Malcolm Schofield, 1980, p. 4-9.</ref> : <blockquote>Car il est le plus fin de toutes choses et le plus pur, et il possède toute connaissance à l'égard de toute chose et il a la plus grande force ; et toutes les choses qui ont une âme, les plus grandes comme les plus petites, toutes le Noûs les domine.<ref>Anaxagore, B12, lignes 156, 20-24.</ref></blockquote> Le premier attribut, qui qualifie le Noûs de « plus fin » et « plus pur » de toutes choses, a suscité des interprétations divergentes depuis l'Antiquité. Certains y voient l'affirmation, encore en gestation conceptuelle, de l'immatérialité du Noûs<ref>Aristote, ''De l'âme'', III, 4, 429a18-24 ; W. K. C. Guthrie, 1965, p. 278-279.</ref> ; d'autres, en s'appuyant sur le fait qu'Anaxagore utilise l'adjectif λεπτός ailleurs pour décrire l'eau de mer, soutiennent que ces termes doivent être pris en un sens physique : le Noûs serait alors une substance matérielle d'une extrême finesse et d'une grande pureté, proche des réalités les plus ténues du monde sensible<ref>Théophraste, dans Simplicius, ''Commentaire sur la Physique'', 27, 2-3 (DK 59 A 41) ; John Burnet, 1930, p. 268-269 ; Daniel Gershenson et Daniel Greenberg, ''Anaxagoras and the Birth of Scientific Method'', New York, Blaisdell, 1964, p. 27-33.</ref>. Une position médiane suggère qu'Anaxagore n'avait pas encore développé le concept d'incorporéité dans sa pleine rigueur conceptuelle, qui suppose une distinction nette du matériel et de l'immatériel élaborée plus tard par Platon, mais qu'il cherchait néanmoins à exprimer, avec les ressources linguistiques dont il disposait, l'idée que le Noûs est d'une nature fondamentalement différente de toutes les autres substances<ref>Malcolm Schofield, 1980, p. 18-22.</ref>. Le deuxième attribut, qui concerne la connaissance, affirme que le Noûs « possède toute connaissance à l'égard de toute chose » : il s'agit ici d'une forme d'omniscience cosmique. Le troisième, qui concerne la puissance, précise que le Noûs « a la plus grande force », cette force étant liée à sa connaissance selon un schéma que l'on retrouvera chez Aristote et qui fait de la puissance l'envers opératif du savoir<ref>Malcolm Schofield, 1980, p. 22-24.</ref>. Le quatrième attribut, qui concerne le contrôle exercé par le Noûs sur tous les êtres vivants, est cohérent avec le fragment B11, selon lequel il y a du Noûs dans certaines choses, c'est-à-dire dans les êtres animés<ref>Anaxagore, B11. Cf. Malcolm Schofield, 1980, p. 25-27 ; Patricia Curd, 2007, essai 5, p. 225-230.</ref>. === Le rôle cosmogonique du Noûs === Après avoir décrit la nature du Noûs, Anaxagore expose son rôle dans la cosmogonie : <blockquote>Et le Noûs a dominé la révolution entière, de sorte qu'elle a commencé à tourner au commencement. Et d'abord elle a commencé à tourner à partir d'une petite région, mais elle tourne sur une région plus grande, et elle tournera sur une région plus grande encore. Et toutes les choses qui étaient mélangées ensemble et séparées et distinguées, toutes le Noûs les a connues. Et toutes les choses qui devaient être, celles qui étaient, celles qui sont maintenant et celles qui seront, toutes le Noûs les a mises en ordre, et aussi cette révolution dans laquelle tournent maintenant les astres et le soleil et la lune et l'air et l'éther qui sont en train d'être séparés.<ref>Anaxagore, B12, lignes 156, 24-157, 3.</ref></blockquote> Ce passage affirme trois choses concernant l'activité cosmogonique du Noûs. D'abord, l'Intellect initie un mouvement de révolution (περιχώρησις) dans le mélange originel, jusqu'alors immobile. Ensuite, ce mouvement, commencé dans une petite région, s'est étendu progressivement et continue de s'étendre, ce qui implique que la cosmogonie n'est pas un événement ponctuel passé, mais un processus encore en cours dans les régions périphériques du mélange infini. Enfin, c'est ce mouvement qui a produit la séparation (ἀπόκρισις) et la distinction (διάκρισις) des ingrédients, donnant naissance au cosmos ordonné que nous observons<ref>Simplicius, ''Commentaire sur la Physique'', 300, 31-301, 1 ; Aristote, ''Physique'', VIII, 1, 250b24-252a5 (DK 59 A 64).</ref>. Le mécanisme cosmogonique proprement dit est d'ordre mécanique : c'est le mouvement rotatoire qui, par sa force centrifuge, sépare les substances denses des substances rares<ref>Anaxagore, B12, B13, B15, B16.</ref>. Le Noûs n'intervient donc pas directement dans chaque détail de la cosmogonie : il initie le mouvement rotatoire, et celui-ci produit ensuite mécaniquement la séparation et la réorganisation des substances. Cette répartition des rôles entre un principe moteur intelligent et un processus mécanique explique pourquoi Platon et Aristote pourront reprocher à Anaxagore de « laisser faire » la matière après avoir introduit l'Intellect : à leurs yeux, introduire une cause intelligente sans lui confier l'organisation détaillée du monde revient à lui refuser son rôle véritable<ref>Malcolm Schofield, 1980, p. 27-32 ; Daniel Graham, 2006, p. 148-152.</ref>. Le texte affirme cependant aussi que « le Noûs a mis en ordre » (διεκόσμησε νοῦς) toutes choses, passées, présentes et futures. Le verbe διακοσμεῖν signifie « mettre en ordre » ou « arranger ». Il ne faut pas en conclure trop vite à une téléologie au sens fort, comme si les choses étaient disposées en vue du bien : Anaxagore ne fournit pas, dans les fragments qui nous sont parvenus, un tel principe évaluatif. Le Noûs connaît et dispose, il est à la fois intelligent et ordonnateur, mais rien dans les textes n'indique qu'il ordonne les choses ''parce qu'elles seraient ainsi meilleures''. C'est précisément ce point qui sera au cœur de la critique platonicienne dans le ''Phédon'' et qu'il faut examiner avec soin<ref>Christian Vassallo, 2016, a défendu l'idée qu'il y aurait malgré tout une dimension téléologique faible chez Anaxagore ; cette lecture reste minoritaire et contestée. Voir au contraire la synthèse de Patricia Curd, ''SEP'' 2007 (révision substantielle 2019).</ref>. === La critique platonicienne et aristotélicienne === Dans le ''Phédon'', Platon fait raconter par Socrate sa déception à la lecture du livre d'Anaxagore : <blockquote>Un jour, j'entendis quelqu'un lire dans un livre d'Anaxagore, disant que c'est l'Intellect qui met tout en ordre et qui est la cause de toutes choses. Je fus ravi de cette cause, et il me sembla qu'il était en quelque sorte bon que l'Intellect fût la cause de tout ; et je pensai que, s'il en est ainsi, l'Intellect qui met tout en ordre doit tout ordonner et disposer chaque chose de la manière qui est la meilleure. [...] Mais cette merveilleuse espérance, mon ami, me fut enlevée lorsque, progressant dans ma lecture, je vis que cet homme ne fait aucun usage de l'Intellect, qu'il ne lui attribue aucune responsabilité dans la mise en ordre des choses, mais qu'il allègue comme causes l'air, l'éther, l'eau et beaucoup d'autres choses absurdes.<ref>Platon, ''Phédon'', 97b-98c (DK 59 A 47).</ref></blockquote> Ce passage est capital, et il faut en saisir exactement la portée pour éviter le contresens le plus tenace de la tradition exégétique. Socrate ne dit pas qu'Anaxagore avait effectivement proposé une explication par le « meilleur » et qu'il y aurait manqué dans le détail : il dit qu'il ''espérait'' trouver une telle explication, et qu'il fut déçu de ne pas la trouver. La formule « doit tout ordonner et disposer chaque chose de la manière qui est la meilleure » exprime donc l'attente socratique, c'est-à-dire ce que Socrate aurait voulu lire, non la doctrine effective d'Anaxagore. La nuance est décisive. Le texte d'Anaxagore, dans les fragments que nous possédons, affirme que le Noûs connaît toutes choses et qu'il les met en ordre par l'intermédiaire du tourbillon cosmogonique. Il n'affirme pas que cet ordre soit le meilleur possible, ni que le Noûs vise le bien en produisant cet ordre. C'est Socrate qui, lisant Anaxagore, projette ses propres attentes philosophiques : si le monde est ordonné par un Intellect, pense Socrate, alors il doit l'être en vue du bien, puisqu'un Intellect rationnel ne peut que vouloir le meilleur. Cette inférence paraît évidente à Socrate, mais elle n'est pas anaxagoréenne. La lecture qui fait du Noûs d'Anaxagore une « cause téléologique » ou une « cause finale » est, par conséquent, une reconstruction rétrospective qui projette sur le Clazoménien les exigences platoniciennes (le Bien comme cause) puis aristotéliciennes (la cause finale comme l'une des quatre causes)<ref>Malcolm Schofield, 1980, p. 55-70 ; James Lesher, 1995, p. 125-142 ; Patricia Curd, ''SEP'', 2007 (révision substantielle 2019).</ref>. Il faut ici distinguer deux choses qui sont souvent confondues : d'une part, l'attribution au Noûs d'un rôle moteur et cognitif, qui est effectivement anaxagoréenne ; d'autre part, l'attribution au Noûs d'un principe évaluatif selon lequel le monde serait disposé en vue du meilleur, qui ne l'est pas. Le reproche socratique ne consiste donc pas à accuser Anaxagore d'incohérence interne (avoir posé une téléologie puis l'avoir abandonnée), mais à regretter qu'il n'ait pas poussé sa pensée jusqu'à la téléologie que Socrate lui aurait souhaitée. La différence est subtile mais philosophiquement essentielle : elle marque le lieu précis où la pensée présocratique cède la place à la pensée classique. Aristote reprend et durcit la critique dans la ''Métaphysique'' : <blockquote>Anaxagore utilise l'Intellect comme un ''deus ex machina'' pour la fabrication du monde ; et quand il est embarrassé pour expliquer pourquoi quelque chose est nécessairement ainsi, il le fait intervenir. Mais dans tous les autres cas, il allègue comme causes toutes sortes de choses plutôt que l'Intellect.<ref>Aristote, ''Métaphysique'', I, 4, 985a18-21 (DK 59 A 47).</ref></blockquote> Le reproche d'Aristote, comme celui de Socrate-Platon, présuppose un idéal explicatif téléologique qui n'est pas celui d'Anaxagore. Il ne faut donc pas conclure qu'Anaxagore « introduit le Noûs comme cause téléologique puis échoue à l'utiliser » : il introduit le Noûs comme cause motrice et ordonnatrice, et ses critiques l'accusent de ne pas avoir ''aussi'' développé une explication par le meilleur qu'eux attendent. Cette distinction entre la doctrine effective d'Anaxagore et la doctrine que ses successeurs auraient voulu lire chez lui commande toute l'interprétation correcte de son héritage : l'histoire de la téléologie philosophique ne commence pas, en toute rigueur, avec Anaxagore, mais avec la déception philosophique de Socrate face à Anaxagore, puis avec la construction proprement platonicienne du Démiurge et aristotélicienne du Premier Moteur. === Synthèse : l'innovation du Noûs === L'introduction du Noûs par Anaxagore constitue une innovation philosophique à plusieurs titres. Premièrement, Anaxagore est, parmi les penseurs grecs dont nous avons conservé les doctrines, le premier à poser explicitement l'existence d'une entité qui, bien qu'elle agisse sur la matière, n'est mélangée à aucune substance matérielle<ref>W. K. C. Guthrie, 1965, p. 278-279 ; Daniel Gershenson et Daniel Greenberg, 1964, p. 27-33.</ref>. Cette conception préparera, sans y être pour autant équivalente, les doctrines ultérieures de l'âme immatérielle chez Platon et de l'intellect séparé chez Aristote<ref>Platon, ''Phédon'', 78b-84b ; Aristote, ''De l'âme'', III, 5, 430a10-25. Cf. Edward Hussey, ''The Presocratics'', Londres, Duckworth, 1972, p. 138-141.</ref>. Deuxièmement, Anaxagore identifie une cause unique pour le mouvement cosmique et l'ordre qui en résulte<ref>Aristote, ''Métaphysique'', I, 3, 984b15-20, qualifie cette innovation de « sobre ».</ref>. En désignant le principe cosmique par le terme Νοῦς, mot habituellement associé à l'intelligence et à la pensée, Anaxagore suggère que l'ordre du monde n'est pas aveugle : il y a dans le cosmos quelque chose d'intelligent qui connaît et qui dispose. C'est cette suggestion qui sera reprise et radicalisée par Socrate, Platon et Aristote, au prix d'une transformation dont il faut reconnaître qu'elle va au-delà de ce qu'affirme Anaxagore lui-même<ref>Malcolm Schofield, 1980, p. 3-32 ; W. K. C. Guthrie, 1965, p. 327-331.</ref>. == La cosmogonie et la cosmologie == La cosmogonie et la cosmologie d'Anaxagore constituent l'application de ses principes métaphysiques. Dans ces domaines, Anaxagore se montre à la fois héritier de la tradition ionienne et novateur, proposant des explications naturalistes des phénomènes célestes et météorologiques<ref>W. K. C. Guthrie, ''A History of Greek Philosophy'', vol. II, Cambridge, Cambridge University Press, 1965, p. 301-331 ; Daniel Gershenson et Daniel Greenberg, ''Anaxagoras and the Birth of Scientific Method'', New York, Blaisdell, 1964, p. 34-55.</ref>. === Le mouvement rotatoire cosmogonique === Le processus cosmogonique commence lorsque le Noûs initie un mouvement de rotation (περιχώρησις) dans le mélange originel<ref>Anaxagore, fragment B12 (DK 59 B 12).</ref>. Ce mouvement rotatoire ne doit pas être conçu comme une simple rotation uniforme de l'ensemble du mélange, mais comme un tourbillon (δῖνος) ou un vortex dont la vitesse et l'étendue augmentent progressivement<ref>Aristote, ''Du Ciel'', II, 13, 295a9-14 (DK 59 A 88).</ref>. Anaxagore affirme que ce mouvement initial était d'une rapidité extraordinaire : « Rien de ce qui existe maintenant chez les hommes n'est aussi rapide, mais [il était] certainement plusieurs fois plus rapide »<ref>Anaxagore, fragment B9 (DK 59 B 9).</ref>. Le mécanisme de la séparation cosmogonique est mécanique. Le mouvement rotatoire produit une force centrifuge qui pousse les substances rares vers la périphérie et attire les substances denses vers le centre<ref>Anaxagore, B12, B15 ; Aristote, ''Du Ciel'', III, 2, 300b1-8 (DK 59 A 88).</ref>. Le fragment B15 décrit ce processus : <blockquote>Le dense et l'humide et le froid et l'obscur se rassemblèrent ici, là où maintenant est la terre, tandis que le rare et le chaud et le sec se retirèrent vers les régions lointaines de l'éther.<ref>Anaxagore, fragment B15 (DK 59 B 15).</ref></blockquote> Ce processus de séparation n'est jamais achevé. Conformément au principe que « rien n'est complètement séparé » (fragment B8), la rotation continue indéfiniment à produire des séparations et des mélanges partiels<ref>Anaxagore, B8, B12.</ref>. === La formation de la terre === Au centre du tourbillon cosmique, les substances denses, humides, froides et obscures se sont concentrées pour former la terre<ref>Anaxagore, B15 ; Aristote, ''Du Ciel'', III, 2, 300b8-16 (DK 59 A 88).</ref>. Selon Anaxagore, la terre a la forme d'un disque plat<ref>Hippolyte, ''Réfutation de toutes les hérésies'', I, 8, 3 (DK 59 A 42) ; Aristote, ''Du Ciel'', II, 13, 294b13-15 (DK 59 A 88).</ref>, conception traditionnelle dans la cosmologie ionienne<ref>Charles Kahn, ''Anaximander and the Origins of Greek Cosmology'', New York, Columbia University Press, 1960, p. 76-116 ; Daniel Graham, 2006, p. 93-102.</ref>. Anaxagore répond à la question de la stabilité de la terre en affirmant qu'elle demeure immobile parce qu'elle repose sur l'air (ἀήρ) qui la supporte<ref>Aristote, ''Du Ciel'', II, 13, 294b13-21 (DK 59 A 88) : « Anaxagore dit que la terre demeure immobile en raison de son égalité et de la grandeur, car elle ne coupe pas l'air mais le couvre comme un couvercle ».</ref>. Anaxagore aurait même effectué des démonstrations expérimentales avec des clepsydres pour montrer que l'air possède une résistance élastique capable de supporter des corps<ref>Aristote, ''Physique'', IV, 6, 213a22-27 (DK 59 A 68) ; Daniel Gershenson et Daniel Greenberg, 1964, p. 40-43.</ref>. === La formation des corps célestes === Les corps célestes, soleil, lune et étoiles, se sont formés à partir des substances rares, chaudes et sèches projetées vers la périphérie par la force du tourbillon cosmique<ref>Anaxagore, B15 ; Hippolyte, DK 59 A 42.</ref>. Selon cette théorie, les astres ne sont pas des êtres divins mais des masses de pierre ou de métal incandescent, rougies par leur mouvement rapide à travers l'éther<ref>Platon, ''Apologie de Socrate'', 26d (DK 59 A 35) ; Hippolyte, DK 59 A 42. Cette thèse est l'une de celles qui fonderont, selon Plutarque, les accusations d'impiété contre Anaxagore.</ref>. Anaxagore soutenait que le soleil est une masse de pierre ou de métal incandescent<ref>Platon, ''Apologie'', 26d (DK 59 A 35) ; Hippolyte, DK 59 A 42 ; Diogène Laërce, II, 8 (DK 59 A 1) ; Aétius, II, 20, 6 (DK 59 A 72).</ref>. Quant à sa taille, Anaxagore estimait qu'« il est plus grand que le Péloponnèse »<ref>Aétius, II, 21, 3 (DK 59 A 72) ; Plutarque, ''Vie de Périclès'', 6, 2 (DK 59 A 1).</ref>, affirmation qui devait paraître extravagante aux Grecs de son époque, habitués à voir dans le soleil un astre de dimensions modestes. Anaxagore sous-estimait bien sûr très considérablement la taille réelle du soleil, mais l'audace consistait à oser le comparer à une portion de la terre grecque plutôt qu'à un simple disque lumineux. La lune, selon Anaxagore, est elle aussi un corps rocheux, semblable à la terre<ref>Platon, ''Apologie'', 26d ; Hippolyte, DK 59 A 42.</ref>. Contrairement au soleil, la lune ne produit pas sa propre lumière : elle brille par réflexion de la lumière solaire<ref>Plutarque, ''Contre Colotès'', 1116a-b (DK 59 A 77) ; Hippolyte, DK 59 A 42. L'attribution exclusive de cette découverte à Anaxagore doit être nuancée : certains témoignages anciens la rapportent également à Parménide (DK 28 B 14-15), et la question de la priorité reste discutée. Voir Daniel Graham, ''Science before Socrates'', 2006, p. 115-116.</ref>. Cette thèse permit à Anaxagore, qu'il en soit ou non le premier découvreur, d'expliquer correctement les phases lunaires et la mécanique des éclipses<ref>Hippolyte, DK 59 A 42 ; Aétius, II, 29, 6 (DK 59 A 77).</ref>. Une éclipse de lune se produit lorsque la terre s'interpose entre le soleil et la lune, projetant son ombre sur celle-ci<ref>Hippolyte, DK 59 A 42. Cf. Dirk Couprie, « Anaxagoras on the Milky Way and Lunar Eclipses », ''Rhizomata'', vol. 5, 2017, p. 127-147.</ref>. Une éclipse de soleil se produit inversement lorsque la lune s'interpose entre le soleil et la terre<ref>Hippolyte, DK 59 A 42 ; Plutarque, ''Vie de Périclès'', 35, 2 (DK 59 A 18).</ref>. Ces explications, fondées sur une compréhension correcte de la géométrie des positions relatives du soleil, de la terre et de la lune, représentent une avancée considérable dans l'histoire de l'astronomie grecque<ref>W. K. C. Guthrie, 1965, p. 313-316 ; Daniel Graham, 2006, p. 149-150.</ref>. Selon la tradition doxographique, Anaxagore aurait même prédit une éclipse solaire<ref>Plutarque, ''Vie de Périclès'', 35, 2 (DK 59 A 18). La tradition évoque plusieurs éclipses possibles au V{{e}} siècle av. J.-C., sans que l'on puisse identifier avec certitude celle dont il s'agit. Les historiens modernes sont pour la plupart sceptiques quant à la possibilité qu'Anaxagore ait pu effectuer une prédiction précise, faute d'un modèle astronomique suffisamment développé. Cf. W. K. C. Guthrie, 1965, p. 314, note 1 ; Daniel Graham, 2006, p. 150, note 25.</ref>. Anaxagore soutenait enfin que la surface de la lune présente des irrégularités analogues à celles de la terre, montagnes et vallées, intuition que les observations télescopiques confirmeront deux millénaires plus tard<ref>Aétius, II, 30, 2 (DK 59 A 77).</ref>. La Voie lactée s'explique selon Anaxagore par l'ombre que projette la terre dans l'espace : dans les régions du ciel situées dans l'ombre de la terre, le soleil ne peut éclairer les étoiles ; celles-ci deviennent donc toutes visibles, même les plus faibles<ref>Aristote, ''Météorologiques'', I, 8, 345a25-31 (DK 59 A 80). Cf. Dirk Couprie, 2017.</ref>. === Le météorite d'Aigos Potamos === L'événement qui contribua à établir la réputation d'Anaxagore fut la chute d'un météorite de grande taille à Aigos Potamos, sur la rive européenne de l'Hellespont, vers 467 avant notre ère<ref>Pline l'Ancien, ''Histoire naturelle'', II, 149 (DK 59 A 11) ; Plutarque, ''Vie de Lysandre'', 12 (DK 59 A 12) ; Diogène Laërce, II, 10 (DK 59 A 1).</ref>. Selon les témoignages anciens, Anaxagore aurait prédit cette chute. Les historiens modernes sont divisés sur cette question : certains pensent qu'il s'agit d'une légende élaborée après coup, d'autres estiment qu'Anaxagore avait peut-être observé qu'un objet céleste se fragmentait<ref>Daniel W. Graham et Eric Hintz, « Anaxagoras and the Comet », ''Apeiron'', vol. 40, 2007, p. 1-20 ; Evangelos Th. Theodossiou et al., « The Fall of a Meteorite at Aegos Potami in 467/6 BC », ''Journal of Astronomical History and Heritage'', vol. 5, 2002, p. 135-140.</ref>. Quoi qu'il en soit, la chute du météorite fut associée au nom d'Anaxagore et parut confirmer sa théorie selon laquelle les corps célestes sont faits de pierre. === Météorologie === Anaxagore consacra une partie considérable de son traité à l'explication des phénomènes météorologiques. Les nuages se forment par évaporation de l'eau sous l'effet de la chaleur solaire<ref>Aétius, III, 4, 1 (DK 59 A 82).</ref>. La pluie provient de la condensation de la vapeur d'eau contenue dans les nuages<ref>Anaxagore, fragment B16 (DK 59 B 16).</ref>. La formation de la grêle posait un problème particulier : comment de la glace peut-elle se former en été ? Anaxagore proposa une explication ingénieuse : lors des journées très chaudes, des courants d'air ascendants peuvent pousser les nuages à des altitudes très élevées, où l'air est suffisamment froid pour que l'eau gèle<ref>Aétius, III, 4, 1 (DK 59 A 84) ; Aristote, ''Météorologiques'', I, 12, 348b23-349a11 (critique de la théorie d'Anaxagore).</ref>. Cette théorie, bien que partiellement erronée dans ses détails, témoigne d'une compréhension correcte du principe de convection. Le tonnerre et l'éclair sont causés, selon Anaxagore, par la chute de l'éther dans les nuages<ref>Aétius, III, 3, 3 (DK 59 A 84) ; Hippolyte, DK 59 A 42.</ref>. Cette explication reconnaît correctement que l'éclair précède le tonnerre, la vue étant plus rapide que l'ouïe<ref>Sénèque, ''Questions naturelles'', II, 22 (citant Anaxagore).</ref>. Les tremblements de terre sont causés, selon Anaxagore, par de l'éther chaud piégé sous la surface de la terre<ref>Aristote, ''Météorologiques'', II, 7, 365a19-21 (DK 59 A 89).</ref>. === Hydrologie et géologie === Anaxagore proposa une explication de la crue annuelle du Nil : les crues estivales sont causées par la fonte des neiges dans les régions montagneuses situées à la source du fleuve<ref>Diodore de Sicile, I, 38, 4 (attribution explicite à Anaxagore) ; Daniel Gershenson et Daniel Greenberg, 1964, p. 54.</ref>. Cette explication est essentiellement correcte. La mer, selon Anaxagore, existait dès le début, mais sa salinité actuelle provient de l'évaporation de l'eau douce sous l'effet du soleil<ref>Hippolyte, DK 59 A 42.</ref>. === Synthèse : la cosmologie naturaliste d'Anaxagore === La cosmologie d'Anaxagore se caractérise par trois traits fondamentaux. Premièrement, l'unité de la nature : Anaxagore affirme que les corps célestes sont constitués des mêmes substances que la terre et obéissent aux mêmes lois physiques<ref>Hippolyte, DK 59 A 42 ; Daniel Gershenson et Daniel Greenberg, 1964, p. 23-26, 47-48.</ref>. Il n'existe pas de différence ontologique entre le monde sublunaire et le monde supralunaire, contrairement à ce qu'affirmera plus tard Aristote<ref>Aristote, ''Du Ciel'', I, 2-3, 268b11-270b25.</ref>. Deuxièmement, l'explication mécanique : tous les phénomènes cosmologiques et météorologiques sont expliqués par des processus physiques (rotation, séparation par densité, évaporation, condensation), sans recours à des agents divins<ref>Daniel Gershenson et Daniel Greenberg, 1964, p. 23-33.</ref>. Troisièmement, l'usage systématique de l'analogie : Anaxagore explique les phénomènes cosmiques par analogie avec des phénomènes terrestres observables<ref>Daniel Gershenson et Daniel Greenberg, 1964, p. 7-12.</ref>. Ces traits donnent à la cosmologie d'Anaxagore un caractère naturaliste marqué, qui représente une étape importante dans le développement d'une explication physique de la nature. Il convient toutefois de ne pas surestimer sa portée : parler d'Anaxagore comme d'un « fondateur de la méthode scientifique » (selon une expression qu'on trouve parfois dans la littérature) relève d'une certaine emphase rétrospective, qu'il vaut mieux tempérer en parlant plutôt d'un jalon dans une longue histoire où se combinent intuitions fécondes et erreurs caractéristiques de l'époque. == La physiologie et la biologie == Bien qu'Anaxagore soit surtout connu pour ses théories cosmologiques et météorologiques, les témoignages anciens indiquent qu'il consacra aussi une partie considérable de son traité à l'explication des phénomènes biologiques et physiologiques<ref>Daniel Gershenson et Daniel Greenberg, ''Anaxagoras and the Birth of Scientific Method'', New York, Blaisdell, 1964, p. 55-57 ; W. K. C. Guthrie, ''A History of Greek Philosophy'', vol. II, Cambridge, Cambridge University Press, 1965, p. 316-320.</ref>. === La théorie de la nutrition === L'une des questions biologiques les plus importantes qu'Anaxagore chercha à élucider est celle de la nutrition : comment l'alimentation se transforme-t-elle en chair, en os, en cheveux et en toutes les autres parties du corps ? Selon les témoignages d'Aristote et de la tradition doxographique, Anaxagore partait de l'observation que les êtres humains et les animaux se nourrissent d'aliments relativement simples (pain, eau) et que de ces aliments proviennent pourtant toutes les parties complexes et diversifiées de leur corps<ref>Simplicius, ''Commentaire sur la Physique'', 27, 2-11 (DK 59 A 45) : « Car comment, disait-il, des cheveux pourraient-ils provenir de ce qui n'est pas cheveu, et de la chair de ce qui n'est pas chair ? ». Cf. Aétius, I, 3, 5 (DK 59 A 46) ; Lucrèce, ''De la nature'', I, 834-838.</ref>. Cette observation posait un problème philosophique considérable au regard de l'interdit parménidien : il semble en effet qu'une substance nouvelle (la chair) naisse à partir d'une substance qui n'était pas chair (le pain), ce qui contredit le principe « rien ne naît de ce qui n'est pas ». La réponse d'Anaxagore était cohérente avec sa métaphysique générale : le pain doit déjà contenir de la chair, du sang, des os, des cheveux, et toutes les autres substances corporelles, bien que ces constituants y soient présents en quantités si infimes qu'ils demeurent imperceptibles<ref>Simplicius, ''Commentaire sur la Physique'', 460, 4-12 (DK 59 A 45).</ref>. Lorsque nous mangeons du pain, le corps extrait du pain les particules de chair qu'il contient déjà, et les ajoute à la chair existante<ref>Aristote, ''Génération des animaux'', I, 18, 723a6-11 (DK 59 A 45).</ref>. Cette théorie soulève évidemment d'autres difficultés : comment le corps sait-il extraire précisément les particules de chair du pain, et les diriger vers les muscles plutôt que vers les os ? Anaxagore attribuait cette fonction au Noûs présent dans chaque organisme vivant<ref>Cf. section « Le Noûs : l'Intellect cosmique ». Daniel Gershenson et Daniel Greenberg, 1964, p. 27-33, 55-56.</ref>. === La théorie de la perception sensorielle === Anaxagore élabora aussi une théorie originale de la perception sensorielle, fondée sur le principe que « le semblable n'est pas affecté par le semblable, mais les contraires sont affectés les uns par les autres »<ref>Théophraste, ''De Sensibus'', 27 (DK 59 A 92) ; Aristote, ''De l'âme'', III, 3, 427a21-26 (DK 59 A 94).</ref>. Ce principe constituait une réponse directe aux théories de ses prédécesseurs, notamment Empédocle, qui soutenait que la perception se produit par similitude<ref>Théophraste, ''De Sensibus'', 1-2 (DK 31 A 86).</ref>. Selon Anaxagore, pour qu'une perception ait lieu, il doit exister une différence entre l'organe sensoriel et l'objet perçu<ref>Théophraste, ''De Sensibus'', 27-28 (DK 59 A 92).</ref>. Nous ne sentons pas la température de l'air lorsqu'elle est exactement égale à celle de notre peau ; c'est seulement lorsqu'il existe une différence que nous percevons le chaud ou le froid<ref>Théophraste, ''De Sensibus'', 29 (DK 59 A 92).</ref>. Une conséquence remarquable de cette théorie est qu'Anaxagore considérait que toute perception s'accompagne nécessairement de douleur ou d'un certain désagrément (λύπη)<ref>Théophraste, ''De Sensibus'', 29 (DK 59 A 92). Cf. W. K. C. Guthrie, 1965, p. 319 ; Inna Kupreeva, « Sensing the World », dans ''Physis and Psyche in Plato and Aristotle'', Londres, Bloomsbury, 2024, p. 95-114.</ref>. === La reproduction et l'embryologie === Anaxagore proposa en outre des théories sur la reproduction et le développement embryonnaire. Selon les témoignages anciens, il soutenait que le sexe de l'enfant est déterminé par le père seul, et non par la mère<ref>Aétius, V, 7, 1 (DK 59 A 107) ; Hippolyte, DK 59 A 42.</ref>. Cette théorie n'était pas entièrement originale, puisque des idées similaires avaient été proposées par Parménide et d'autres penseurs antérieurs<ref>Aétius, V, 7, 1 (DK 28 A 52-54). Cf. Ursula Mittwoch, « Sex Determination », ''EMBO Reports'', vol. 14, 2013, p. 588-592 ; Oliver Kember, « Anaxagoras' Theory of Sex Differentiation and Heredity », ''Phronesis'', vol. 18, 1973, p. 1-14.</ref>. === La génération des animaux et des plantes === Selon les témoignages doxographiques, Anaxagore distinguait entre la zoogonie originelle, c'est-à-dire la première génération des animaux, et la reproduction ultérieure par semences<ref>Hippolyte, DK 59 A 42 ; Aétius, V, 19, 4 (DK 59 A 42).</ref>. Dans la zoogonie originelle, les premiers animaux émergèrent de la terre encore chaude et humide, grâce aux semences (σπέρματα) contenues dans l'air et l'éther<ref>Théophraste, dans Simplicius, ''Commentaire sur la Physique'', 27, 2-4.</ref>. En ce qui concerne les plantes, Anaxagore affirmait qu'elles possèdent une âme (ψυχή) et un intellect (νοῦς)<ref>Aétius, V, 26, 4 (DK 59 A 117).</ref>. Cette conclusion découlait de ses observations du comportement des plantes : elles se tournent vers la lumière du soleil, étendent leurs racines vers l'eau<ref>Aristote, ''De l'âme'', I, 5, 410b27-411a7. Cf. Inna Kupreeva, 2024, p. 98-103.</ref>. === Observations biologiques diverses === Les sources anciennes conservent enfin quelques observations biologiques isolées d'Anaxagore. Il soutenait, par exemple, que les belettes sont les seuls animaux qui donnent naissance par la bouche<ref>Aristote, ''Histoire des animaux'', VI, 32, 580a15-17 (DK 59 A 114) ; Plutarque, ''Œuvres morales'', 975F-976A (DK 59 A 114).</ref>. Il était parvenu à cette conclusion erronée parce qu'il avait observé des belettes femelles transportant leurs petits dans leur gueule immédiatement après la mise bas<ref>Plutarque, ''Œuvres morales'', 975F (DK 59 A 114).</ref>. De même, il affirmait que les corbeaux et les ibis s'accouplent par le bec<ref>Aristote, ''Histoire des animaux'', V, 2, 539b31-540a1 (DK 59 A 114).</ref>. Ces erreurs montrent les limites de sa méthode empirique. === L'homme et les animaux === Selon Anaxagore, ce qui distingue l'homme du reste du règne animal est principalement l'une des distinctions physiologiques les plus évidentes : les mains de l'homme<ref>Aristote, ''Parties des animaux'', IV, 10, 687a7-12 (DK 59 A 102). Aristote critique cette position et affirme au contraire que l'homme a des mains parce qu'il est le plus intelligent.</ref>. Ce sont les mains, selon Anaxagore, qui permettent à l'homme de surpasser les animaux dans les compétences manipulatrices et les capacités techniques. == L'influence et la postérité == Anaxagore occupe une place importante dans l'histoire de la philosophie antique. Introducteur à Athènes de la tradition ionienne de recherche naturaliste, il constitue un jalon dans le développement de la pensée grecque du V{{e}} siècle<ref>Diogène Laërce, II, 6 (DK 59 A 1) ; W. K. C. Guthrie, ''A History of Greek Philosophy'', vol. II, Cambridge, Cambridge University Press, 1965, p. 266-267.</ref>. Les lignes qui suivent s'efforcent de décrire son influence avec la prudence philologique nécessaire : il est facile, en traitant des présocratiques, de céder à la tentation des grandes filiations, alors que la documentation réelle invite souvent à plus de retenue. === La transmission immédiate : Archélaos et le cercle socratique === Le premier vecteur de l'influence d'Anaxagore fut son disciple direct Archélaos d'Athènes (parfois dit aussi « de Milet »), qui enseigna à Athènes après le départ de son maître pour Lampsaque<ref>Diogène Laërce, II, 16 (DK 60 A 1) ; Simplicius, ''Commentaire sur la Physique'', 27, 23 (DK 60 A 7). La formule que l'on rencontre parfois, selon laquelle Archélaos aurait « succédé à Anaxagore à Lampsaque », n'est pas documentée par les sources : Archélaos est attesté comme actif à Athènes, où il aurait été le maître de Socrate. Sur ce point, voir Gábor Betegh, « Archelaus on Cosmogony and the Origins of Social Institutions », ''Oxford Studies in Ancient Philosophy'', vol. 51, 2016, p. 1-40.</ref>. Selon plusieurs témoignages anciens, Archélaos aurait été le maître de Socrate, ce qui établit un lien biographique, quoique indirect, entre Anaxagore et le fondateur de la philosophie morale<ref>Diogène Laërce, II, 16 (DK 60 A 1). Ion de Chios rapporte que le jeune Socrate voyagea avec Archélaos à Samos (DK 60 A 3).</ref>. Archélaos semble avoir développé et modifié certaines doctrines de son maître, en particulier en appliquant les principes anaxagoréens à l'éthique et aux institutions sociales, orientation qui anticipe peut-être le tournant moral pris ensuite par Socrate<ref>Diogène Laërce, II, 16 (DK 60 A 1) ; Hippolyte, DK 60 A 4 ; Gábor Betegh, 2016.</ref>. === L'influence sur Socrate : espoirs et déceptions === La relation entre Anaxagore et Socrate a probablement été indirecte, médiée par la lecture du livre. Dans le ''Phédon'', Platon fait raconter par Socrate sa rencontre avec la pensée d'Anaxagore, rencontre qui suscita d'abord un enthousiasme puis une déception<ref>Platon, ''Phédon'', 97b-98c (DK 59 A 47).</ref>. Comme on l'a souligné plus haut, cette déception porte sur une attente proprement socratique, celle d'une explication par le « meilleur », qu'Anaxagore n'avait pas, à proprement parler, formulée dans les termes que Socrate aurait voulus. Cette critique conduisit Socrate à se tourner vers la philosophie morale et la recherche de la cause finale, c'est-à-dire du Bien qui rendrait compte de l'ordre du monde<ref>Platon, ''Phédon'', 99c-100a. Cf. David Sedley, « Teleology and Myth in the ''Phaedo'' », ''Proceedings of the Boston Area Colloquium in Ancient Philosophy'', vol. 5, 1989, p. 359-383.</ref>. L'idée qu'un principe rationnel puisse gouverner l'univers, idée que Socrate trouve chez Anaxagore et qu'il juge insuffisamment exploitée, a pu orienter le projet socratique sans qu'il faille pour autant présenter Anaxagore comme sa cause nécessaire<ref>David Sider, « Anaxagoras, Socrates, and the History of "Philosophy" », ''Research Bulletin of the CHS'', 2016 ; W. K. C. Guthrie, 1965, p. 327-331.</ref>. Dans l'''Apologie'', l'accusation portée contre Socrate inclut l'imputation de théories cosmologiques manifestement inspirées d'Anaxagore, ce qui montre l'association étroite entre les deux penseurs dans l'esprit des Athéniens, indépendamment de la distance philosophique réelle qui les sépare<ref>Platon, ''Apologie de Socrate'', 26d (DK 59 A 35). Cf. Gregory Vlastos, ''Socrates: Ironist and Moral Philosopher'', Ithaca, Cornell University Press, 1991, p. 293-297.</ref>. Xénophon présente pour sa part Socrate comme mettant en garde ses disciples contre l'étude des phénomènes célestes à la manière d'Anaxagore, ce qui laisse entendre que Socrate lui-même s'était explicitement démarqué de la philosophie naturelle anaxagoréenne<ref>Xénophon, ''Mémorables'', IV, 7, 6 (DK 59 A 47).</ref>. === L'appropriation platonicienne : du Noûs au Démiurge === Platon s'empare de la doctrine anaxagoréenne du Noûs et la transforme, en la radicalisant, en une cosmologie téléologique pleinement articulée. Dans le ''Timée'', Platon présente le Démiurge, cet artisan divin qui façonne le monde sensible à l'image des Formes éternelles, comme une figure qu'on peut lire en dialogue avec le Noûs anaxagoréen<ref>Platon, ''Timée'', 29a-30c, 47e-48a. Cf. Glenn Morrow, « Necessity and Persuasion in Plato's ''Timaeus'' », ''Philosophical Review'', vol. 59, 1950, p. 147-163 ; Luc Brisson, ''Le Même et l'Autre dans la structure ontologique du Timée de Platon'', Paris, Klincksieck, 1974, p. 87-125.</ref>. Il convient toutefois d'être prudent. La téléologie platonicienne va en effet bien au-delà de ce qu'affirmait Anaxagore : le Démiurge contemple les Formes éternelles pour façonner le monde, et cet arrière-plan métaphysique d'essences intelligibles n'a pas d'équivalent chez le Clazoménien, dont le Noûs demeure un principe moteur et cognitif, mais non un principe qui « voit » des réalités intelligibles préalables à son action. Dans le ''Philèbe'', Platon affirme explicitement sa dette envers Anaxagore en déclarant que « l'Intellect est roi du ciel et de la terre »<ref>Platon, ''Philèbe'', 28c (DK 59 A 47). Cf. également ''Cratyle'', 413c.</ref>, reprenant ainsi la doctrine anaxagoréenne selon laquelle « le Noûs domine tout »<ref>Anaxagore, B12 (DK 59 B 12).</ref>. Dans les ''Lois'', Platon fait l'éloge des « anciens » qui ont découvert que « l'Intellect gouverne toutes choses », allusion probable à Anaxagore<ref>Platon, ''Lois'', X, 897b-c, XII, 967b-c. Cf. Malcolm Schofield, 1980, p. 55-70.</ref>. L'influence d'Anaxagore sur Platon est donc réelle, mais elle passe par une transformation considérable de la doctrine originelle : le Noûs anaxagoréen, simple cause motrice, devient chez Platon un Intellect qui contemple le Bien et façonne le monde selon le meilleur ordre possible. Le passage d'Anaxagore à Platon est celui qui fait naître, en toute rigueur, la tradition téléologique de la philosophie occidentale. === La critique aristotélicienne === Aristote, tout en reconnaissant l'importance historique d'Anaxagore, fut l'un de ses critiques les plus sévères. Dans la ''Métaphysique'', il salue Anaxagore comme « un homme sobre parmi des bavards »<ref>Aristote, ''Métaphysique'', I, 3, 984b15-20 (DK 59 A 43).</ref>, louant son introduction du Noûs comme cause de l'ordre cosmique. Mais cette louange est immédiatement suivie d'une critique : Anaxagore « utilise l'Intellect comme un ''deus ex machina'' »<ref>Aristote, ''Métaphysique'', I, 4, 985a18-21 (DK 59 A 47).</ref>. Comme on l'a vu, cette critique présuppose un idéal téléologique qui n'est pas celui d'Anaxagore lui-même. Aristote adopte en revanche, en le reformulant, le terme technique homéomère (ὁμοιομερής) pour désigner les substances anaxagoréennes, bien qu'il soit probable qu'Anaxagore lui-même n'ait jamais utilisé ce mot<ref>Cf. Malcolm Schofield, 1980, p. 87-108.</ref>. La distinction que la tradition anaxagoréenne a léguée, entre substances homéomères (chair, os, sang) et substances anhoméomères (main, pied, visage), devient ainsi fondamentale dans la philosophie naturelle aristotélicienne, où elle servira à articuler l'analyse des parties du vivant<ref>Aristote, ''De la génération et de la corruption'', I, 1, 314a20-b1 ; ''Parties des animaux'', II, 1, 646a12-24.</ref>. === L'héritage dans la philosophie hellénistique et romaine === Après Aristote, la pensée d'Anaxagore continua d'exercer une influence diffuse. Les Stoïciens s'approprièrent certains aspects de sa doctrine du Noûs pour développer leur propre concept du Logos universel qui pénètre et gouverne toute la nature<ref>Diogène Laërce, VII, 134-139 (SVF II, 634) ; Cicéron, ''De la nature des dieux'', I, 11, 27 ; II, 8, 23. Cf. A. A. Long et D. N. Sedley, ''The Hellenistic Philosophers'', vol. I, Cambridge, Cambridge University Press, 1987, p. 268-274.</ref>. Le pneuma stoïcien présente des analogies avec le Noûs anaxagoréen, bien que les Stoïciens aient rejeté le dualisme matière/esprit d'Anaxagore en faveur d'un matérialisme intégral<ref>Michael J. White, « Stoic Natural Philosophy », dans Brad Inwood (éd.), ''The Cambridge Companion to the Stoics'', Cambridge, Cambridge University Press, 2003, p. 124-152.</ref>. Les Épicuriens, en revanche, rejetèrent la doctrine anaxagoréenne. Lucrèce critique explicitement Anaxagore dans le ''De natura rerum''<ref>Lucrèce, ''De la nature'', I, 830-920 (DK 59 A 44). Cf. David Sedley, ''Lucretius and the Transformation of Greek Wisdom'', Cambridge, Cambridge University Press, 1998, p. 24-33.</ref>. Dans la tradition néoplatonicienne, Anaxagore fut lu à travers le prisme de Platon. Simplicius, au VI{{e}} siècle de notre ère, consacra de longs passages de son commentaire sur la ''Physique'' d'Aristote à l'exégèse des fragments d'Anaxagore ; c'est d'ailleurs grâce à ces commentaires que la majeure partie de notre connaissance d'Anaxagore nous est parvenue<ref>Simplicius, ''Commentaire sur la Physique'' (passim).</ref>. === Un héritage à ne pas surinterpréter === Il est tentant de présenter Anaxagore comme un précurseur de la science mécaniste moderne, de l'atomisme, voire de la physique contemporaine. Il faut résister à cette tentation, au moins dans sa forme la plus large. Au XVII{{e}} siècle, certains philosophes mécanistes ont effectivement cité les présocratiques pour légitimer leur programme, mais c'est l'atomisme de Démocrite et de Leucippe, médiatisé par Épicure et par Lucrèce, qui a exercé une influence directe sur la physique corpusculaire naissante de Gassendi, Boyle et Newton. L'influence propre d'Anaxagore sur cette tradition reste, pour l'essentiel, limitée et indirecte : sa doctrine de la divisibilité infinie et du mélange universel s'oppose d'ailleurs aux postulats fondamentaux de l'atomisme classique, et c'est précisément cette opposition qui la rendait peu exploitable pour les mécanistes modernes<ref>Alan Chalmers, « Atomism from the 17th to the 20th Century », ''Stanford Encyclopedia of Philosophy'', 2005 (révisé 2014) ; Andrew Pyle, ''Atomism and its Critics : From Democritus to Newton'', Bristol, Thoemmes Press, 1997.</ref>. On trouve aussi, ici ou là, des rapprochements entre la doctrine anaxagoréenne du « tout dans tout » et certaines idées de la physique moderne : théorie des champs, intrication quantique, non-séparabilité des systèmes physiques. De tels rapprochements, parfois suggérés par des physiciens eux-mêmes (Werner Heisenberg évoque à l'occasion les présocratiques dans ses réflexions philosophiques), peuvent avoir une valeur heuristique ou pédagogique. Ils ne doivent pas pour autant être transformés en affirmations de continuité doctrinale. La physique quantique procède d'un appareil mathématique et expérimental qui n'a aucun équivalent chez les Grecs anciens, et les analogies conceptuelles qu'on peut tracer avec Anaxagore relèvent de la métaphore rétrospective, non de la filiation historique<ref>Werner Heisenberg, ''Physics and Philosophy'', New York, Harper, 1958, p. 62-63, évoque les présocratiques sans établir de filiation précise avec la physique quantique.</ref>. Il a été parfois suggéré, de manière analogue, que les grands théologiens médiévaux aient vu dans le Noûs un précurseur du Dieu créateur et ordonnateur. Cette suggestion demande une prudence particulière. Thomas d'Aquin, Maïmonide et Avicenne s'inscrivent dans une tradition aristotélicienne et néoplatonicienne déjà très élaborée, dans laquelle le Noûs anaxagoréen n'apparaît, quand il est mentionné, qu'à travers la médiation d'Aristote, et le plus souvent pour être critiqué. La théologie médiévale développe sa conception du Dieu créateur à partir de ressources propres (exégèse biblique, coranique ou talmudique, théologie négative néoplatonicienne, métaphysique aristotélicienne de l'acte pur), et non par appropriation directe de la doctrine anaxagoréenne. Il faut donc parler de continuités discrètes dans une histoire complexe, où la figure d'Anaxagore est plus souvent un repoussoir ou une étape dépassée qu'une source vive<ref>Sur la tradition aristotélicienne et néoplatonicienne médiévale, voir Étienne Gilson, ''L'esprit de la philosophie médiévale'', Paris, Vrin, 1932 ; sur la transmission arabe des présocratiques, voir Cristina D'Ancona, « Greek into Arabic: Neoplatonism in Translation », dans P. Adamson et R. C. Taylor (éd.), ''The Cambridge Companion to Arabic Philosophy'', Cambridge, Cambridge University Press, 2005, p. 10-31.</ref>. Une dernière mise en garde concerne la prédiction de l'éclipse et la chute du météorite d'Aigos Potamos, qui ont parfois été présentées comme des triomphes de la « méthode scientifique » naissante. En réalité, les sources qui attribuent à Anaxagore ces prouesses prédictives sont tardives et souvent légendaires ; les historiens des sciences contemporains, comme Daniel Graham ou Geoffrey Lloyd, se montrent prudents, voire sceptiques, sur l'authenticité de ces anticipations. L'importance historique d'Anaxagore ne tient pas à la précision de ses prédictions, mais à la cohérence et à l'ambition explicative de son système naturaliste, qui propose de rendre compte des phénomènes célestes par des principes physiques accessibles à la raison, sans recourir aux figures mythologiques traditionnelles. === Bilan === L'influence d'Anaxagore sur la postérité se caractérise par un contraste fondamental : d'un côté, son introduction du Noûs comme principe cosmique fut saluée comme une avancée majeure par Aristote lui-même, qui loue son caractère « sobre » par contraste avec les rêveries des premiers Ioniens ; de l'autre, son refus (ou son incapacité) à développer une explication par le « meilleur » fut jugée insuffisante par Socrate, Platon et Aristote. Cette dualité traverse toute l'histoire de sa réception : Anaxagore est à la fois le penseur qui a rendu pensable une cause intellectuelle du cosmos, et celui qui a laissé cette cause inemployée au goût de ses successeurs<ref>W. K. C. Guthrie, 1965, p. 327-331 ; Malcolm Schofield, 1980, p. 55-70 ; Daniel Graham, ''Science before Socrates'', Oxford, Oxford University Press, 2006, p. 152-158.</ref>. Cette limitation même fut paradoxalement féconde. En ouvrant une voie sans la parcourir jusqu'au bout, Anaxagore a invité ses successeurs à poursuivre le chemin, chacun à sa manière. Socrate s'est tourné vers la philosophie morale, en cherchant dans le Bien la cause que le Noûs anaxagoréen ne fournissait pas. Platon a développé, dans le ''Timée'' et ailleurs, une cosmologie téléologique dans laquelle le Démiurge contemple les Formes éternelles pour façonner le monde. Aristote a élaboré, contre Platon autant que contre Anaxagore, une doctrine systématique des quatre causes qui intègre la cause finale dans un schéma explicatif unifié. Tous trois ont puisé dans Anaxagore, chacun à sa manière, mais au prix d'une transformation qui leur appartient en propre. On peut donc parler d'une empreinte durable d'Anaxagore sur les orientations ultérieures de la philosophie grecque, sans pour autant soutenir que Socrate, Platon ou Aristote n'auraient pas été ce qu'ils furent sans lui : leurs doctrines ont leurs propres fondements, souvent en réaction à Anaxagore autant qu'en prolongement de lui, et la cause anaxagoréenne n'est, dans leur cas, jamais que partielle. Sur le plan scientifique, l'héritage d'Anaxagore est surtout celui d'un modèle d'explication naturaliste. Il propose des explications des phénomènes célestes et météorologiques en termes de substances et de processus physiques, sans recourir aux agents mythologiques qui peuplaient encore l'imaginaire grec traditionnel. Le soleil n'est plus Hélios mais une pierre incandescente ; la lune n'est plus une déesse mais un corps rocheux qui reçoit la lumière du soleil ; la foudre n'est plus le trait de Zeus mais le produit d'un phénomène atmosphérique. Cet héritage naturaliste n'est pas négligeable, et il a nourri durablement la tradition philosophique et scientifique grecque. Il serait pourtant excessif de lui attribuer à titre principal la fondation d'une « méthode scientifique » au sens moderne : l'élaboration de cette méthode suppose l'invention de la preuve démonstrative, le développement de la mathématisation de la nature, et bien d'autres étapes que la pensée d'Anaxagore n'a pas accomplies<ref>Daniel Gershenson et Daniel Greenberg, 1964, défendent une version forte de la thèse d'Anaxagore comme fondateur de la méthode scientifique, thèse qu'il convient de modérer. Cf. Geoffrey Lloyd, ''Early Greek Science : Thales to Aristotle'', Londres, Chatto & Windus, 1970, pour une perspective plus prudente.</ref>. En définitive, Anaxagore occupe une place singulière dans l'histoire de la philosophie : celle d'un pionnier qui ouvre une voie sans l'explorer entièrement, et qui a légué à ses successeurs à la fois une doctrine (dans ses fragments conservés) et la tâche philosophique de combler ce que cette doctrine laisse ouvert. Cette position intermédiaire entre la cosmologie ionienne, dont il est le dernier grand représentant à Athènes, et la philosophie classique, dont il est l'un des principaux préparateurs, fait d'Anaxagore une figure pivot, dont l'intérêt philosophique propre ne doit pas être dilué dans l'histoire des influences qu'il a exercées. == Notes et références == {{references}} == Bibliographie == === Textes anciens : éditions et traductions === ; Diels, Hermann & Kranz, Walther (éds.) : ''Die Fragmente der Vorsokratiker'', 3 vol., Berlin, Weidmann, 1951-1952 (6{{e}} éd.) : [Édition standard de référence pour les fragments présocratiques, avec le système de numérotation DK (Diels-Kranz) utilisé dans la présente étude] ; Laks, André & Most, Glenn W. (éds.) : ''Early Greek Philosophy'', 9 vol., Loeb Classical Library, Cambridge (Mass.), Harvard University Press, 2016 : [Édition plus récente avec traduction anglaise et nouveau système de numérotation, utile en complément de Diels-Kranz] ; Kirk, G. S., Raven, J. E. & Schofield, M. (éds.) : ''The Presocratic Philosophers: A Critical History with a Selection of Texts'', 2{{e}} édition, Cambridge, Cambridge University Press, 1983 : [Traductions anglaises commentées des fragments] ; Curd, Patricia (éd.) : ''Anaxagoras of Clazomenae: Fragments and Testimonia'', Toronto, University of Toronto Press, 2007 : [Édition critique avec traductions anglaises commentées et analyses détaillées] ; Sider, David (éd.) : ''The Fragments of Anaxagoras: With a Commentary'', Sankt Augustin, Academia Verlag, 2005 : [Édition avec commentaire détaillé] ; Platon : ''Phédon'', trad. fr. Monique Dixsaut, Paris, GF-Flammarion, 1991 : [Dialogue contenant la critique socratique du Noûs d'Anaxagore] ; Platon : ''Apologie de Socrate'', trad. fr. Luc Brisson, Paris, GF-Flammarion, 1997 ; Platon : ''Timée'', trad. fr. Luc Brisson, Paris, GF-Flammarion, 1992 ; Platon : ''Philèbe'', trad. fr. Alfred Diès, Paris, Les Belles Lettres, 1941 ; Platon : ''Lois'', trad. fr. Édouard des Places, Paris, Les Belles Lettres, 1951-1956 ; Aristote : ''Métaphysique'', trad. fr. Jean Tricot, Paris, Vrin, 1933 ; Aristote : ''Physique'', trad. fr. Jean Tricot, Paris, Vrin, 1936 ; Aristote : ''Du Ciel'', trad. fr. Jean Tricot, Paris, Vrin, 1949 ; Aristote : ''Génération et corruption'', trad. fr. Jean Tricot, Paris, Vrin, 1950 ; Aristote : ''Génération des animaux'', trad. fr. Jean Tricot, Paris, Vrin, 1957 ; Aristote : ''Histoire des animaux'', trad. fr. Jean Tricot, Paris, Vrin, 1957 ; Aristote : ''Parties des animaux'', trad. fr. Jean Tricot, Paris, Vrin, 1957 ; Aristote : ''De l'âme'', trad. fr. Richard Bodéüs, Paris, GF-Flammarion, 1993 ; Diogène Laërce : ''Vies et doctrines des philosophes illustres'', sous la dir. de Marie-Odile Goulet-Cazé, Paris, Le Livre de Poche (La Pochothèque), 1999 ; Théophraste : ''De Sensibus'' (''On Sense Perception''), trad. angl. dans Kirk, Raven & Schofield, 1983 ; Simplicius : ''In Aristotelis Physicorum libros commentaria'', éd. Hermann Diels, Berlin, Reimer, 1882-1895 : [Source principale pour la transmission des fragments d'Anaxagore] ; Hippolyte : ''Réfutation de toutes les hérésies'', trad. angl. dans Curd, 2007 ; Lucrèce : ''De la nature'', trad. fr. Alfred Ernout, Paris, Les Belles Lettres, 1920 ; Cicéron : ''De la nature des dieux'', trad. fr. Clara Auvray-Assayas, Paris, Les Belles Lettres, 2002 ; Plutarque : ''Vies parallèles'' (''Vie de Périclès'', ''Vie de Lysandre''), trad. fr. Anne-Marie Ozanam, Paris, Gallimard, Bibliothèque de la Pléiade, 2001 ; Xénophon : ''Mémorables'', trad. fr. Louis-André Dorion et Michele Bandini, Paris, Les Belles Lettres, 2000-2011 === Études modernes : histoire et philosophie antiques === ; Schofield, Malcolm : ''An Essay on Anaxagoras'', Cambridge, Cambridge University Press, 1980 : [Monographie majeure : étude exhaustive de la pensée anaxagoréenne avec analyse textuelle détaillée] ; Curd, Patricia : « Anaxagoras », ''Stanford Encyclopedia of Philosophy'', publié 2007, révision substantielle 2019 : [Synthèse de référence, avec bibliographie à jour] ; Guthrie, W. K. C. : ''A History of Greek Philosophy'', vol. II : ''The Presocratic Tradition from Parmenides to Democritus'', Cambridge, Cambridge University Press, 1965 ; Barnes, Jonathan : ''The Presocratic Philosophers'', 2 vol., Londres, Routledge, 1982 (révisé 2006) ; Kirk, G. S., Raven, J. E. & Schofield, M. : ''The Presocratic Philosophers: A Critical History with a Selection of Texts'', 2{{e}} édition, Cambridge, Cambridge University Press, 1983 ; Vlastos, Gregory : « The Physical Theory of Anaxagoras », ''Philosophical Review'', vol. 59, 1950, p. 31-57 ; Peck, Arthur L. : « Anaxagoras: Predication as a Problem in Physics », ''Classical Quarterly'', vol. 25, 1931, p. 27-37 et p. 112-120 ; Strang, Colin : « The Physical Theory of Anaxagoras », ''Archiv für Geschichte der Philosophie'', vol. 45, 1963, p. 101-118 ; Cornford, F. M. : « Anaxagoras' Theory of Matter », ''Classical Quarterly'', vol. 24, 1930, p. 14-30 ; Graham, Daniel W. : « Was Anaxagoras a Reductionist? », ''Ancient Philosophy'', vol. 24, 2004, p. 1-18 ; Graham, Daniel W. : ''Science before Socrates: Parmenides, Anaxagoras, and the New Astronomy'', Oxford, Oxford University Press, 2006 ; Curd, Patricia : ''The Legacy of Parmenides: Eleatic Monism and Later Presocratic Thought'', Princeton, Princeton University Press, 1998 ; Owen, G. E. L. : « The Place of the Timaeus in Plato's Dialogues », ''Classical Quarterly'', vol. 3, 1953, p. 79-95 ; repris dans ''Logic, Science and Dialectic'', Londres, Duckworth, 1986 ; Raven, J. E. : « The Basis of Anaxagoras' Cosmology », ''Classical Quarterly'', vol. 4, 1954, p. 123-137 ; Kerferd, George B. : « Anaxagoras and the Concept of Matter before Aristotle », ''Bulletin of the John Rylands Library'', vol. 52, 1969, p. 129-143 ; Lloyd, David : « Anaxagoras on Life and Mind », ''Phronesis'', vol. 14, 1969, p. 246-251 ; Deichgräber, Karl : « Anaxagoras Stil », ''Philologus'', vol. 87, 1933, p. 15-26 ; Norden, Eduard : ''Agnostos Theos: Untersuchungen zur Formengeschichte religiöser Rede'', Leipzig, Teubner, 1913 ; Taylor, A. E. : « On the Date of the Trial of Anaxagoras », ''Classical Quarterly'', vol. 11, 1917, p. 81-87 ; Kahn, Charles H. : ''Anaximander and the Origins of Greek Cosmology'', New York, Columbia University Press, 1960 ; Inwood, Brad : « Anaxagoras and Infinite Divisibility », ''Illinois Classical Studies'', vol. 11, 1986, p. 17-33 ; Sedley, David : ''Creationism and Its Critics in Antiquity'', Berkeley, University of California Press, 2007 ; Sedley, David : « Teleology and Myth in the ''Phaedo'' », ''Proceedings of the Boston Area Colloquium in Ancient Philosophy'', vol. 5, 1989, p. 359-383 ; Betegh, Gábor : « Archelaus on Cosmogony and the Origins of Social Institutions », ''Oxford Studies in Ancient Philosophy'', vol. 51, 2016, p. 1-40 ; Sider, David : « Anaxagoras, Socrates, and the History of "Philosophy" », ''Research Bulletin of the Center for Hellenic Studies'', 31 octobre 2016 ; Furley, David L. : ''Two Studies in the Greek Atomists'', Princeton, Princeton University Press, 1967 ; Furley, David L. : « Anaxagoras, Plato and Naming of Parts », dans ''Presocratic Philosophy: Essays in Honour of Alexander Mourelatos'', éd. Victor Caston et Daniel Graham, Aldershot, Ashgate, 2002, p. 119-126 ; Furth, Montgomery : « A Philosophical Hero? Anaxagoras and the Eleatics », ''Oxford Studies in Ancient Philosophy'', vol. 9, 1991, p. 95-129 ; Lesher, James : « Mind's Knowledge and Powers of Control in Anaxagoras », ''Phronesis'', vol. 40, 1995, p. 125-142 ; Marmodoro, Anna : « Anaxagoras's Qualitative Gunk », ''British Journal for the History of Philosophy'', vol. 23, 2015, p. 402-422 ; Marmodoro, Anna & Morison, Benjamin (éds.) : ''Everything in Everything: Anaxagoras's Metaphysics'', Oxford, Oxford University Press, 2019 ; Vassallo, Christian : « Nous, Motion, and Teleology in Anaxagoras », ''Oxford Studies in Ancient Philosophy'', vol. 50, 2016, p. 1-32 === Études modernes : biologie, physiologie et philosophie naturelle === ; Gershenson, Daniel E. & Greenberg, Daniel A. : ''Anaxagoras and the Birth of Scientific Method'', New York, Blaisdell, 1964 : [À utiliser avec précaution : la thèse centrale sur la « naissance de la méthode scientifique » doit être tempérée] ; Meyer, Arthur William : ''Essays on the History of Embryology'', Stanford, Stanford University Press, 1939 ; Preus, Anthony : « The Techne of Nutrition in Ancient Greek Philosophy », ''Apeiron'', vol. 53, 2020, p. 97-124 ; Kember, Oliver : « Anaxagoras' Theory of Sex Differentiation and Heredity », ''Phronesis'', vol. 18, 1973, p. 1-14 ; Mittwoch, Ursula : « Sex Determination: Science & Society Series on Sex and Science », ''EMBO Reports'', vol. 14, 2013, p. 588-592 ; Kupreeva, Inna : « Sensing the World: Humans, Plants, and the Physicality of Life in Early Greek Philosophy », dans ''Physis and Psyche in Plato and Aristotle'', éd. S. D. Kolstrup et T. L. Kind, Londres, Bloomsbury, 2024, p. 95-114 === Études modernes : astronomie, cosmologie et météorologie === ; Theodossiou, Evangelos Th., Dimitrijevic, Milcho S., Mantarakis, Nikos A. & Georgakarakos, Nikolaos I. : « The Fall of a Meteorite at Aegos Potami in 467/6 BC », ''Journal of Astronomical History and Heritage'', vol. 5, 2002, p. 135-140 ; Graham, Daniel W. & Hintz, Eric : « Anaxagoras and the Comet », ''Apeiron'', vol. 40, 2007, p. 1-20 ; Couprie, Dirk L. : « Anaxagoras on the Milky Way and Lunar Eclipses », ''Rhizomata'', vol. 5, 2017, p. 127-147 ; Lloyd, Geoffrey E. R. : ''Early Greek Science: Thales to Aristotle'', Londres, Chatto & Windus, 1970 === Études modernes : influence et réception === ; Vlastos, Gregory : ''Socrates: Ironist and Moral Philosopher'', Ithaca, Cornell University Press, 1991 ; Morrow, Glenn R. : « Necessity and Persuasion in Plato's ''Timaeus'' », ''Philosophical Review'', vol. 59, 1950, p. 147-163 ; Brisson, Luc : ''Le Même et l'Autre dans la structure ontologique du Timée de Platon'', Paris, Klincksieck, 1974 ; Johansen, Thomas Kjeller : ''Plato's Natural Philosophy'', Cambridge, Cambridge University Press, 2004 ; Johansen, Thomas Kjeller : « From Craft to Nature: The Emergence of Natural Teleology », dans ''Plato and Hesiod'', éd. G. R. Boys-Stones et J. H. Haubold, Oxford, Oxford University Press, 2020, p. 100-125 ; Long, A. A. & Sedley, D. N. : ''The Hellenistic Philosophers'', vol. I, Cambridge, Cambridge University Press, 1987 ; White, Michael J. : « Stoic Natural Philosophy », dans ''The Cambridge Companion to the Stoics'', éd. Brad Inwood, Cambridge, Cambridge University Press, 2003, p. 124-152 ; Sedley, David : ''Lucretius and the Transformation of Greek Wisdom'', Cambridge, Cambridge University Press, 1998 ; Chalmers, Alan : « Atomism from the 17th to the 20th Century », ''Stanford Encyclopedia of Philosophy'', 2005 (révisé 2014) ; Pyle, Andrew : ''Atomism and its Critics: From Democritus to Newton'', Bristol, Thoemmes Press, 1997 ; Gilson, Étienne : ''L'esprit de la philosophie médiévale'', Paris, Vrin, 1932 ; Heisenberg, Werner : ''Physics and Philosophy'', New York, Harper, 1958 : [À consulter pour les rapprochements prudents entre présocratiques et physique moderne, à titre d'analogie heuristique] === Instruments de recherche et ressources === ; Curd, Patricia : « Anaxagoras », ''Stanford Encyclopedia of Philosophy'', 2007 (révision substantielle 2019) ; Graham, Daniel W. : « Presocratic Philosophy », ''Stanford Encyclopedia of Philosophy'', 2019 ; ''Oxford Classical Dictionary'' : s.v. « Anaxagoras », diverses éditions : [À consulter pour la mise en garde prudente sur la tradition biographique] === Dictionnaires et encyclopédies === ; Goulet, Richard (éd.) : ''Dictionnaire des philosophes antiques'', vol. I, Paris, CNRS Éditions, 1989 (2{{e}} éd. 2003) : [Entrée détaillée sur Anaxagore avec bibliographie] {{autocat}} [[Catégorie:Philosophe]] {{DEFAULTSORT:Anaxagore}} 09p8wkn3ygogo7f5u09muzlq391vx8y 768162 768154 2026-06-19T05:32:11Z PandaMystique 119061 /* Notes et références */ 768162 wikitext text/x-wiki {{DicoPhilo|Anaxagore de Clazomènes|lecture=oui}} == Vie et contexte historique == {{wikisource|Auteur:Anaxagore_de_Clazomènes|Anaxagore de Clazomènes}} Les données biographiques concernant Anaxagore sont, comme le souligne l'''Oxford Classical Dictionary'', en grande partie « confuses et déroutantes » (''confused and confusing''), et la plupart des anecdotes transmises par la tradition antique doivent être abordées avec une prudence critique. Les récits qui nous sont parvenus proviennent en effet de sources tardives, séparées d'Anaxagore par plusieurs siècles : Plutarque (I{{er}}-II{{e}} siècle ap. J.-C.) dans ses ''Vies parallèles'', Valère Maxime (I{{er}} siècle ap. J.-C.) dans ses ''Faits et dits mémorables'', puis Diogène Laërce (première moitié du III{{e}} siècle ap. J.-C.) dans ses ''Vies et doctrines des philosophes illustres''. Ces auteurs compilent eux-mêmes des traditions doxographiques antérieures, parfois stylisées à des fins rhétoriques ou moralisatrices, parfois clairement légendaires. Anaxagore (en grec ancien Ἀναξαγόρας, « maître de l'assemblée » ou « chef au forum ») naît vers 500 av. J.-C. à Clazomènes, cité grecque d'Ionie située sur la côte occidentale de l'actuelle Turquie, à une trentaine de kilomètres à l'ouest d'Izmir<ref>Diogène Laërce, ''Vies et doctrines des philosophes illustres'', II, 6 (DK 59 A 1). Apollodore d'Athènes, cité par Diogène Laërce, place la naissance d'Anaxagore à la 70{{e}} Olympiade (500-496 av. J.-C.).</ref>. Fils d'Hégésibule (certaines sources mentionnent Eubule), il appartient, selon la tradition ancienne, à une famille aristocratique et aurait possédé un patrimoine important<ref>Diogène Laërce, II, 6-7 ; Valère Maxime, ''Faits et dits mémorables'', VIII, 7, ext. 5.</ref>. Selon Diogène Laërce, Anaxagore aurait abandonné ses biens à ses proches afin de se consacrer entièrement à la philosophie<ref>Diogène Laërce, II, 7 : « Il négligea ses biens par amour de la sagesse. »</ref>. Une autre tradition, rapportée tant par Valère Maxime que par Diogène Laërce, raconte qu'Anaxagore, revenant d'un long voyage, aurait trouvé ses propriétés en ruine et aurait déclaré : « Si cela n'avait pas péri, c'est moi qui aurais péri »<ref>Valère Maxime, ''Faits et dits mémorables'', VIII, 7, ext. 5 ; Diogène Laërce, II, 6-7. Valère Maxime commente la sentence comme exemple de la sagesse la plus parfaite.</ref>. Ces récits, qu'ils soient authentiques ou pour partie légendaires, illustrent l'image qu'Anaxagore a laissée dans la mémoire doxographique : celle du philosophe contemplatif, détaché des affaires domestiques et consacré à l'étude du cosmos. Une anecdote célèbre, rapportée par plusieurs sources anciennes, témoigne de ce détachement. Interrogé sur son attachement à sa patrie, Anaxagore aurait répondu en levant la main vers le ciel : « J'ai un soin extrême de ma patrie », signifiant par là que le véritable philosophe considère l'univers entier comme sa demeure<ref>Plutarque, ''Vie de Périclès'', 4, 3-5 ; Aristote, ''Éthique à Eudème'', 1215b6-8.</ref>. Lorsqu'on lui demanda quel était l'homme le plus heureux, il aurait répondu, sur le même mode paradoxal, qu'aucun de ceux auxquels on songe ordinairement ne saurait prétendre à ce titre, et que le véritable bonheur paraîtrait même étrange à son interlocuteur<ref>Aristote, ''Éthique à Eudème'', 1215b6-8.</ref>. À quelqu'un qui lui demandait encore pour quelle raison on devrait choisir de naître plutôt que de ne pas être, il aurait répondu : « Afin de contempler les cieux et l'ordre de l'univers entier »<ref>Aristote, ''Éthique à Eudème'', 1216a11-14. Cette phrase, qui condense toute une conception de la vie philosophique comme ''theoria'', sera reprise par les moralistes anciens et par la tradition philosophique jusqu'à l'époque romaine.</ref>. === L'arrivée à Athènes et l'activité philosophique === La chronologie exacte de la vie d'Anaxagore demeure l'objet de débats parmi les historiens modernes, en raison de divergences importantes entre les sources anciennes<ref>Leonard Woodbury, « Anaxagoras and Athens », ''Phoenix'', vol. 35, n{{o}} 4, 1981, p. 295-315 ; Jaap Mansfeld, « The Chronology of Anaxagoras' Athenian Period and the Date of His Trial », ''Mnemosyne'', vol. 32-33, 1979-1980, p. 39-69 et p. 85-95 ; Malcolm Schofield, ''An Essay on Anaxagoras'', Cambridge, Cambridge University Press, 1980, p. 33-35.</ref>. Selon la chronologie établie par Apollodore d'Athènes et rapportée par Diogène Laërce, Anaxagore serait arrivé à Athènes vers 480 av. J.-C., à l'âge de vingt ans, au moment des guerres médiques<ref>Diogène Laërce, II, 7. Cette tradition est soutenue par certains chercheurs modernes : Patricia O'Brien, « Anaxagoras and the Diurnal Revolution », ''Phronesis'', vol. 13, 1968, p. 133-143 ; Leonard Woodbury, 1981 ; Daniel Graham, ''Science before Socrates'', Oxford, Oxford University Press, 2006.</ref>. D'autres savants, notamment Jaap Mansfeld, proposent une date plus tardive, vers 456 av. J.-C.<ref>Jaap Mansfeld, 1979-1980 ; cf. également David Sider, ''The Fragments of Anaxagoras'', Sankt Augustin, Academia Verlag, 2005, p. 1-18, pour une discussion approfondie des problèmes chronologiques.</ref>. La question n'est pas définitivement tranchée, mais la majorité des historiens s'accorde sur une période d'activité philosophique à Athènes s'étendant sur près de trente ans, probablement entre 480/456 et 450/437 av. J.-C.<ref>Diogène Laërce, II, 7 ; Malcolm Schofield, 1980, p. 33-35.</ref>. Quelle que soit la date précise de son arrivée, Anaxagore est présenté par la tradition antique comme le premier philosophe à introduire la spéculation cosmologique et la philosophie naturelle ionienne dans la cité athénienne<ref>Clément d'Alexandrie, ''Stromates'', I, 14, 63, 3 (DK 59 A 7) : « Anaxagore transporta d'Ionie à Athènes la philosophie. » Cf. également Plutarque, ''Vie de Périclès'', 4, 2 ; Isocrate, ''Sur l'échange'', 268.</ref>. Athènes, en pleine expansion culturelle et politique après sa victoire sur les Perses à Marathon (490 av. J.-C.) et à Salamine (480 av. J.-C.), deviendra rapidement le centre intellectuel du monde grec. C'est dans ce contexte que la tradition situe l'enseignement d'Anaxagore. La tradition biographique antique, dominée par le récit de Plutarque dans la ''Vie de Périclès'', rapporte qu'Anaxagore se serait lié à Périclès, l'homme d'État athénien qui dominera la vie politique de la cité de 454 à 431 av. J.-C.<ref>Plutarque, ''Vie de Périclès'', 4-5, 16, 32 (DK 59 A 15, A 17). Platon, ''Phèdre'', 269e-270a, évoque également l'influence d'Anaxagore sur l'éloquence de Périclès.</ref>. Selon cette tradition, Anaxagore aurait compté parmi les maîtres intellectuels de Périclès, et le surnom d'« instructeur de Périclès » lui aurait été attaché dès l'Antiquité<ref>Plutarque, ''Vie de Périclès'', 4, 5 ; Diogène Laërce, II, 10, 13. Les instruments de référence modernes (''Oxford Classical Dictionary'', s.v. « Anaxagoras ») restent toutefois prudents sur la portée exacte de cette relation, dont les témoignages sont tardifs.</ref>. Il convient cependant de ne pas transformer cette tradition en déclaration politique publique avérée : les sources dont nous disposons sont tardives, souvent biographiques ou rhétoriques, et la figure de l'« instructeur de Périclès » appartient en partie à la construction doxographique. L'idée que le grand orateur démocratique d'Athènes ait trouvé dans les leçons d'un philosophe naturaliste la source de son éloquence élevée et de son détachement aristocratique correspond à un topos biographique commode, qu'il convient de ne pas surinterpréter en termes de dette intellectuelle publique. Parmi les disciples ou auditeurs d'Anaxagore, les sources anciennes mentionnent aussi le poète tragique Euripide<ref>Diogène Laërce, II, 10 ; Héracléide du Pont, cité par Aulu-Gelle, ''Nuits attiques'', XV, 20 (DK 59 A 17). Certaines idées cosmologiques présentes dans les pièces d'Euripide semblent refléter l'enseignement d'Anaxagore.</ref>, le musicien et sophiste Damon<ref>Plutarque, ''Vie de Périclès'', 4.</ref>, et peut-être Archélaos, qui aurait ensuite été le maître de Socrate<ref>Diogène Laërce, II, 16, 23 (DK 60 A 1, A 4).</ref>. Concernant Socrate lui-même, la question de savoir s'il a personnellement rencontré Anaxagore demeure controversée. Dans le ''Phédon'', Platon fait dire à Socrate qu'il a entendu quelqu'un lire dans le livre d'Anaxagore (la tradition ancienne a identifié ce lecteur à Archélaos)<ref>Platon, ''Phédon'', 97b-99d. L'identité du lecteur n'est pas précisée par Platon, mais la tradition ancienne l'a identifié à Archélaos.</ref>, ce qui suggère que Socrate n'a probablement pas eu de contact direct avec le philosophe de Clazomènes. Dans l'''Apologie'', Platon fait par ailleurs référence au fait que les livres d'Anaxagore étaient en vente pour une drachme à l'orchestre du théâtre<ref>Platon, ''Apologie'', 26d. Cette remarque témoigne de la large diffusion de l'œuvre d'Anaxagore à Athènes à la fin du V{{e}} siècle av. J.-C.</ref>, ce qui indique que ses idées étaient largement connues à Athènes, même en l'absence d'enseignement oral direct. === L'œuvre écrite === Anaxagore a composé un traité intitulé ''Sur la nature'' (Περὶ φύσεως), rédigé en prose ionienne<ref>Diogène Laërce, II, 6 ; Simplicius, ''Commentaire sur la Physique d'Aristote'', 27, 2 (DK 59 A 41).</ref>. Selon les témoignages anciens, il n'aurait écrit qu'un seul livre<ref>Diogène Laërce, I, 16 ; II, 6-7.</ref>, bien que Platon emploie le pluriel τὰ Ἀναξαγόρου βιβλία dans l'''Apologie''<ref>Platon, ''Apologie'', 26d.</ref>. Cette apparente contradiction s'explique probablement par le fait que l'ouvrage, même relativement court, était copié sur plusieurs rouleaux de papyrus, ce qui était l'usage courant à l'époque pour les œuvres en prose. Diogène Laërce rapporte qu'Anaxagore fut le premier à publier un livre contenant des figures et des diagrammes<ref>Diogène Laërce, II, 11.</ref>, détail qui témoigne de la dimension scientifique et pédagogique qu'on lui prêtait dans l'Antiquité tardive. Le traité d'Anaxagore était rédigé dans un style sobre et dense, caractérisé par une prose ionienne archaïsante<ref>Karl Deichgräber, « Anaxagoras Stil », ''Philologus'', vol. 87, 1933, p. 15-26 ; Hermann Fränkel, ''Dichtung und Philosophie des frühen Griechentums'', Munich, C.H. Beck, 1962, p. 529-547.</ref>. Contrairement aux poèmes philosophiques de Parménide et d'Empédocle, rédigés en hexamètres dactyliques à la manière d'Homère ou d'Hésiode, Anaxagore choisit la prose comme véhicule de sa pensée, s'inscrivant ainsi dans la tradition ionienne des philosophes naturalistes inaugurée par Anaximandre et Anaximène. De ce traité, il ne subsiste aujourd'hui qu'une vingtaine de fragments authentiques, principalement conservés par Simplicius de Cilicie (VI{{e}} siècle ap. J.-C.) dans ses commentaires sur Aristote<ref>L'édition de référence des fragments et témoignages demeure celle de Hermann Diels et Walther Kranz, ''Die Fragmente der Vorsokratiker'', 6{{e}} édition, Berlin, Weidmann, 1951-1952, vol. II, p. 5-44 (59 A et B). Une édition plus récente est celle d'André Laks et Glenn Most, ''Early Greek Philosophy'', Loeb Classical Library, 9 vol., Cambridge (Mass.), Harvard University Press, 2016, qui a introduit un nouveau système de numérotation ; éditions et traductions anglaises : Patricia Curd, ''Anaxagoras of Clazomenae : Fragments and Testimonia'', Toronto, University of Toronto Press, 2007 ; David Sider, ''The Fragments of Anaxagoras'', Sankt Augustin, Academia Verlag, 2005.</ref>. Simplicius, conscient de la rareté de l'ouvrage à son époque, prit soin de citer longuement les premières parties du traité, qui exposaient les principes généraux du système<ref>Simplicius, ''Commentaire sur la Physique d'Aristote'', 155, 23-157, 4 (fragments B1-B4) ; 164, 24-166, 1 (fragment B12).</ref>. === Le procès et l'exil === Les circonstances du départ d'Anaxagore d'Athènes et de sa fin de vie sont particulièrement controversées dans les sources anciennes. Diogène Laërce rapporte pas moins de quatre versions contradictoires du procès d'Anaxagore<ref>Diogène Laërce, II, 12-15. Ces quatre récits divergent sur l'identité de l'accusateur, la nature précise des charges, le déroulement du procès et son issue.</ref>. Selon une première version, attribuée à Sotion, Anaxagore aurait été accusé d'impiété (ἀσέβεια) par Cléon pour avoir déclaré que le soleil était une masse de métal incandescent ; Périclès l'aurait défendu, et Anaxagore aurait été condamné à une amende de cinq talents et à l'exil<ref>Sotion, dans Diogène Laërce, II, 12.</ref>. Selon Satyre, l'accusateur aurait été Thucydide (l'adversaire politique de Périclès, et non l'historien), les charges auraient inclus non seulement l'impiété mais aussi la trahison (sympathies pro-perses ou « médisme »), et Anaxagore aurait été condamné à mort par contumace<ref>Satyre, dans Diogène Laërce, II, 12-13.</ref>. Deux autres versions, attribuées respectivement à Hermippe et à Hiéronymos de Rhodes, présentent des variantes sur le rôle de Périclès et l'issue du procès<ref>Hermippe et Hiéronymos de Rhodes, dans Diogène Laërce, II, 13-14.</ref>. Plutarque, dans la ''Vie de Périclès'', fournit une version différente. Selon lui, un devin et politicien athénien nommé Diopeithès aurait fait voter un décret (le « décret de Diopeithès ») autorisant les poursuites judiciaires contre ceux qui ne reconnaissaient pas les dieux ou enseignaient des doctrines sur les phénomènes célestes<ref>Plutarque, ''Vie de Périclès'', 32, 1-2. Ce décret, daté approximativement de 433-432 av. J.-C., aurait visé Anaxagore mais aussi, indirectement, Périclès.</ref>. Selon cette version, Anaxagore aurait été accusé d'impiété pour avoir soutenu que le soleil n'était pas une divinité mais une pierre incandescente, et que la lune était une terre<ref>Plutarque, ''Vie de Périclès'', 32, 2 ; Platon, ''Apologie'', 26d, où Mélètos accuse Socrate de professer les mêmes opinions qu'Anaxagore.</ref>. Grâce à l'intervention de Périclès, Anaxagore aurait échappé à la condamnation à mort mais aurait dû s'exiler d'Athènes<ref>Plutarque, ''Vie de Périclès'', 32, 5.</ref>. L'historicité même de ce procès a été mise en doute par certains historiens modernes, qui soulignent l'absence de témoignages contemporains et les ressemblances troublantes avec le procès de Socrate<ref>J. A. Davison, « Protagoras, Democritus, and Anaxagoras », ''Classical Quarterly'', vol. 3, 1953, p. 33-45, exprime un scepticisme extrême.</ref>. Néanmoins, la plupart des spécialistes admettent aujourd'hui qu'un procès a bien eu lieu, même si les détails précis nous échappent<ref>Leonard Woodbury, 1981 ; Daniel Graham, 2006, p. 311-318, défendent l'historicité du procès tout en reconnaissant les difficultés chronologiques.</ref>. La date du procès demeure elle aussi incertaine : certains savants la placent vers 450 av. J.-C.<ref>Cette date traditionnelle est défendue notamment dans l'''Oxford Classical Dictionary'', 2{{e}} édition, 1970, s.v. « Anaxagoras ».</ref>, d'autres vers 437-436 av. J.-C.<ref>Mansfeld, 1979-1980.</ref>, d'autres encore vers 433-432 av. J.-C.<ref>Woodbury, 1981.</ref>. Quelle que soit la date précise, Anaxagore se retire à Lampsaque, colonie grecque d'Asie Mineure située sur l'Hellespont (l'actuel détroit des Dardanelles), où, selon la tradition, il est accueilli avec honneur<ref>Diogène Laërce, II, 14-15 ; Valère Maxime, ''Faits et dits mémorables'', VIII, 7, ext. 5.</ref>. Il y meurt en 428 av. J.-C., à l'âge de soixante-douze ans selon Apollodore<ref>Apollodore, dans Diogène Laërce, II, 7.</ref>. Les habitants de Lampsaque lui vouent, selon les sources tardives, un culte et célèbrent sa mémoire pendant plus d'un siècle après sa mort. Ils auraient élevé un autel dédié à l'Esprit et à la Vérité (Νοῦς καὶ Ἀλήθεια) en son honneur, et observé l'anniversaire de sa mort comme un jour férié pour les enfants des écoles<ref>Diogène Laërce, II, 15 ; Élien, ''Histoire variée'', VIII, 19 ; Cicéron, ''Tusculanes'', V, 36, 104.</ref>. Une inscription fut placée sur sa tombe, dont le texte exact ne nous est malheureusement pas parvenu, mais qui témoignait, selon Diogène Laërce, de l'estime dans laquelle les citoyens de Lampsaque tenaient le philosophe<ref>Diogène Laërce, II, 15.</ref>. === Portrait et anecdotes === Les sources anciennes ont conservé de nombreuses anecdotes sur Anaxagore qui, même si leur authenticité historique ne peut être garantie, témoignent de l'image du philosophe dans la tradition biographique antique. Galien rapporte qu'Anaxagore, apprenant la mort de son fils, aurait déclaré avec le plus grand calme : « Je savais qu'il était mortel quand je l'ai engendré »<ref>Galien, ''Des opinions d'Hippocrate et de Platon'', IV, 7, 41 (DK 59 A 33).</ref>. Ces récits contribuèrent à faire d'Anaxagore le modèle, dans la tradition, du philosophe détaché des contingences matérielles et consacré à la contemplation de la nature. Dans le ''Phèdre'' de Platon, Socrate attribue l'éloquence de Périclès à l'influence d'Anaxagore, qui lui aurait appris à s'élever au-dessus des préoccupations quotidiennes par la spéculation sur la nature de l'intelligence (νοῦς) et de la folie<ref>Platon, ''Phèdre'', 269e-270a.</ref>. Cette remarque témoigne de la réputation d'Anaxagore dans l'Athènes classique : celle d'un penseur dont les spéculations abstraites et « météorologiques » (au sens ancien de l'étude des phénomènes célestes) pouvaient paraître étranges ou excessives aux yeux du commun, mais qui exerçaient une fascination certaine sur les esprits cultivés. Cette image se reflète jusque dans la comédie d'Aristophane, ''Les Nuées'', où les spéculations cosmologiques tournées en ridicule semblent en partie inspirées par les doctrines d'Anaxagore, bien que ce soit Socrate qui soit présenté sur scène<ref>Aristophane, ''Les Nuées'', passim. Cf. Kenneth Dover, ''Aristophanes Clouds'', Oxford, Clarendon Press, 1968, p. xxxii-xlvii, pour la discussion du rapport entre les théories cosmologiques ridiculisées dans la pièce et celles d'Anaxagore.</ref>. === L'école de Lampsaque === À Lampsaque, Anaxagore fonda ou du moins anima une école philosophique qui continua son enseignement après sa mort<ref>Malcolm Schofield, 1980, p. 1 ; W. K. C. Guthrie, ''A History of Greek Philosophy'', vol. II, Cambridge, Cambridge University Press, 1965, p. 266-267.</ref>. Parmi ses disciples à Lampsaque, les sources mentionnent Métrodore de Lampsaque<ref>Diogène Laërce, II, 17 ; Plutarque, ''Des opinions des philosophes'', 888e (DK 61).</ref>, qui poursuivit et développa les interprétations allégoriques d'Homère dans un esprit anaxagoréen. L'influence de l'école de Lampsaque se prolongea au moins jusqu'à la fin du V{{e}} siècle av. J.-C. Cette présence d'Anaxagore à Lampsaque explique peut-être pourquoi ses idées ont continué à circuler et à être discutées dans le monde grec, malgré son départ d'Athènes et le caractère fragmentaire de la tradition de son œuvre écrite. == Les principes métaphysiques fondamentaux == La philosophie d'Anaxagore se construit en réponse directe aux exigences métaphysiques établies par Parménide d'Élée<ref>Patricia Curd, ''The Legacy of Parmenides: Eleatic Monism and Later Presocratic Thought'', Princeton, Princeton University Press, 1998, p. 123-142 ; Malcolm Schofield, ''An Essay on Anaxagoras'', Cambridge, Cambridge University Press, 1980, p. 27-47.</ref>. Dans son poème philosophique, Parménide avait posé deux principes fondamentaux : « l'être est et ne peut pas ne pas être » (ἔστιν εἶναι) et « le non-être n'est pas et ne peut pas être » (οὐκ ἔστι μὴ εἶναι)<ref>Parménide, fragment B2, DK 28 B 2, 3-5 ; cf. également B6, 1-2 et B8, 1-2.</ref>. De ces prémisses, Parménide concluait que toute génération et toute corruption véritables sont impossibles, car elles impliqueraient un passage de l'être au non-être ou du non-être à l'être, transitions logiquement impossibles puisque le non-être ne peut en aucune manière être<ref>Parménide, B8, 6-21 ; Aristote, ''Physique'', I, 8, 191a23-31.</ref>. Plus encore, Parménide soutenait que l'être véritable devait être un, continu, homogène, immuable et éternel<ref>Parménide, B8, 22-25 : « Il n'est pas divisible, puisqu'il est tout entier semblable » (οὐδὲ διαιρετόν ἐστιν, ἐπεὶ πᾶν ἐστιν ὁμοῖον).</ref>. Anaxagore accepte les principes éléatiques fondamentaux, c'est-à-dire l'impossibilité du passage de l'être au non-être et inversement, mais refuse d'en tirer la conclusion que le monde sensible et le changement sont illusoires<ref>Aristote, ''Métaphysique'', I, 3, 984a11-16 ; Simplicius, ''Commentaire sur la Physique d'Aristote'', 25, 19-26 (DK 59 A 52).</ref>. Selon Simplicius, « Anaxagore de Clazomènes, qui fut un disciple de la philosophie d'Anaximène, fut le premier à s'opposer à Parménide »<ref>Simplicius, ''Commentaire sur la Physique'', 25, 19-21 (DK 59 A 52). L'affirmation qu'Anaxagore fut disciple d'Anaximène est chronologiquement problématique et doit être comprise au sens large d'une appartenance à la tradition ionienne.</ref>. Plutôt que de nier la réalité du changement et de la diversité, Anaxagore cherche à fonder une cosmologie conforme aux exigences parménidiennes tout en rendant compte de la multiplicité et du mouvement observables dans la nature<ref>Malcolm Schofield, 1980, p. 38-42 ; G. E. L. Owen, « Eleatic Questions », ''Classical Quarterly'', vol. 10, 1960, p. 84-102.</ref>. Comme l'a remarqué G. E. L. Owen, la phrase d'ouverture du traité d'Anaxagore, « Toutes choses étaient ensemble », est « manifestement formulée comme une contradiction plate de Parménide sur plusieurs questions majeures »<ref>G. E. L. Owen, « The Place of the Timaeus in Plato's Dialogues », ''Classical Quarterly'', vol. 3, 1953, p. 79-95, cité dans Malcolm Schofield, 1980, p. 64.</ref>. === Le principe de conservation === Le premier principe métaphysique fondamental qu'Anaxagore énonce se trouve dans le fragment B17 : « Les Grecs ne pensent pas correctement au sujet de la génération et de la corruption. Aucune chose ne naît ni ne périt, mais à partir des choses qui sont, il y a mélange et séparation. Ainsi, ils appelleraient correctement la génération "mélange" (σύγκρισις) et la corruption "séparation" (διάκρισις) »<ref>Anaxagore, fragment B17, cité par Simplicius, ''Commentaire sur la Physique'', 163, 20-24 (DK 59 B 17).</ref>. Ce principe de conservation constitue le fondement de toute sa physique et sa réponse directe à l'interdit parménidien. Ce qui apparaît comme génération n'est en réalité qu'un réarrangement d'éléments préexistants qui se mélangent (συμμίσγεται). Ce qui semble être corruption n'est que la dissociation (διακρίνεται) de ces mêmes éléments<ref>Anaxagore, B17 ; cf. également Aristote, ''Génération et corruption'', I, 1, 314a18-20 (DK 59 A 52) : « Anaxagore et d'autres disent que la génération et la corruption sont mélange et séparation. »</ref>. Rien ne naît du néant (ex nihilo nihil fit), rien ne retourne au néant : les composants élémentaires de la réalité existent de toute éternité et demeurent inaltérables dans leur nature propre. Aristote souligne qu'Anaxagore, comme d'autres philosophes naturalistes, fonde explicitement ce principe sur l'axiome parménidien<ref>Aristote, ''Physique'', I, 4, 187a26-31.</ref>. Le principe prend chez Anaxagore une forme plus spécifique encore dans le fragment B10, où il pose la question rhétorique : « Comment le cheveu pourrait-il provenir de ce qui n'est pas cheveu, et la chair de ce qui n'est pas chair ? » (πῶς γὰρ ἂν ἐκ μὴ τριχὸς γένοιτο θρὶξ καὶ σὰρξ ἐκ μὴ σαρκός;)<ref>Anaxagore, fragment B10, conservé dans une scholie à Grégoire de Nazianze (DK 59 B 10).</ref>. Cette formulation, qui deviendra proverbiale dans l'Antiquité, exprime ce que les commentateurs modernes appellent le « principe du semblable par le semblable » (similia similibus) : une substance ne peut provenir que de la même substance, déjà présente sous une forme latente<ref>Aristote, ''Physique'', I, 4, 187a26-29 ; cf. Malcolm Schofield, 1980, p. 51-58 ; Jonathan Barnes, ''The Presocratic Philosophers'', Londres, Routledge, 1982, p. 309-315.</ref>. Ce principe présente une analogie frappante avec celui qu'Antoine-Laurent de Lavoisier formulera en 1789 comme principe de conservation de la matière, et la sentence « Rien ne se perd, rien ne se crée, tout se transforme » en est parfois rapprochée. Il convient cependant de ne pas surinterpréter cette analogie : les mécanismes qu'Anaxagore propose pour expliquer les transformations (mélange et séparation d'ingrédients éternels) sont qualitatifs et ne relèvent pas d'une conception chimique quantitative au sens moderne<ref>Antoine-Laurent de Lavoisier, ''Traité élémentaire de chimie'', Paris, Cuchet, 1789, vol. I, p. 101 : « Rien ne se crée, ni dans les opérations de l'art, ni dans celles de la nature, et l'on peut poser en principe que, dans toute opération, il y a une égale quantité de matière avant et après l'opération. » Le rapprochement avec Anaxagore relève plus de l'analogie conceptuelle rétrospective que d'une filiation historique documentée.</ref>. L'intuition conservatrice d'Anaxagore partage avec le principe lavoisien l'idée que rien ne se perd ni ne se crée dans le devenir physique, mais il serait anachronique d'y voir l'un des principes cardinaux de la chimie moderne. === Tout est dans tout === Le deuxième principe métaphysique fondamental d'Anaxagore s'énonce ainsi : « Il y a une part de tout en toute chose » (ἐν παντὶ παντὸς μοῖρα ἔνεστι, fragment B11)<ref>Anaxagore, fragment B11, cité par Simplicius, ''Commentaire sur la Physique'', 164, 26 (DK 59 B 11).</ref>. Ce principe, souvent désigné par la formule latine ''omnia in omnibus'' (« toutes choses dans toutes choses »), constitue sans doute la thèse la plus caractéristique et la plus déroutante de la philosophie d'Anaxagore<ref>Cf. Gregory Vlastos, « The Physical Theory of Anaxagoras », ''Philosophical Review'', vol. 59, 1950, p. 31-57 ; Colin Strang, « The Physical Theory of Anaxagoras », ''Archiv für Geschichte der Philosophie'', vol. 45, 1963, p. 101-118.</ref>. Il signifie que chaque portion de matière, si infime soit-elle, contient en elle-même des portions de toutes les autres substances qui existent dans l'univers. Il n'existe aucune substance pure, aucun élément qui puisse être isolé de tous les autres<ref>Anaxagore, B6 : « Puisqu'il est impossible qu'il y ait un minimum, il ne serait pas possible que [quelque chose] soit séparé, ni ne vienne à l'être par soi-même » (ἐπεὶ δὲ οὐκ ἔστι τοῦ ὀλίγου τὸ ἐλάχιστον, οὐκ ἂν γένοιτο χωρίς, οὐδὲ γένοιτο καθ᾽ ἑαυτό).</ref>. Dans un morceau d'or, il y a non seulement de l'or en proportion dominante, mais aussi de la chair, des os, du chaud, du froid, du sec, de l'humide, et ainsi de suite pour toutes les qualités et substances possibles<ref>Aristote, ''Métaphysique'', I, 3, 984a13-16 ; Simplicius, ''Commentaire sur la Physique'', 34, 29-35, 9 (DK 59 A 45).</ref>. Cette thèse découle logiquement du principe de conservation et du principe du semblable par le semblable combinés. En effet, comment la chair pourrait-elle provenir du pain et du lait que nous consommons, si le pain et le lait ne contenaient pas déjà de la chair ? La question rhétorique du fragment B10 impose cette conclusion. La nourriture que nous ingérons doit nécessairement contenir en elle-même, quoique de manière imperceptible en raison de la petitesse des parties, toutes les substances qui composent notre corps : cheveux, ongles, veines, artères, nerfs, os<ref>Scholie anonyme à Grégoire de Nazianze, DK 59 B 10 : « Dans le même liquide séminal, il y a des cheveux, des ongles, des veines et des artères, des nerfs et des os, et ils sont imperceptibles en raison de la petitesse des parties (δι᾽ ὀλιγότητα), mais lorsqu'ils croissent, ils se séparent graduellement. »</ref>. C'est par un processus de séparation graduelle (ἀποκρίνεσθαι), au cours de la croissance, que ces éléments préexistants dans la nourriture viennent s'ajouter aux parties correspondantes de notre organisme. Le principe « tout est dans tout » s'applique non seulement aux substances naturelles comme la chair et les os, mais aussi aux qualités opposées. Anaxagore affirme que « le noir est dans le blanc et le blanc dans le noir » et qu'il en va de même pour le lourd et le léger, le chaud et le froid<ref>Anaxagore, B15, cité par Simplicius, ''Commentaire sur le Ciel'', 608, 26 (DK 59 B 15) ; Simplicius, ''Commentaire sur la Physique'', 175, 11-14.</ref>. Ces oppositions qualitatives ne sont pas absolues mais relatives : ce qui nous paraît blanc contient en réalité du noir, mais en proportion si faible que cette part de noir demeure invisible à nos sens. De même, ce qui est léger contient du lourd, et inversement<ref>Anaxagore, B1, B4b ; Aristote, ''Physique'', I, 4, 187b1-7 (DK 59 A 52).</ref>. Cette doctrine a suscité d'intenses débats interprétatifs depuis l'Antiquité. Aristote la présente comme une tentative de résoudre le problème de la nutrition tout en respectant les contraintes éléatiques<ref>Aristote, ''Physique'', III, 4, 203a19-b3 ; cf. W. K. C. Guthrie, ''A History of Greek Philosophy'', vol. II, Cambridge, Cambridge University Press, 1965, p. 289-294.</ref>. Les interprètes modernes se divisent sur la question de savoir si Anaxagore conçoit ces « portions » (μοῖραι) comme des particules infinitésimales ou comme des qualités interpénétrées sans structure corpusculaire déterminée<ref>Pour la première interprétation « particulaire », voir Gregory Vlastos, 1950 ; Arthur L. Peck, « Anaxagoras : Predication as a Problem in Physics », ''Classical Quarterly'', vol. 25, 1931, p. 27-37 et p. 112-120. Pour la seconde interprétation « non-particulaire », voir Colin Strang, 1963 ; Daniel Graham, « Was Anaxagoras a Reductionist? », ''Ancient Philosophy'', vol. 24, 2004, p. 1-18 ; Anna Marmodoro, « Anaxagoras's Qualitative Gunk », ''British Journal for the History of Philosophy'', vol. 23, 2015, p. 402-422.</ref>. Quoi qu'il en soit, ce principe constitue la clé de voûte du système physique d'Anaxagore. === Pas de plus petit ni de plus grand === Le troisième principe métaphysique, exposé dans le fragment B3, stipule qu'« il n'y a pas de plus petit dans le petit, mais toujours un plus petit encore, car il est impossible que ce qui est cesse d'être par division (οὐ γάρ ἐστι τοῦ ἀποκεκρίσθαι τὸ ἐλάχιστον). Mais il y a aussi toujours un plus grand que le grand, et il est égal au petit en multitude (πλῆθος) ; mais par rapport à elle-même, chaque chose est à la fois grande et petite »<ref>Anaxagore, fragment B3, cité par Simplicius, ''Commentaire sur la Physique'', 164, 17-20 (DK 59 B 3).</ref>. Ce principe garantit la divisibilité infinie de la matière et s'oppose frontalement à toute conception atomiste de type démocritéen<ref>Leucippe et Démocrite, fragments DK 67-68 ; Aristote, ''Génération et corruption'', I, 2, 315b28-317a2 ; I, 8, 325a23-b5.</ref>. Contrairement à Leucippe et Démocrite, qui postulent l'existence d'atomes insécables (ἄτομα, littéralement « indivisibles »), Anaxagore maintient que toute portion de matière, aussi petite soit-elle, peut encore être divisée, et que cette division révélera toujours la présence de toutes les substances selon le principe « tout est dans tout »<ref>Démocrite, fragments B9, B125, B156, B164 ; cf. Aristote, ''De la génération et de la corruption'', I, 8, 325a23-b5 ; Simplicius, ''Commentaire sur le Ciel'', 294, 33-295, 22 (DK 68 A 37).</ref>. Pour Anaxagore, la divisibilité peut être infinie sans que la matière s'évanouisse dans le néant, précisément parce que chaque fragment, si petit soit-il, contient encore toutes les substances<ref>Anaxagore, B6 : « Puisque les parts du grand et du petit sont égales en nombre, ainsi également toutes choses seraient dans toute chose. Il n'est pas possible qu'elles soient séparées, mais toutes choses ont une part de toute chose » (ἴσαι γὰρ ἀριθμῷ μοῖραί εἰσι καὶ τοῦ μεγάλου καὶ τοῦ σμικροῦ· καὶ οὕτως ἂν εἴη πάντα ἐν παντί).</ref>. Cette infinité dans la petitesse se combine avec l'infinité dans la grandeur. Il n'existe pas de limite supérieure à l'extension d'une substance, pas plus qu'il n'existe de limite inférieure<ref>Anaxagore, B3 : « Mais il y a aussi toujours un plus grand que le grand, et il est égal au petit en multitude » (ἀλλὰ καὶ μεγάλου ἀεὶ ἔστι μεῖζον· καὶ ἴσον ἐστὶ τῷ σμικρῷ πλήθει).</ref>. Cette double infinité, à la fois de division et d'extension, constitue un trait distinctif de la métaphysique d'Anaxagore et pose des problèmes interprétatifs considérables aux commentateurs, tant anciens que modernes<ref>Margaret Furth, « A Philosophical Hero? Anaxagoras and the Eleatics », ''Oxford Studies in Ancient Philosophy'', vol. 9, 1991, p. 95-129 ; David Furley, « Anaxagoras, Plato and Naming of Parts », dans ''Presocratic Philosophy: Essays in Honour of Alexander Mourelatos'', éd. Victor Caston et Daniel Graham, Aldershot, Ashgate, 2002, p. 119-126.</ref>. Le principe de non-minimum a une conséquence métaphysique importante : il assure que le mélange universel « tout est dans tout » ne pourra jamais être défait. En effet, puisqu'il n'existe pas de plus petite quantité d'une substance, celle-ci ne pourra jamais être entièrement extraite d'un mélange. On pourra réduire sa proportion indéfiniment, mais elle demeurera toujours présente en quelque mesure<ref>Anaxagore, B6 ; Simplicius, ''Commentaire sur la Physique'', 164, 20-22 : « Car si tout est dans tout et si tout se sépare de tout, alors du prétendu minimum quelque chose de plus petit que lui sera séparé, et du prétendu maximum quelque chose de plus grand que lui a été séparé. »</ref>. Ainsi, le principe de mélange universel est garanti de manière structurelle par le principe de divisibilité infinie. Comme l'a remarqué Colin Strang, « la complexité structurelle n'est pas, dans la théorie d'Anaxagore, fonction de la taille »<ref>Colin Strang, 1963, p. 366 : « Structural complexity is not, on Anaxagoras' theory, a function of size. »</ref>. La justification qu'Anaxagore donne de ce principe est explicitement parménidienne : « car il est impossible que ce qui est cesse d'être » (οὐ γὰρ ἔστι τοῦ εἶναι τὸ μὴ εἶναι)<ref>Anaxagore, B3 ; cette formulation reprend directement l'axiome de Parménide, B2, 3.</ref>. Si l'on pouvait diviser la matière jusqu'à la faire disparaître complètement, cela impliquerait un passage de l'être au non-être, ce qui viole l'interdit fondamental. Toute division, aussi poussée soit-elle, doit donc laisser subsister quelque chose, et ce quelque chose, par application du principe « tout est dans tout », contiendra encore des portions de toutes les substances<ref>Simplicius, ''Commentaire sur la Physique'', 164, 23-165, 1 (commentaire sur B3).</ref>. === Le principe de prédominance === Du principe « tout est dans tout » découle une difficulté évidente : si chaque chose contient une part de toutes les autres, comment expliquer que nous percevions des objets distincts et identifiables ? Comment distinguer l'or de la chair, le noir du blanc, si l'or contient de la chair et la chair contient de l'or, si le noir contient du blanc et le blanc contient du noir ? Anaxagore résout cette difficulté par ce que les commentateurs modernes appellent le « principe de prédominance » (bien qu'Anaxagore lui-même n'emploie pas ce terme technique)<ref>Le terme « principe de prédominance » (predominance principle) a été introduit par les interprètes modernes, notamment Gregory Vlastos, 1950, p. 47-50 ; Malcolm Schofield, 1980, p. 88-101.</ref>. Dans le fragment B12, il affirme : « Chaque chose est et était très manifestement (ἐμφανέστατα) constituée de celles des choses dont il y a le plus en elle »<ref>Anaxagore, fragment B12, cité par Simplicius, ''Commentaire sur la Physique'', 156, 1-157, 4, à 156, 10-11 (DK 59 B 12).</ref>. Autrement dit, une chose tire son identité et ses propriétés apparentes des substances qui prédominent en elle. Un morceau d'or nous apparaît comme de l'or parce que la substance or y est présente en proportion largement supérieure à toutes les autres substances. De même, notre chair nous semble être de la chair parce que la substance chair y domine quantitativement<ref>Simplicius, ''Commentaire sur la Physique'', 34, 29-35, 9 : « Chaque chose semble être cela dont elle a le plus, comme elle l'était auparavant » (δοκεῖν δ᾽ ἕκαστον εἶναι ταῦτα ὧν ἂν πλεῖστα ἐνῇ, ὥσπερ καὶ πρότερον).</ref>. Cette prédominance n'est pas absolue, puisque toutes les autres substances demeurent présentes en quelque proportion, mais elle est suffisante pour conférer à l'objet ses caractéristiques perceptibles<ref>Anaxagore, B12 ; Aristote, ''Physique'', I, 4, 187b1-7.</ref>. Le principe de prédominance permet à Anaxagore de concilier son ontologie de mélange universel avec notre expérience quotidienne d'un monde composé d'objets distincts et identifiables. Il rend compte aussi du changement : lorsqu'un objet semble se transformer en un autre, par exemple lorsque le pain que nous mangeons devient chair, ce qui se produit en réalité est une modification des proportions relatives des substances présentes. La chair, déjà présente dans le pain mais en proportion imperceptible, vient s'ajouter à la chair de notre corps à mesure que les autres composants du pain se dispersent ou que leurs proportions relatives diminuent<ref>Anaxagore, B10 ; Aristote, ''Génération des animaux'', II, 4, 740b26-29 ; Simplicius, ''Commentaire sur la Physique'', 460, 4-465, 19 (DK 59 A 45).</ref>. Contrairement aux apparences sensibles, il n'y a pas de transformation qualitative véritable, mais seulement des réarrangements quantitatifs<ref>Malcolm Schofield, 1980, p. 88-101 ; Daniel Graham, ''Explaining the Cosmos: The Ionian Tradition of Scientific Philosophy'', Princeton, Princeton University Press, 2006, p. 137-152.</ref>. Théophraste, dans son traité ''Sur les sensations'', rapporte qu'Anaxagore soutenait que « toute sensation s'accompagne de douleur » (πᾶσαν αἴσθησιν μετὰ λύπης εἶναι) précisément parce que percevoir implique un contact entre des qualités opposées<ref>Théophraste, ''De Sensibus'', 1, 27-29 (DK 59 A 92). Cf. également Aétius, IV, 9, 1 (DK 59 A 92).</ref>. Si le principe de prédominance explique pourquoi nous percevons des objets distincts, il explique aussi pourquoi cette perception n'est jamais parfaitement exacte : les sens ne peuvent discriminer que les différences marquées de proportion, mais les différences subtiles leur échappent<ref>Sextus Empiricus, ''Contre les mathématiciens'', VII, 90 (DK 59 B 21) : « Les apparences sont une vision des choses non-manifestes » (ὄψις τῶν ἀδήλων τὰ φαινόμενα).</ref>. === Synthèse : la réponse d'Anaxagore à Parménide === Les quatre principes métaphysiques que nous venons d'examiner, soit la conservation, le « tout est dans tout », la divisibilité infinie et la prédominance, forment un système cohérent qui constitue la réponse d'Anaxagore au défi parménidien<ref>Patricia Curd, 1998, p. 123-165 ; Malcolm Schofield, 1980, p. 27-86.</ref>. Anaxagore accepte l'impossibilité du passage de l'être au non-être, mais rejette les conséquences que Parménide en tire concernant l'unicité, l'immobilité et l'homogénéité de l'être. Premièrement, en remplaçant la génération et la corruption par le mélange et la séparation (B17), Anaxagore sauve les phénomènes sans violer l'interdit éléatique : rien ne naît véritablement, rien ne périt véritablement, il n'y a que réarrangement de ce qui existe déjà de toute éternité. Deuxièmement, en posant que tout est dans tout (B11, B6), Anaxagore explique comment des substances apparemment nouvelles peuvent émerger sans être créées ex nihilo : elles étaient déjà présentes dans le mélange, simplement imperceptibles en raison de leur faible proportion. Troisièmement, en affirmant la divisibilité infinie (B3, B6), Anaxagore garantit que le mélange universel ne pourra jamais être entièrement défait. Quatrièmement, en introduisant le principe de prédominance (B12), Anaxagore rend compte de la diversité phénoménale et de la possibilité de la perception, tout en maintenant l'ontologie du mélange universel. Anaxagore parvient ainsi à préserver les intuitions fondamentales de Parménide, à savoir la permanence de l'être, l'impossibilité du non-être et l'immutabilité substantielle, tout en rendant compte de la pluralité, du changement et du devenir qui caractérisent notre expérience du monde<ref>Patricia Curd, 1998, p. 165 : « Anaxagoras accepts the fundamental Eleatic constraint that what-is-not cannot be, but offers an account of the world that preserves both plurality and change. » Cf. également Daniel Graham, 2006, p. 137-152 ; G. E. R. Lloyd, ''Early Greek Science: Thales to Aristotle'', Londres, Chatto & Windus, 1970, p. 47-52.</ref>. == Les ingrédients primordiaux == La question de savoir quels sont exactement les ingrédients élémentaires (τὰ χρήματα) qui composent l'univers d'Anaxagore a suscité d'intenses débats parmi les commentateurs, depuis Aristote jusqu'aux spécialistes contemporains<ref>Pour une vue d'ensemble des débats, voir Malcolm Schofield, ''An Essay on Anaxagoras'', Cambridge, Cambridge University Press, 1980, p. 99-138 ; Patricia Curd, ''Anaxagoras of Clazomenae : Fragments and Testimonia'', Toronto, University of Toronto Press, 2007, essais 2-4 ; Daniel Graham, « Was Anaxagoras a Reductionist? », ''Ancient Philosophy'', vol. 24, 2004, p. 1-18.</ref>. Le problème est rendu particulièrement complexe par le fait qu'Anaxagore ne fournit pas de liste systématique et exhaustive de ces ingrédients, et que les fragments conservés mentionnent des entités de natures apparemment différentes. Comme le souligne Malcolm Schofield, « malgré le rôle cardinal de la doctrine du "tout est dans tout" dans sa philosophie, les fragments qui ont survécu indiquent que dans son exposition, Anaxagore assigna au moins autant d'importance à son récit du mélange primordial et à sa description du Noûs et de son activité cosmogonique »<ref>Malcolm Schofield, 1980, p. 99.</ref>. === Les opposés === Dans les fragments B1, B2, B4b, B8, B12 et B15, Anaxagore énonce explicitement plusieurs paires d'opposés (τὰ ἐναντία) : l'humide et le sec (τὸ ὑγρόν καὶ τὸ ξηρόν), le chaud et le froid (τὸ θερμόν καὶ τὸ ψυχρόν), le lumineux et l'obscur (τὸ λαμπρόν καὶ τὸ ζοφερόν), le dense et le rare (τὸ πυκνόν καὶ τὸ ἀραιόν)<ref>Anaxagore, B1, B2, B4b, B8, B12, B15.</ref>. Ces qualités opposées jouent un rôle fondamental dans la cosmologie d'Anaxagore. Ce sont elles qui, par leur séparation progressive (ἀποκρίνεσθαι) à partir du mélange originel et leur réagencement ultérieur, donnent naissance à la diversité des phénomènes naturels<ref>Anaxagore, B12, B13, B15, B16 ; Aristote, ''Physique'', I, 4, 187b1-7 (DK 59 A 52).</ref>. Les opposés ne doivent pas être compris comme de simples attributs qui qualifieraient une substance sous-jacente. Dans la pensée présocratique en général, et chez Anaxagore en particulier, la distinction ultérieure entre substance et qualité n'existe pas encore avec la netteté qu'elle acquerra chez Aristote<ref>G. E. L. Owen, « Tithenai ta Phainomena », dans ''Aristotle et les problèmes de méthode'', éd. Suzanne Mansion, Louvain, Publications Universitaires, 1961, p. 83-103 ; Jonathan Barnes, ''The Presocratic Philosophers'', Londres, Routledge, 1982, p. 316-321.</ref>. Le chaud (τὸ θερμόν) n'est pas simplement une propriété qui affecterait une matière indéterminée ; c'est une réalité substantielle en soi, qui peut être présente en plus ou moins grande proportion dans un mélange donné. Comme l'a remarqué F. M. Cornford, ces opposés doivent être compris comme des « choses-qualités » (quality-things)<ref>F. M. Cornford, « Anaxagoras' Theory of Matter », ''Classical Quarterly'', vol. 24, 1930, p. 14-30, aux pages 16-17.</ref>. Gregory Vlastos précise que ces opposés doivent plutôt être compris « comme des formes d'énergie ou de puissance (δύναμις) »<ref>Gregory Vlastos, « The Physical Theory of Anaxagoras », ''Philosophical Review'', vol. 59, 1950, p. 31-57.</ref>. === L'interprétation « austère » : les opposés seuls === Paul Tannery, à la fin du XIXe siècle, fut le premier à contester l'interprétation aristotélicienne selon laquelle Anaxagore aurait postulé l'existence de « particules homéomères » (particules de chair, d'os, etc.)<ref>Paul Tannery, « La théorie de la matière d'Anaxagore », ''Revue Philosophique'', vol. 22, 1886, p. 255-274 ; repris dans ''Pour l'histoire de la science hellène'', Paris, Alcan, 1887, p. 275-290.</ref>. Tannery soutenait qu'Anaxagore ne parlait que de qualités : l'humide, le sec, le chaud, le froid, etc. John Burnet adopta une position similaire dans son ouvrage influent ''Early Greek Philosophy'', reconnaissant que « même lorsque la notion de qualité (ποιότης) avait été définie, cette manière de penser survécut »<ref>John Burnet, ''Early Greek Philosophy'', 4{{e}} édition, Londres, Adam and Charles Black, 1930, p. 256-264, citation p. 263.</ref>. Burnet s'appuyait notamment sur Galien, qui affirme dans son commentaire sur Hippocrate que « ce sont les qualités qui sont éternelles » chez Anaxagore<ref>Galien, ''Commentaire sur le traité hippocratique Des humeurs'', XVI, 32 Kühn.</ref>. Cette interprétation présente plusieurs avantages. Premièrement, elle se fonde étroitement sur les fragments conservés d'Anaxagore lui-même, plutôt que sur les reconstructions d'Aristote, qui écrivait près de cent cinquante ans après Anaxagore et avait ses propres préoccupations philosophiques. Deuxièmement, elle rend compte du rôle cosmologique crucial des opposés dans les fragments B12, B13, B15 et B16, où ce sont explicitement les opposés qui se séparent lors de la cosmogonie<ref>Malcolm Schofield, 1980, p. 107-113 ; Colin Strang, « The Physical Theory of Anaxagoras », ''Archiv für Geschichte der Philosophie'', vol. 45, 1963, p. 101-118.</ref>. Cette interprétation a été défendue au XXe siècle par plusieurs spécialistes éminents, notamment F. M. Cornford, Gregory Vlastos (avec certaines réserves), Colin Strang, Malcolm Schofield (avec des nuances importantes), Brad Inwood, David Sedley, et plus récemment Anna Marmodoro<ref>F. M. Cornford, 1930 ; Gregory Vlastos, 1950, p. 329-333 ; Colin Strang, 1963 ; Malcolm Schofield, 1980, p. 99-138 ; Brad Inwood, « Anaxagoras and Infinite Divisibility », ''Illinois Classical Studies'', vol. 11, 1986, p. 17-33 ; David Sedley, ''Creationism and Its Critics in Antiquity'', Berkeley, University of California Press, 2007, p. 24-26 ; Anna Marmodoro, « Anaxagoras's Qualitative Gunk », ''British Journal for the History of Philosophy'', vol. 23, 2015, p. 402-422.</ref>. === L'interprétation aristotélicienne : les homéomères === Toutefois, la question devient plus complexe lorsqu'on prend en considération les témoignages indirects, notamment ceux d'Aristote. Dans plusieurs passages, Aristote attribue à Anaxagore une doctrine des « homéomères » (τὰ ὁμοιομερῆ), c'est-à-dire des substances dont chaque partie est semblable au tout<ref>Aristote, ''Métaphysique'', I, 3, 984a11-16 ; Aristote, ''Génération et corruption'', I, 1, 314a18-24 (DK 59 A 46).</ref>. Les exemples donnés par Aristote incluent la chair, les os, le sang, la moelle, l'or, le bois, autant de substances naturelles que nous rencontrons dans l'expérience quotidienne. Cependant, le terme même « homéomère » n'apparaît nulle part dans les fragments conservés d'Anaxagore. C'est Aristote qui l'a introduit pour caractériser ce qu'il comprenait être la position d'Anaxagore<ref>Le terme ὁμοιομερής apparaît d'abord chez Aristote, ''Parties des animaux'', II, 1, 646b10-20 ; ''Génération et corruption'', I, 1, 314a18 sq. Cf. Pierre Pellegrin, « La théorie aristotélicienne des homéomères », ''Revue de Métaphysique et de Morale'', vol. 86, 1981, p. 449-467.</ref>. Cette discordance entre les fragments authentiques, qui mentionnent principalement des opposés, et l'interprétation aristotélicienne, qui privilégie les substances naturelles comme la chair et les os, a conduit à une longue controverse parmi les spécialistes modernes. Comme le souligne W. K. C. Guthrie, « le fait le plus gênant pour ceux qui souhaitent suivre Aristote est que le terme homéomères n'apparaît jamais dans les fragments d'Anaxagore lui-même, et que les fragments ne mentionnent jamais explicitement la chair, les os ou le sang comme des ingrédients élémentaires »<ref>W. K. C. Guthrie, 1965, p. 284-285.</ref>. L'interprétation « expansive », qui accepte pleinement le témoignage aristotélicien, a néanmoins été défendue par plusieurs spécialistes, notamment Arthur L. Peck dans les années 1920 et 1930, et plus récemment par George Kerferd<ref>Arthur L. Peck, « Anaxagoras : Predication as a Problem in Physics », ''Classical Quarterly'', vol. 25, 1931, p. 27-37 et p. 112-120 ; George B. Kerferd, « Anaxagoras and the Concept of Matter before Aristotle », ''Bulletin of the John Rylands Library'', vol. 52, 1969, p. 129-143.</ref>. === L'interprétation médiane === Une troisième voie, une interprétation « médiane », a été proposée notamment par Malcolm Schofield et Patricia Curd<ref>Malcolm Schofield, 1980, p. 99-138 ; Patricia Curd, 1998, p. 123-165 ; Patricia Curd, 2007, essais 2-4.</ref>. Selon cette lecture, l'ontologie d'Anaxagore comprend plusieurs catégories d'entités : les opposés, les substances naturelles fondamentales comme les métaux, la terre, l'air et l'éther, et les ingrédients biologiques comme la chair, le sang et les os. En revanche, les plantes, les animaux et leurs parties organiques ne seraient pas des éléments primordiaux mais des constructions naturelles résultant de l'agencement des ingrédients plus fondamentaux<ref>Patricia Curd, 2007, essais 2-3, p. 157-191 ; Malcolm Schofield, 1980, p. 132-138.</ref>. Cette interprétation médiane présente l'avantage de tenir compte à la fois des fragments authentiques et des témoignages d'Aristote, sans les opposer frontalement. Elle reconnaît que les opposés jouent un rôle cosmologique crucial, puisque c'est leur séparation qui déclenche la formation du cosmos (fragments B12, B13, B15), tout en admettant que les substances naturelles ont également une place dans l'ontologie d'Anaxagore. === Les semences (σπέρματα) === Un élément supplémentaire de complexité est introduit par la mention des « semences » (σπέρματα) dans les fragments B4a et B4b. Dans le fragment B4b, après avoir mentionné les opposés, Anaxagore ajoute : « et il y avait beaucoup de terre présente, et des semences infinies en nombre, ne se ressemblant en rien les unes aux autres » (πολλὴ δὲ γῆ ἐνῆν καὶ σπέρματα ἄπειρα πλῆθος οὐδὲν ἐοικότα ἀλλήλοις)<ref>Anaxagore, fragment B4b, cité par Simplicius, ''Commentaire sur la Physique'', 34, 29-35, 9 (DK 59 B 4b).</ref>. Le fragment B4a est encore plus explicite : « Il est juste de penser qu'il y avait dans toutes les choses qui étaient rassemblées beaucoup de choses de toutes sortes, et des semences de toutes choses, possédant des formes et des couleurs et des saveurs de toute espèce »<ref>Anaxagore, fragment B4a, cité par Simplicius, ''Commentaire sur la Physique'', 34, 18-29 (DK 59 B 4a).</ref>. La nature exacte de ces semences a fait l'objet de débats considérables parmi les commentateurs. Gregory Vlastos a proposé que σπέρμα soit un terme technique introduit par Anaxagore pour désigner un agrégat infinitésimal contenant tous les ingrédients, mais dans lequel un seul prédomine<ref>Gregory Vlastos, 1950, p. 338-342 ; cf. également J. E. Raven, « The Basis of Anaxagoras' Cosmology », ''Classical Quarterly'', vol. 4, 1954, p. 123-137.</ref>. David Lloyd a suggéré que les semences soient des portions pures (ou quasi-pures) d'opposés<ref>David Lloyd, « Anaxagoras on Life and Mind », ''Phronesis'', vol. 14, 1969, p. 246-251, note 1.</ref>. Une position intermédiaire, défendue par Malcolm Schofield, David Sedley, Patricia Curd et Daniel Gershenson, suggère que les semences doivent être comprises littéralement comme des semences biologiques ordinaires, c'est-à-dire des graines de plantes et des semences animales<ref>Malcolm Schofield, 1980, p. 119-132 ; David Sedley, 2007, p. 24-26 ; Patricia Curd, 2007, essai 2 ; Daniel E. Gershenson et Daniel A. Greenberg, ''Anaxagoras and the Birth of Scientific Method'', New York, Blaisdell, 1964, p. 15-17.</ref>. Cette dernière interprétation présente plusieurs avantages. Elle ne fait pas violence au langage : lorsqu'Anaxagore parle de σπέρματα, il utilise le terme ordinaire pour « semences » sans lui donner un sens technique inhabituel. Elle explique la diversité infinie des semences mentionnée dans B4b. Elle est en outre corroborée par des témoignages anciens sur la biologie d'Anaxagore : Théophraste rapporte qu'« Anaxagore dit que l'air contient des semences de toutes choses, et que celles-ci, lorsqu'elles sont emportées avec l'eau, engendrent les plantes »<ref>Théophraste, ''Causes des plantes'', I, 5, 2 (DK 59 A 117).</ref>. De même, Hippolyte rapporte qu'« au commencement, les animaux naquirent de l'humide, du chaud et du terreux, puis plus tard les uns des autres »<ref>Hippolyte, ''Réfutation de toutes les hérésies'', I, 8, 12 (DK 59 A 42).</ref>. == L'état originel : tout ensemble == Le traité d'Anaxagore s'ouvrait par l'une des déclarations les plus célèbres et les plus discutées de la philosophie présocratique : « Toutes choses étaient ensemble » (ὁμοῦ πάντα χρήματα ἦν, fragment B1)<ref>Anaxagore, fragment B1, cité par Simplicius, ''Commentaire sur la Physique'', 155, 23-26 (DK 59 B 1). Diogène Laërce, II, 6, rapporte qu'Anaxagore « commença son traité d'une manière très attrayante ».</ref>. Cette formule programmatique, placée en position d'ouverture, exprime la thèse cosmogonique fondamentale d'Anaxagore concernant l'état primordial de l'univers. Plusieurs commentateurs, notamment G. E. L. Owen, ont souligné que la formulation d'Anaxagore constitue une réponse directe et délibérée à Parménide<ref>G. E. L. Owen, « The Place of the Timaeus in Plato's Dialogues », ''Classical Quarterly'', vol. 3, 1953, p. 79-95 ; repris dans ''Logic, Science and Dialectic'', Londres, Duckworth, 1986, p. 65-84.</ref>. Là où Parménide avait affirmé que l'être « est maintenant, tout ensemble, un, continu » (νῦν ἔστιν ὁμοῦ πᾶν, ἕν, συνεχές)<ref>Parménide, fragment B8, 5-6 (DK 28 B 8).</ref>, Anaxagore proclame que « toutes choses étaient ensemble ». Parménide affirmait l'unicité, la continuité, l'éternité présente et l'immobilité de l'être ; Anaxagore lui oppose la pluralité, la diversibilité infinie, l'existence passée et le devenir cosmogonique<ref>Malcolm Schofield, 1980, p. 64-65 ; Patricia Curd, 1998, p. 123-142.</ref>. === La description du mélange originel === Le fragment B1, dont Simplicius nous dit qu'il se trouvait près du début du traité d'Anaxagore, fournit une description plus complète de cet état primordial : <blockquote>Toutes choses étaient ensemble, illimitées et en multitude et en petitesse, car le petit aussi était illimité. Et toutes choses étant ensemble, rien n'était manifeste en raison de la petitesse. Car l'air et l'éther recouvraient toutes choses, tous deux étant illimités ; car ce sont eux qui sont les plus grands dans la totalité des choses, et en multitude et en grandeur.<ref>Anaxagore, fragment B1, cité par Simplicius, ''Commentaire sur la Physique'', 155, 23-157, 4 (DK 59 B 1).</ref></blockquote> Ce passage dense pose plusieurs problèmes interprétatifs considérables qui ont occupé les commentateurs depuis l'Antiquité. Quatre caractéristiques principales du mélange originel y sont énoncées : toutes choses étaient ensemble ; elles étaient illimitées en multitude et en petitesse ; rien n'était manifeste en raison de la petitesse ; l'air et l'éther recouvraient toutes choses. L'expression « illimitées en multitude et en petitesse » a suscité d'intenses débats interprétatifs. Deux lectures principales s'affrontent, que Malcolm Schofield a désignées respectivement comme l'interprétation « particulaire » et l'interprétation « proportionnelle »<ref>Malcolm Schofield, 1980, p. 70-99.</ref>. L'interprétation particulaire comprend « illimitées en multitude » comme signifiant qu'il existait un nombre infini de choses distinctes dans le mélange originel<ref>Gregory Vlastos, 1950, p. 31-57 ; W. K. C. Guthrie, 1965, p. 277-285 ; David Sider, 2005, p. 56-62.</ref>. L'interprétation proportionnelle, en revanche, refuse de comprendre le mélange originel comme une collection de particules discrètes : « illimitées en petitesse » signifierait plutôt que chaque ingrédient était présent dans le mélange en une proportion infiniment petite par rapport à la totalité<ref>Malcolm Schofield, 1980, p. 75-89 ; Colin Strang, 1963, p. 101-118 ; Jonathan Barnes, 1982, p. 39-53.</ref>. Le débat entre ces deux interprétations n'est pas résolu, et chacune présente des avantages et des difficultés<ref>Pour une discussion équilibrée des deux positions, voir Patricia Curd, 2007, essai 4, p. 192-213 ; Daniel Graham, 2006, p. 137-152.</ref>. === L'imperceptibilité du mélange === La troisième caractéristique du mélange originel est son indistinction : « rien n'était manifeste » (οὐδὲν ἔνδηλον ἦν). Anaxagore explique cette imperceptibilité par deux facteurs complémentaires : « en raison de la petitesse » (ὑπὸ σμικρότητος), et parce que « l'air et l'éther recouvraient toutes choses » (πάντα γὰρ ἀὴρ καὶ αἰθὴρ κατεῖχε). L'air (ἀήρ) désigne ici, conformément à l'usage ionien archaïque, une substance sombre, humide, froide et dense<ref>Anaximène, fragments DK 13 A 7, B 2 ; cf. Charles Kahn, ''Anaximander and the Origins of Greek Cosmology'', New York, Columbia University Press, 1960, p. 133-162 ; Daniel Graham, 2006, p. 93-102.</ref>. L'éther (αἰθήρ), en revanche, désigne la substance lumineuse, chaude, sèche et rare<ref>Anaxagore, B15. Cf. W. K. C. Guthrie, 1965, p. 301-304 ; Malcolm Schofield, 1980, p. 81-83.</ref>. Ces deux substances, affirme Anaxagore, « sont les plus grandes dans la totalité des choses, et en multitude et en grandeur ». Cela signifie qu'elles étaient présentes dans le mélange originel en proportions largement supérieures à tous les autres ingrédients. Le fragment B4b confirme cette description : <blockquote>Mais avant que ces choses ne fussent séparées, lorsque toutes choses étaient ensemble, aucune couleur n'était manifeste. Car le mélange de toutes choses l'empêchait : celui du sec et de l'humide, du chaud et du froid, du lumineux et de l'obscur, ainsi que d'une grande quantité de terre présente et de semences illimitées en multitude, ne se ressemblant en rien les unes aux autres.<ref>Anaxagore, fragment B4b (DK 59 B 4b).</ref></blockquote> Ce passage confirme que l'indistinction du mélange originel n'était pas due à l'absence des ingrédients, mais à leur mélange si intime que leurs caractéristiques respectives se neutralisaient mutuellement. === L'immobilité originelle === Plusieurs témoignages anciens rapportent qu'avant l'intervention du Noûs, le mélange universel était au repos<ref>Aristote, ''Physique'', VIII, 1, 250b24-26 (DK 59 A 64).</ref>. Cette immobilité primordiale pose un problème philosophique considérable : si le mélange était éternellement au repos, qu'est-ce qui a pu le mettre en mouvement ? Anaxagore répond en postulant l'existence du Noûs (Νοῦς, Intellect ou Esprit), une entité distincte de toutes les substances matérielles, qui possède le pouvoir d'initier le mouvement<ref>Anaxagore, B12.</ref>. Mais cette réponse soulève elle-même de nouvelles difficultés, qui seront examinées plus loin. === L'étendue du mélange originel === Le fragment B1 affirme que l'air et l'éther « tous deux étaient illimités » (ἄμφω ἄπειρα ἐόντα), et le fragment B2 précise : « L'air et l'éther se séparent de la multitude environnante, et la multitude environnante est illimitée en quantité »<ref>Anaxagore, fragment B2 (DK 59 B 2).</ref>. Ces affirmations suggèrent que le mélange originel était spatialement infini<ref>Aristote, ''Physique'', III, 4, 203a19-23 (DK 59 A 43).</ref>. Le fragment B12 indique que « le Noûs commença à exercer son pouvoir à partir d'un petit commencement, puis la rotation s'étendit sur une région plus grande, et s'étendra sur une région plus grande encore »<ref>Anaxagore, B12 (DK 59 B 12).</ref>. Cela suggère que le processus cosmogonique, bien qu'il soit en cours depuis un temps considérable, n'a pas encore affecté la totalité du mélange infini. Cette conception d'un univers partiellement ordonné, où la cosmogonie est encore en cours dans les régions périphériques tandis que notre monde déjà structuré occupe une région centrale, est l'une des idées les plus originales d'Anaxagore<ref>W. K. C. Guthrie, 1965, p. 327-331 ; Patricia Curd, 2007, essai 5, p. 214-237 ; Daniel Graham, 2006, p. 148-152.</ref>. == Le Noûs : l'Intellect cosmique == Le fragment B12 d'Anaxagore, le plus long et le plus célèbre de tous les fragments conservés, est entièrement consacré au Noûs (Νοῦς, « Intellect » ou « Esprit »). Ce passage, d'une grandeur solennelle et d'une intensité remarquable, constitue l'un des textes les plus puissants de toute la prose grecque archaïque<ref>Malcolm Schofield, ''An Essay on Anaxagoras'', Cambridge, Cambridge University Press, 1980, p. 3-32 ; Karl Deichgräber, « Anaxagoras Stil », ''Philologus'', vol. 87, 1933, p. 15-26.</ref>. Dans ce fragment, Anaxagore expose sa doctrine du Noûs comme principe du mouvement cosmogonique et source d'ordre dans l'univers. Le Noûs représente l'innovation philosophique la plus originale d'Anaxagore<ref>W. K. C. Guthrie, 1965, p. 272-279 ; Diogène Laërce, II, 6 (DK 59 A 1), rapporte qu'Anaxagore était surnommé « Monsieur Intellect » (ὁ Νοῦς) en raison de l'importance centrale qu'il donnait à cette notion.</ref>. Il convient d'emblée de préciser, afin d'éviter un contresens répandu dans la littérature secondaire ancienne comme moderne, que le Noûs d'Anaxagore est d'abord une ''cause motrice'' du cosmos : il initie et contrôle le mouvement rotatoire qui produit la séparation des ingrédients à partir du mélange originel. Anaxagore ne dit nulle part, dans les fragments conservés, que l'Intellect ordonne les choses ''parce qu'il serait meilleur qu'elles soient ainsi''. Or, c'est précisément cette affirmation que Socrate et Platon auraient voulu trouver chez le philosophe de Clazomènes, et dont ils lui reprocheront ensuite l'absence dans le passage célèbre du ''Phédon'' (97b-98c). La lecture proprement « téléologique » du Noûs, qui en fait une cause finale organisant le monde selon la Raison du Bien, est donc une reconstruction rétrospective, due à Platon puis à Aristote, et répercutée par toute une tradition doxographique postérieure. Elle projette sur Anaxagore les exigences explicatives du platonisme et de l'aristotélisme, exigences qu'Anaxagore ne partage pas sous cette forme. Plus fondamentalement encore, appliquer sans précaution aux présocratiques la distinction aristotélicienne des quatre causes (matérielle, formelle, efficiente, finale) relève d'un anachronisme conceptuel. Cette distinction est une construction d'Aristote, élaborée dans la ''Physique'' et la ''Métaphysique'' pour penser son propre rapport critique à ses prédécesseurs. La plupart des penseurs antérieurs à Aristote, Anaxagore compris, ne disposent pas d'un tel vocabulaire et n'organisent pas leur réflexion autour de cette quadripartition. Le Noûs d'Anaxagore ne peut être intégralement rangé dans aucune des quatre catégories aristotéliciennes : il est quelque chose comme une cause motrice doublée d'un principe ordonnateur, sans que cet ordre implique nécessairement une référence à un bien objectif. Il est donc plus juste de parler, comme le font les spécialistes contemporains, d'une fonction kinétique et cognitive du Noûs, plutôt que d'y voir la première formulation d'une téléologie rigoureuse<ref>Sur ce point, voir Patricia Curd, « Anaxagoras », ''Stanford Encyclopedia of Philosophy'', 2007 (révision substantielle 2019), section sur le Noûs ; Malcolm Schofield, 1980, p. 55-70 ; James Lesher, « Mind's Knowledge and Powers of Control in Anaxagoras », ''Phronesis'', vol. 40, 1995, p. 125-142. Sur l'anachronisme que représente l'application des quatre causes aristotéliciennes aux physiciens présocratiques, voir l'article « Presocratic Philosophy », ''Stanford Encyclopedia of Philosophy'', éd. Daniel Graham, 2019. Cf. également Christian Vassallo, « Nous, Motion, and Teleology in Anaxagoras », ''Oxford Studies in Ancient Philosophy'', vol. 50, 2016, p. 1-32, qui défend une lecture téléologique minimale et nuancée, restée minoritaire.</ref>. === La séparation du Noûs d'avec toutes choses === Le fragment B12 s'ouvre par une affirmation qui constitue la thèse fondamentale d'Anaxagore concernant le Noûs : <blockquote>Les autres choses ont une part de tout, mais le Noûs est illimité et autonome, et il n'a été mélangé à aucune chose, mais il existe seul, lui-même par lui-même.<ref>Anaxagore, fragment B12, cité par Simplicius, ''Commentaire sur la Physique'', 156, 13-15 (DK 59 B 12).</ref></blockquote> Cette phrase affirme que le Noûs constitue une exception au principe universel « tout est dans tout ». Tandis que toutes les substances matérielles contiennent en elles-mêmes des portions de toutes les autres substances, le Noûs, lui, demeure entièrement pur et séparé<ref>Anaxagore, B11 : « Dans toute chose il y a une part de toute chose, excepté le Noûs ; et il y a certaines choses dans lesquelles il y a aussi du Noûs ».</ref>. Trois attributs sont explicitement prédiqués du Noûs : il est « illimité » (ἄπειρον), « autonome » (αὐτοκρατές), et « non mélangé à aucune chose ». Anaxagore justifie cette séparation par un argument remarquable : <blockquote>Car s'il n'existait pas par lui-même, mais s'il avait été mélangé à quelque autre chose, il participerait de toutes les choses, s'il avait été mélangé à quoi que ce soit. Car dans toute chose il y a une part de toute chose, comme je l'ai dit précédemment. Et les choses mélangées avec lui l'empêcheraient, de sorte qu'il ne dominerait aucune chose de la même manière qu'il la domine en fait, étant seul par lui-même.<ref>Anaxagore, B12, lignes 156, 15-20.</ref></blockquote> L'argument procède ainsi : si le Noûs était mélangé à quoi que ce soit, il contiendrait une part de tout ; les substances mélangées l'empêcheraient d'exercer son pouvoir de contrôle ; or le Noûs exerce effectivement ce pouvoir ; donc le Noûs n'est mélangé à aucune chose<ref>Malcolm Schofield, 1980, p. 12-14 ; Jonathan Barnes, 1982, p. 375-377.</ref>. Plusieurs lectures de la prémisse cruciale, c'est-à-dire de la raison pour laquelle le mélange empêcherait l'action du Noûs, ont été proposées et ne sont pas incompatibles entre elles<ref>Patricia Curd, 2007, essai 5, p. 220-225 ; Christian Vassallo, « Nous, Motion, and Teleology in Anaxagoras », ''Oxford Studies in Ancient Philosophy'', vol. 50, 2016, p. 1-32, aux pages 8-18.</ref>. === Les attributs du Noûs === Après avoir établi la séparation du Noûs, Anaxagore énonce une série d'attributs qui caractérisent sa nature. Le style employé ici est celui de la « prédication solennelle » (feierliche Prädikation), identifié par Karl Deichgräber comme caractéristique du style hymnico-religieux archaïque<ref>Karl Deichgräber, 1933, p. 16-22 ; Eduard Norden, ''Agnostos Theos'', Leipzig, Teubner, 1913, p. 3-29 ; Malcolm Schofield, 1980, p. 4-9.</ref> : <blockquote>Car il est le plus fin de toutes choses et le plus pur, et il possède toute connaissance à l'égard de toute chose et il a la plus grande force ; et toutes les choses qui ont une âme, les plus grandes comme les plus petites, toutes le Noûs les domine.<ref>Anaxagore, B12, lignes 156, 20-24.</ref></blockquote> Le premier attribut, qui qualifie le Noûs de « plus fin » et « plus pur » de toutes choses, a suscité des interprétations divergentes depuis l'Antiquité. Certains y voient l'affirmation, encore en gestation conceptuelle, de l'immatérialité du Noûs<ref>Aristote, ''De l'âme'', III, 4, 429a18-24 ; W. K. C. Guthrie, 1965, p. 278-279.</ref> ; d'autres, en s'appuyant sur le fait qu'Anaxagore utilise l'adjectif λεπτός ailleurs pour décrire l'eau de mer, soutiennent que ces termes doivent être pris en un sens physique : le Noûs serait alors une substance matérielle d'une extrême finesse et d'une grande pureté, proche des réalités les plus ténues du monde sensible<ref>Théophraste, dans Simplicius, ''Commentaire sur la Physique'', 27, 2-3 (DK 59 A 41) ; John Burnet, 1930, p. 268-269 ; Daniel Gershenson et Daniel Greenberg, ''Anaxagoras and the Birth of Scientific Method'', New York, Blaisdell, 1964, p. 27-33.</ref>. Une position médiane suggère qu'Anaxagore n'avait pas encore développé le concept d'incorporéité dans sa pleine rigueur conceptuelle, qui suppose une distinction nette du matériel et de l'immatériel élaborée plus tard par Platon, mais qu'il cherchait néanmoins à exprimer, avec les ressources linguistiques dont il disposait, l'idée que le Noûs est d'une nature fondamentalement différente de toutes les autres substances<ref>Malcolm Schofield, 1980, p. 18-22.</ref>. Le deuxième attribut, qui concerne la connaissance, affirme que le Noûs « possède toute connaissance à l'égard de toute chose » : il s'agit ici d'une forme d'omniscience cosmique. Le troisième, qui concerne la puissance, précise que le Noûs « a la plus grande force », cette force étant liée à sa connaissance selon un schéma que l'on retrouvera chez Aristote et qui fait de la puissance l'envers opératif du savoir<ref>Malcolm Schofield, 1980, p. 22-24.</ref>. Le quatrième attribut, qui concerne le contrôle exercé par le Noûs sur tous les êtres vivants, est cohérent avec le fragment B11, selon lequel il y a du Noûs dans certaines choses, c'est-à-dire dans les êtres animés<ref>Anaxagore, B11. Cf. Malcolm Schofield, 1980, p. 25-27 ; Patricia Curd, 2007, essai 5, p. 225-230.</ref>. === Le rôle cosmogonique du Noûs === Après avoir décrit la nature du Noûs, Anaxagore expose son rôle dans la cosmogonie : <blockquote>Et le Noûs a dominé la révolution entière, de sorte qu'elle a commencé à tourner au commencement. Et d'abord elle a commencé à tourner à partir d'une petite région, mais elle tourne sur une région plus grande, et elle tournera sur une région plus grande encore. Et toutes les choses qui étaient mélangées ensemble et séparées et distinguées, toutes le Noûs les a connues. Et toutes les choses qui devaient être, celles qui étaient, celles qui sont maintenant et celles qui seront, toutes le Noûs les a mises en ordre, et aussi cette révolution dans laquelle tournent maintenant les astres et le soleil et la lune et l'air et l'éther qui sont en train d'être séparés.<ref>Anaxagore, B12, lignes 156, 24-157, 3.</ref></blockquote> Ce passage affirme trois choses concernant l'activité cosmogonique du Noûs. D'abord, l'Intellect initie un mouvement de révolution (περιχώρησις) dans le mélange originel, jusqu'alors immobile. Ensuite, ce mouvement, commencé dans une petite région, s'est étendu progressivement et continue de s'étendre, ce qui implique que la cosmogonie n'est pas un événement ponctuel passé, mais un processus encore en cours dans les régions périphériques du mélange infini. Enfin, c'est ce mouvement qui a produit la séparation (ἀπόκρισις) et la distinction (διάκρισις) des ingrédients, donnant naissance au cosmos ordonné que nous observons<ref>Simplicius, ''Commentaire sur la Physique'', 300, 31-301, 1 ; Aristote, ''Physique'', VIII, 1, 250b24-252a5 (DK 59 A 64).</ref>. Le mécanisme cosmogonique proprement dit est d'ordre mécanique : c'est le mouvement rotatoire qui, par sa force centrifuge, sépare les substances denses des substances rares<ref>Anaxagore, B12, B13, B15, B16.</ref>. Le Noûs n'intervient donc pas directement dans chaque détail de la cosmogonie : il initie le mouvement rotatoire, et celui-ci produit ensuite mécaniquement la séparation et la réorganisation des substances. Cette répartition des rôles entre un principe moteur intelligent et un processus mécanique explique pourquoi Platon et Aristote pourront reprocher à Anaxagore de « laisser faire » la matière après avoir introduit l'Intellect : à leurs yeux, introduire une cause intelligente sans lui confier l'organisation détaillée du monde revient à lui refuser son rôle véritable<ref>Malcolm Schofield, 1980, p. 27-32 ; Daniel Graham, 2006, p. 148-152.</ref>. Le texte affirme cependant aussi que « le Noûs a mis en ordre » (διεκόσμησε νοῦς) toutes choses, passées, présentes et futures. Le verbe διακοσμεῖν signifie « mettre en ordre » ou « arranger ». Il ne faut pas en conclure trop vite à une téléologie au sens fort, comme si les choses étaient disposées en vue du bien : Anaxagore ne fournit pas, dans les fragments qui nous sont parvenus, un tel principe évaluatif. Le Noûs connaît et dispose, il est à la fois intelligent et ordonnateur, mais rien dans les textes n'indique qu'il ordonne les choses ''parce qu'elles seraient ainsi meilleures''. C'est précisément ce point qui sera au cœur de la critique platonicienne dans le ''Phédon'' et qu'il faut examiner avec soin<ref>Christian Vassallo, 2016, a défendu l'idée qu'il y aurait malgré tout une dimension téléologique faible chez Anaxagore ; cette lecture reste minoritaire et contestée. Voir au contraire la synthèse de Patricia Curd, ''SEP'' 2007 (révision substantielle 2019).</ref>. === La critique platonicienne et aristotélicienne === Dans le ''Phédon'', Platon fait raconter par Socrate sa déception à la lecture du livre d'Anaxagore : <blockquote>Un jour, j'entendis quelqu'un lire dans un livre d'Anaxagore, disant que c'est l'Intellect qui met tout en ordre et qui est la cause de toutes choses. Je fus ravi de cette cause, et il me sembla qu'il était en quelque sorte bon que l'Intellect fût la cause de tout ; et je pensai que, s'il en est ainsi, l'Intellect qui met tout en ordre doit tout ordonner et disposer chaque chose de la manière qui est la meilleure. [...] Mais cette merveilleuse espérance, mon ami, me fut enlevée lorsque, progressant dans ma lecture, je vis que cet homme ne fait aucun usage de l'Intellect, qu'il ne lui attribue aucune responsabilité dans la mise en ordre des choses, mais qu'il allègue comme causes l'air, l'éther, l'eau et beaucoup d'autres choses absurdes.<ref>Platon, ''Phédon'', 97b-98c (DK 59 A 47).</ref></blockquote> Ce passage est capital, et il faut en saisir exactement la portée pour éviter le contresens le plus tenace de la tradition exégétique. Socrate ne dit pas qu'Anaxagore avait effectivement proposé une explication par le « meilleur » et qu'il y aurait manqué dans le détail : il dit qu'il ''espérait'' trouver une telle explication, et qu'il fut déçu de ne pas la trouver. La formule « doit tout ordonner et disposer chaque chose de la manière qui est la meilleure » exprime donc l'attente socratique, c'est-à-dire ce que Socrate aurait voulu lire, non la doctrine effective d'Anaxagore. La nuance est décisive. Le texte d'Anaxagore, dans les fragments que nous possédons, affirme que le Noûs connaît toutes choses et qu'il les met en ordre par l'intermédiaire du tourbillon cosmogonique. Il n'affirme pas que cet ordre soit le meilleur possible, ni que le Noûs vise le bien en produisant cet ordre. C'est Socrate qui, lisant Anaxagore, projette ses propres attentes philosophiques : si le monde est ordonné par un Intellect, pense Socrate, alors il doit l'être en vue du bien, puisqu'un Intellect rationnel ne peut que vouloir le meilleur. Cette inférence paraît évidente à Socrate, mais elle n'est pas anaxagoréenne. La lecture qui fait du Noûs d'Anaxagore une « cause téléologique » ou une « cause finale » est, par conséquent, une reconstruction rétrospective qui projette sur le Clazoménien les exigences platoniciennes (le Bien comme cause) puis aristotéliciennes (la cause finale comme l'une des quatre causes)<ref>Malcolm Schofield, 1980, p. 55-70 ; James Lesher, 1995, p. 125-142 ; Patricia Curd, ''SEP'', 2007 (révision substantielle 2019).</ref>. Il faut ici distinguer deux choses qui sont souvent confondues : d'une part, l'attribution au Noûs d'un rôle moteur et cognitif, qui est effectivement anaxagoréenne ; d'autre part, l'attribution au Noûs d'un principe évaluatif selon lequel le monde serait disposé en vue du meilleur, qui ne l'est pas. Le reproche socratique ne consiste donc pas à accuser Anaxagore d'incohérence interne (avoir posé une téléologie puis l'avoir abandonnée), mais à regretter qu'il n'ait pas poussé sa pensée jusqu'à la téléologie que Socrate lui aurait souhaitée. La différence est subtile mais philosophiquement essentielle : elle marque le lieu précis où la pensée présocratique cède la place à la pensée classique. Aristote reprend et durcit la critique dans la ''Métaphysique'' : <blockquote>Anaxagore utilise l'Intellect comme un ''deus ex machina'' pour la fabrication du monde ; et quand il est embarrassé pour expliquer pourquoi quelque chose est nécessairement ainsi, il le fait intervenir. Mais dans tous les autres cas, il allègue comme causes toutes sortes de choses plutôt que l'Intellect.<ref>Aristote, ''Métaphysique'', I, 4, 985a18-21 (DK 59 A 47).</ref></blockquote> Le reproche d'Aristote, comme celui de Socrate-Platon, présuppose un idéal explicatif téléologique qui n'est pas celui d'Anaxagore. Il ne faut donc pas conclure qu'Anaxagore « introduit le Noûs comme cause téléologique puis échoue à l'utiliser » : il introduit le Noûs comme cause motrice et ordonnatrice, et ses critiques l'accusent de ne pas avoir ''aussi'' développé une explication par le meilleur qu'eux attendent. Cette distinction entre la doctrine effective d'Anaxagore et la doctrine que ses successeurs auraient voulu lire chez lui commande toute l'interprétation correcte de son héritage : l'histoire de la téléologie philosophique ne commence pas, en toute rigueur, avec Anaxagore, mais avec la déception philosophique de Socrate face à Anaxagore, puis avec la construction proprement platonicienne du Démiurge et aristotélicienne du Premier Moteur. === Synthèse : l'innovation du Noûs === L'introduction du Noûs par Anaxagore constitue une innovation philosophique à plusieurs titres. Premièrement, Anaxagore est, parmi les penseurs grecs dont nous avons conservé les doctrines, le premier à poser explicitement l'existence d'une entité qui, bien qu'elle agisse sur la matière, n'est mélangée à aucune substance matérielle<ref>W. K. C. Guthrie, 1965, p. 278-279 ; Daniel Gershenson et Daniel Greenberg, 1964, p. 27-33.</ref>. Cette conception préparera, sans y être pour autant équivalente, les doctrines ultérieures de l'âme immatérielle chez Platon et de l'intellect séparé chez Aristote<ref>Platon, ''Phédon'', 78b-84b ; Aristote, ''De l'âme'', III, 5, 430a10-25. Cf. Edward Hussey, ''The Presocratics'', Londres, Duckworth, 1972, p. 138-141.</ref>. Deuxièmement, Anaxagore identifie une cause unique pour le mouvement cosmique et l'ordre qui en résulte<ref>Aristote, ''Métaphysique'', I, 3, 984b15-20, qualifie cette innovation de « sobre ».</ref>. En désignant le principe cosmique par le terme Νοῦς, mot habituellement associé à l'intelligence et à la pensée, Anaxagore suggère que l'ordre du monde n'est pas aveugle : il y a dans le cosmos quelque chose d'intelligent qui connaît et qui dispose. C'est cette suggestion qui sera reprise et radicalisée par Socrate, Platon et Aristote, au prix d'une transformation dont il faut reconnaître qu'elle va au-delà de ce qu'affirme Anaxagore lui-même<ref>Malcolm Schofield, 1980, p. 3-32 ; W. K. C. Guthrie, 1965, p. 327-331.</ref>. == La cosmogonie et la cosmologie == La cosmogonie et la cosmologie d'Anaxagore constituent l'application de ses principes métaphysiques. Dans ces domaines, Anaxagore se montre à la fois héritier de la tradition ionienne et novateur, proposant des explications naturalistes des phénomènes célestes et météorologiques<ref>W. K. C. Guthrie, ''A History of Greek Philosophy'', vol. II, Cambridge, Cambridge University Press, 1965, p. 301-331 ; Daniel Gershenson et Daniel Greenberg, ''Anaxagoras and the Birth of Scientific Method'', New York, Blaisdell, 1964, p. 34-55.</ref>. === Le mouvement rotatoire cosmogonique === Le processus cosmogonique commence lorsque le Noûs initie un mouvement de rotation (περιχώρησις) dans le mélange originel<ref>Anaxagore, fragment B12 (DK 59 B 12).</ref>. Ce mouvement rotatoire ne doit pas être conçu comme une simple rotation uniforme de l'ensemble du mélange, mais comme un tourbillon (δῖνος) ou un vortex dont la vitesse et l'étendue augmentent progressivement<ref>Aristote, ''Du Ciel'', II, 13, 295a9-14 (DK 59 A 88).</ref>. Anaxagore affirme que ce mouvement initial était d'une rapidité extraordinaire : « Rien de ce qui existe maintenant chez les hommes n'est aussi rapide, mais [il était] certainement plusieurs fois plus rapide »<ref>Anaxagore, fragment B9 (DK 59 B 9).</ref>. Le mécanisme de la séparation cosmogonique est mécanique. Le mouvement rotatoire produit une force centrifuge qui pousse les substances rares vers la périphérie et attire les substances denses vers le centre<ref>Anaxagore, B12, B15 ; Aristote, ''Du Ciel'', III, 2, 300b1-8 (DK 59 A 88).</ref>. Le fragment B15 décrit ce processus : <blockquote>Le dense et l'humide et le froid et l'obscur se rassemblèrent ici, là où maintenant est la terre, tandis que le rare et le chaud et le sec se retirèrent vers les régions lointaines de l'éther.<ref>Anaxagore, fragment B15 (DK 59 B 15).</ref></blockquote> Ce processus de séparation n'est jamais achevé. Conformément au principe que « rien n'est complètement séparé » (fragment B8), la rotation continue indéfiniment à produire des séparations et des mélanges partiels<ref>Anaxagore, B8, B12.</ref>. === La formation de la terre === Au centre du tourbillon cosmique, les substances denses, humides, froides et obscures se sont concentrées pour former la terre<ref>Anaxagore, B15 ; Aristote, ''Du Ciel'', III, 2, 300b8-16 (DK 59 A 88).</ref>. Selon Anaxagore, la terre a la forme d'un disque plat<ref>Hippolyte, ''Réfutation de toutes les hérésies'', I, 8, 3 (DK 59 A 42) ; Aristote, ''Du Ciel'', II, 13, 294b13-15 (DK 59 A 88).</ref>, conception traditionnelle dans la cosmologie ionienne<ref>Charles Kahn, ''Anaximander and the Origins of Greek Cosmology'', New York, Columbia University Press, 1960, p. 76-116 ; Daniel Graham, 2006, p. 93-102.</ref>. Anaxagore répond à la question de la stabilité de la terre en affirmant qu'elle demeure immobile parce qu'elle repose sur l'air (ἀήρ) qui la supporte<ref>Aristote, ''Du Ciel'', II, 13, 294b13-21 (DK 59 A 88) : « Anaxagore dit que la terre demeure immobile en raison de son égalité et de la grandeur, car elle ne coupe pas l'air mais le couvre comme un couvercle ».</ref>. Anaxagore aurait même effectué des démonstrations expérimentales avec des clepsydres pour montrer que l'air possède une résistance élastique capable de supporter des corps<ref>Aristote, ''Physique'', IV, 6, 213a22-27 (DK 59 A 68) ; Daniel Gershenson et Daniel Greenberg, 1964, p. 40-43.</ref>. === La formation des corps célestes === Les corps célestes, soleil, lune et étoiles, se sont formés à partir des substances rares, chaudes et sèches projetées vers la périphérie par la force du tourbillon cosmique<ref>Anaxagore, B15 ; Hippolyte, DK 59 A 42.</ref>. Selon cette théorie, les astres ne sont pas des êtres divins mais des masses de pierre ou de métal incandescent, rougies par leur mouvement rapide à travers l'éther<ref>Platon, ''Apologie de Socrate'', 26d (DK 59 A 35) ; Hippolyte, DK 59 A 42. Cette thèse est l'une de celles qui fonderont, selon Plutarque, les accusations d'impiété contre Anaxagore.</ref>. Anaxagore soutenait que le soleil est une masse de pierre ou de métal incandescent<ref>Platon, ''Apologie'', 26d (DK 59 A 35) ; Hippolyte, DK 59 A 42 ; Diogène Laërce, II, 8 (DK 59 A 1) ; Aétius, II, 20, 6 (DK 59 A 72).</ref>. Quant à sa taille, Anaxagore estimait qu'« il est plus grand que le Péloponnèse »<ref>Aétius, II, 21, 3 (DK 59 A 72) ; Plutarque, ''Vie de Périclès'', 6, 2 (DK 59 A 1).</ref>, affirmation qui devait paraître extravagante aux Grecs de son époque, habitués à voir dans le soleil un astre de dimensions modestes. Anaxagore sous-estimait bien sûr très considérablement la taille réelle du soleil, mais l'audace consistait à oser le comparer à une portion de la terre grecque plutôt qu'à un simple disque lumineux. La lune, selon Anaxagore, est elle aussi un corps rocheux, semblable à la terre<ref>Platon, ''Apologie'', 26d ; Hippolyte, DK 59 A 42.</ref>. Contrairement au soleil, la lune ne produit pas sa propre lumière : elle brille par réflexion de la lumière solaire<ref>Plutarque, ''Contre Colotès'', 1116a-b (DK 59 A 77) ; Hippolyte, DK 59 A 42. L'attribution exclusive de cette découverte à Anaxagore doit être nuancée : certains témoignages anciens la rapportent également à Parménide (DK 28 B 14-15), et la question de la priorité reste discutée. Voir Daniel Graham, ''Science before Socrates'', 2006, p. 115-116.</ref>. Cette thèse permit à Anaxagore, qu'il en soit ou non le premier découvreur, d'expliquer correctement les phases lunaires et la mécanique des éclipses<ref>Hippolyte, DK 59 A 42 ; Aétius, II, 29, 6 (DK 59 A 77).</ref>. Une éclipse de lune se produit lorsque la terre s'interpose entre le soleil et la lune, projetant son ombre sur celle-ci<ref>Hippolyte, DK 59 A 42. Cf. Dirk Couprie, « Anaxagoras on the Milky Way and Lunar Eclipses », ''Rhizomata'', vol. 5, 2017, p. 127-147.</ref>. Une éclipse de soleil se produit inversement lorsque la lune s'interpose entre le soleil et la terre<ref>Hippolyte, DK 59 A 42 ; Plutarque, ''Vie de Périclès'', 35, 2 (DK 59 A 18).</ref>. Ces explications, fondées sur une compréhension correcte de la géométrie des positions relatives du soleil, de la terre et de la lune, représentent une avancée considérable dans l'histoire de l'astronomie grecque<ref>W. K. C. Guthrie, 1965, p. 313-316 ; Daniel Graham, 2006, p. 149-150.</ref>. Selon la tradition doxographique, Anaxagore aurait même prédit une éclipse solaire<ref>Plutarque, ''Vie de Périclès'', 35, 2 (DK 59 A 18). La tradition évoque plusieurs éclipses possibles au V{{e}} siècle av. J.-C., sans que l'on puisse identifier avec certitude celle dont il s'agit. Les historiens modernes sont pour la plupart sceptiques quant à la possibilité qu'Anaxagore ait pu effectuer une prédiction précise, faute d'un modèle astronomique suffisamment développé. Cf. W. K. C. Guthrie, 1965, p. 314, note 1 ; Daniel Graham, 2006, p. 150, note 25.</ref>. Anaxagore soutenait enfin que la surface de la lune présente des irrégularités analogues à celles de la terre, montagnes et vallées, intuition que les observations télescopiques confirmeront deux millénaires plus tard<ref>Aétius, II, 30, 2 (DK 59 A 77).</ref>. La Voie lactée s'explique selon Anaxagore par l'ombre que projette la terre dans l'espace : dans les régions du ciel situées dans l'ombre de la terre, le soleil ne peut éclairer les étoiles ; celles-ci deviennent donc toutes visibles, même les plus faibles<ref>Aristote, ''Météorologiques'', I, 8, 345a25-31 (DK 59 A 80). Cf. Dirk Couprie, 2017.</ref>. === Le météorite d'Aigos Potamos === L'événement qui contribua à établir la réputation d'Anaxagore fut la chute d'un météorite de grande taille à Aigos Potamos, sur la rive européenne de l'Hellespont, vers 467 avant notre ère<ref>Pline l'Ancien, ''Histoire naturelle'', II, 149 (DK 59 A 11) ; Plutarque, ''Vie de Lysandre'', 12 (DK 59 A 12) ; Diogène Laërce, II, 10 (DK 59 A 1).</ref>. Selon les témoignages anciens, Anaxagore aurait prédit cette chute. Les historiens modernes sont divisés sur cette question : certains pensent qu'il s'agit d'une légende élaborée après coup, d'autres estiment qu'Anaxagore avait peut-être observé qu'un objet céleste se fragmentait<ref>Daniel W. Graham et Eric Hintz, « Anaxagoras and the Comet », ''Apeiron'', vol. 40, 2007, p. 1-20 ; Evangelos Th. Theodossiou et al., « The Fall of a Meteorite at Aegos Potami in 467/6 BC », ''Journal of Astronomical History and Heritage'', vol. 5, 2002, p. 135-140.</ref>. Quoi qu'il en soit, la chute du météorite fut associée au nom d'Anaxagore et parut confirmer sa théorie selon laquelle les corps célestes sont faits de pierre. === Météorologie === Anaxagore consacra une partie considérable de son traité à l'explication des phénomènes météorologiques. Les nuages se forment par évaporation de l'eau sous l'effet de la chaleur solaire<ref>Aétius, III, 4, 1 (DK 59 A 82).</ref>. La pluie provient de la condensation de la vapeur d'eau contenue dans les nuages<ref>Anaxagore, fragment B16 (DK 59 B 16).</ref>. La formation de la grêle posait un problème particulier : comment de la glace peut-elle se former en été ? Anaxagore proposa une explication ingénieuse : lors des journées très chaudes, des courants d'air ascendants peuvent pousser les nuages à des altitudes très élevées, où l'air est suffisamment froid pour que l'eau gèle<ref>Aétius, III, 4, 1 (DK 59 A 84) ; Aristote, ''Météorologiques'', I, 12, 348b23-349a11 (critique de la théorie d'Anaxagore).</ref>. Cette théorie, bien que partiellement erronée dans ses détails, témoigne d'une compréhension correcte du principe de convection. Le tonnerre et l'éclair sont causés, selon Anaxagore, par la chute de l'éther dans les nuages<ref>Aétius, III, 3, 3 (DK 59 A 84) ; Hippolyte, DK 59 A 42.</ref>. Cette explication reconnaît correctement que l'éclair précède le tonnerre, la vue étant plus rapide que l'ouïe<ref>Sénèque, ''Questions naturelles'', II, 22 (citant Anaxagore).</ref>. Les tremblements de terre sont causés, selon Anaxagore, par de l'éther chaud piégé sous la surface de la terre<ref>Aristote, ''Météorologiques'', II, 7, 365a19-21 (DK 59 A 89).</ref>. === Hydrologie et géologie === Anaxagore proposa une explication de la crue annuelle du Nil : les crues estivales sont causées par la fonte des neiges dans les régions montagneuses situées à la source du fleuve<ref>Diodore de Sicile, I, 38, 4 (attribution explicite à Anaxagore) ; Daniel Gershenson et Daniel Greenberg, 1964, p. 54.</ref>. Cette explication est essentiellement correcte. La mer, selon Anaxagore, existait dès le début, mais sa salinité actuelle provient de l'évaporation de l'eau douce sous l'effet du soleil<ref>Hippolyte, DK 59 A 42.</ref>. === Synthèse : la cosmologie naturaliste d'Anaxagore === La cosmologie d'Anaxagore se caractérise par trois traits fondamentaux. Premièrement, l'unité de la nature : Anaxagore affirme que les corps célestes sont constitués des mêmes substances que la terre et obéissent aux mêmes lois physiques<ref>Hippolyte, DK 59 A 42 ; Daniel Gershenson et Daniel Greenberg, 1964, p. 23-26, 47-48.</ref>. Il n'existe pas de différence ontologique entre le monde sublunaire et le monde supralunaire, contrairement à ce qu'affirmera plus tard Aristote<ref>Aristote, ''Du Ciel'', I, 2-3, 268b11-270b25.</ref>. Deuxièmement, l'explication mécanique : tous les phénomènes cosmologiques et météorologiques sont expliqués par des processus physiques (rotation, séparation par densité, évaporation, condensation), sans recours à des agents divins<ref>Daniel Gershenson et Daniel Greenberg, 1964, p. 23-33.</ref>. Troisièmement, l'usage systématique de l'analogie : Anaxagore explique les phénomènes cosmiques par analogie avec des phénomènes terrestres observables<ref>Daniel Gershenson et Daniel Greenberg, 1964, p. 7-12.</ref>. Ces traits donnent à la cosmologie d'Anaxagore un caractère naturaliste marqué, qui représente une étape importante dans le développement d'une explication physique de la nature. Il convient toutefois de ne pas surestimer sa portée : parler d'Anaxagore comme d'un « fondateur de la méthode scientifique » (selon une expression qu'on trouve parfois dans la littérature) relève d'une certaine emphase rétrospective, qu'il vaut mieux tempérer en parlant plutôt d'un jalon dans une longue histoire où se combinent intuitions fécondes et erreurs caractéristiques de l'époque. == La physiologie et la biologie == Bien qu'Anaxagore soit surtout connu pour ses théories cosmologiques et météorologiques, les témoignages anciens indiquent qu'il consacra aussi une partie considérable de son traité à l'explication des phénomènes biologiques et physiologiques<ref>Daniel Gershenson et Daniel Greenberg, ''Anaxagoras and the Birth of Scientific Method'', New York, Blaisdell, 1964, p. 55-57 ; W. K. C. Guthrie, ''A History of Greek Philosophy'', vol. II, Cambridge, Cambridge University Press, 1965, p. 316-320.</ref>. === La théorie de la nutrition === L'une des questions biologiques les plus importantes qu'Anaxagore chercha à élucider est celle de la nutrition : comment l'alimentation se transforme-t-elle en chair, en os, en cheveux et en toutes les autres parties du corps ? Selon les témoignages d'Aristote et de la tradition doxographique, Anaxagore partait de l'observation que les êtres humains et les animaux se nourrissent d'aliments relativement simples (pain, eau) et que de ces aliments proviennent pourtant toutes les parties complexes et diversifiées de leur corps<ref>Simplicius, ''Commentaire sur la Physique'', 27, 2-11 (DK 59 A 45) : « Car comment, disait-il, des cheveux pourraient-ils provenir de ce qui n'est pas cheveu, et de la chair de ce qui n'est pas chair ? ». Cf. Aétius, I, 3, 5 (DK 59 A 46) ; Lucrèce, ''De la nature'', I, 834-838.</ref>. Cette observation posait un problème philosophique considérable au regard de l'interdit parménidien : il semble en effet qu'une substance nouvelle (la chair) naisse à partir d'une substance qui n'était pas chair (le pain), ce qui contredit le principe « rien ne naît de ce qui n'est pas ». La réponse d'Anaxagore était cohérente avec sa métaphysique générale : le pain doit déjà contenir de la chair, du sang, des os, des cheveux, et toutes les autres substances corporelles, bien que ces constituants y soient présents en quantités si infimes qu'ils demeurent imperceptibles<ref>Simplicius, ''Commentaire sur la Physique'', 460, 4-12 (DK 59 A 45).</ref>. Lorsque nous mangeons du pain, le corps extrait du pain les particules de chair qu'il contient déjà, et les ajoute à la chair existante<ref>Aristote, ''Génération des animaux'', I, 18, 723a6-11 (DK 59 A 45).</ref>. Cette théorie soulève évidemment d'autres difficultés : comment le corps sait-il extraire précisément les particules de chair du pain, et les diriger vers les muscles plutôt que vers les os ? Anaxagore attribuait cette fonction au Noûs présent dans chaque organisme vivant<ref>Cf. section « Le Noûs : l'Intellect cosmique ». Daniel Gershenson et Daniel Greenberg, 1964, p. 27-33, 55-56.</ref>. === La théorie de la perception sensorielle === Anaxagore élabora aussi une théorie originale de la perception sensorielle, fondée sur le principe que « le semblable n'est pas affecté par le semblable, mais les contraires sont affectés les uns par les autres »<ref>Théophraste, ''De Sensibus'', 27 (DK 59 A 92) ; Aristote, ''De l'âme'', III, 3, 427a21-26 (DK 59 A 94).</ref>. Ce principe constituait une réponse directe aux théories de ses prédécesseurs, notamment Empédocle, qui soutenait que la perception se produit par similitude<ref>Théophraste, ''De Sensibus'', 1-2 (DK 31 A 86).</ref>. Selon Anaxagore, pour qu'une perception ait lieu, il doit exister une différence entre l'organe sensoriel et l'objet perçu<ref>Théophraste, ''De Sensibus'', 27-28 (DK 59 A 92).</ref>. Nous ne sentons pas la température de l'air lorsqu'elle est exactement égale à celle de notre peau ; c'est seulement lorsqu'il existe une différence que nous percevons le chaud ou le froid<ref>Théophraste, ''De Sensibus'', 29 (DK 59 A 92).</ref>. Une conséquence remarquable de cette théorie est qu'Anaxagore considérait que toute perception s'accompagne nécessairement de douleur ou d'un certain désagrément (λύπη)<ref>Théophraste, ''De Sensibus'', 29 (DK 59 A 92). Cf. W. K. C. Guthrie, 1965, p. 319 ; Inna Kupreeva, « Sensing the World », dans ''Physis and Psyche in Plato and Aristotle'', Londres, Bloomsbury, 2024, p. 95-114.</ref>. === La reproduction et l'embryologie === Anaxagore proposa en outre des théories sur la reproduction et le développement embryonnaire. Selon les témoignages anciens, il soutenait que le sexe de l'enfant est déterminé par le père seul, et non par la mère<ref>Aétius, V, 7, 1 (DK 59 A 107) ; Hippolyte, DK 59 A 42.</ref>. Cette théorie n'était pas entièrement originale, puisque des idées similaires avaient été proposées par Parménide et d'autres penseurs antérieurs<ref>Aétius, V, 7, 1 (DK 28 A 52-54). Cf. Ursula Mittwoch, « Sex Determination », ''EMBO Reports'', vol. 14, 2013, p. 588-592 ; Oliver Kember, « Anaxagoras' Theory of Sex Differentiation and Heredity », ''Phronesis'', vol. 18, 1973, p. 1-14.</ref>. === La génération des animaux et des plantes === Selon les témoignages doxographiques, Anaxagore distinguait entre la zoogonie originelle, c'est-à-dire la première génération des animaux, et la reproduction ultérieure par semences<ref>Hippolyte, DK 59 A 42 ; Aétius, V, 19, 4 (DK 59 A 42).</ref>. Dans la zoogonie originelle, les premiers animaux émergèrent de la terre encore chaude et humide, grâce aux semences (σπέρματα) contenues dans l'air et l'éther<ref>Théophraste, dans Simplicius, ''Commentaire sur la Physique'', 27, 2-4.</ref>. En ce qui concerne les plantes, Anaxagore affirmait qu'elles possèdent une âme (ψυχή) et un intellect (νοῦς)<ref>Aétius, V, 26, 4 (DK 59 A 117).</ref>. Cette conclusion découlait de ses observations du comportement des plantes : elles se tournent vers la lumière du soleil, étendent leurs racines vers l'eau<ref>Aristote, ''De l'âme'', I, 5, 410b27-411a7. Cf. Inna Kupreeva, 2024, p. 98-103.</ref>. === Observations biologiques diverses === Les sources anciennes conservent enfin quelques observations biologiques isolées d'Anaxagore. Il soutenait, par exemple, que les belettes sont les seuls animaux qui donnent naissance par la bouche<ref>Aristote, ''Histoire des animaux'', VI, 32, 580a15-17 (DK 59 A 114) ; Plutarque, ''Œuvres morales'', 975F-976A (DK 59 A 114).</ref>. Il était parvenu à cette conclusion erronée parce qu'il avait observé des belettes femelles transportant leurs petits dans leur gueule immédiatement après la mise bas<ref>Plutarque, ''Œuvres morales'', 975F (DK 59 A 114).</ref>. De même, il affirmait que les corbeaux et les ibis s'accouplent par le bec<ref>Aristote, ''Histoire des animaux'', V, 2, 539b31-540a1 (DK 59 A 114).</ref>. Ces erreurs montrent les limites de sa méthode empirique. === L'homme et les animaux === Selon Anaxagore, ce qui distingue l'homme du reste du règne animal est principalement l'une des distinctions physiologiques les plus évidentes : les mains de l'homme<ref>Aristote, ''Parties des animaux'', IV, 10, 687a7-12 (DK 59 A 102). Aristote critique cette position et affirme au contraire que l'homme a des mains parce qu'il est le plus intelligent.</ref>. Ce sont les mains, selon Anaxagore, qui permettent à l'homme de surpasser les animaux dans les compétences manipulatrices et les capacités techniques. == L'influence et la postérité == Anaxagore occupe une place importante dans l'histoire de la philosophie antique. Introducteur à Athènes de la tradition ionienne de recherche naturaliste, il constitue un jalon dans le développement de la pensée grecque du V{{e}} siècle<ref>Diogène Laërce, II, 6 (DK 59 A 1) ; W. K. C. Guthrie, ''A History of Greek Philosophy'', vol. II, Cambridge, Cambridge University Press, 1965, p. 266-267.</ref>. Les lignes qui suivent s'efforcent de décrire son influence avec la prudence philologique nécessaire : il est facile, en traitant des présocratiques, de céder à la tentation des grandes filiations, alors que la documentation réelle invite souvent à plus de retenue. === La transmission immédiate : Archélaos et le cercle socratique === Le premier vecteur de l'influence d'Anaxagore fut son disciple direct Archélaos d'Athènes (parfois dit aussi « de Milet »), qui enseigna à Athènes après le départ de son maître pour Lampsaque<ref>Diogène Laërce, II, 16 (DK 60 A 1) ; Simplicius, ''Commentaire sur la Physique'', 27, 23 (DK 60 A 7). La formule que l'on rencontre parfois, selon laquelle Archélaos aurait « succédé à Anaxagore à Lampsaque », n'est pas documentée par les sources : Archélaos est attesté comme actif à Athènes, où il aurait été le maître de Socrate. Sur ce point, voir Gábor Betegh, « Archelaus on Cosmogony and the Origins of Social Institutions », ''Oxford Studies in Ancient Philosophy'', vol. 51, 2016, p. 1-40.</ref>. Selon plusieurs témoignages anciens, Archélaos aurait été le maître de Socrate, ce qui établit un lien biographique, quoique indirect, entre Anaxagore et le fondateur de la philosophie morale<ref>Diogène Laërce, II, 16 (DK 60 A 1). Ion de Chios rapporte que le jeune Socrate voyagea avec Archélaos à Samos (DK 60 A 3).</ref>. Archélaos semble avoir développé et modifié certaines doctrines de son maître, en particulier en appliquant les principes anaxagoréens à l'éthique et aux institutions sociales, orientation qui anticipe peut-être le tournant moral pris ensuite par Socrate<ref>Diogène Laërce, II, 16 (DK 60 A 1) ; Hippolyte, DK 60 A 4 ; Gábor Betegh, 2016.</ref>. === L'influence sur Socrate : espoirs et déceptions === La relation entre Anaxagore et Socrate a probablement été indirecte, médiée par la lecture du livre. Dans le ''Phédon'', Platon fait raconter par Socrate sa rencontre avec la pensée d'Anaxagore, rencontre qui suscita d'abord un enthousiasme puis une déception<ref>Platon, ''Phédon'', 97b-98c (DK 59 A 47).</ref>. Comme on l'a souligné plus haut, cette déception porte sur une attente proprement socratique, celle d'une explication par le « meilleur », qu'Anaxagore n'avait pas, à proprement parler, formulée dans les termes que Socrate aurait voulus. Cette critique conduisit Socrate à se tourner vers la philosophie morale et la recherche de la cause finale, c'est-à-dire du Bien qui rendrait compte de l'ordre du monde<ref>Platon, ''Phédon'', 99c-100a. Cf. David Sedley, « Teleology and Myth in the ''Phaedo'' », ''Proceedings of the Boston Area Colloquium in Ancient Philosophy'', vol. 5, 1989, p. 359-383.</ref>. L'idée qu'un principe rationnel puisse gouverner l'univers, idée que Socrate trouve chez Anaxagore et qu'il juge insuffisamment exploitée, a pu orienter le projet socratique sans qu'il faille pour autant présenter Anaxagore comme sa cause nécessaire<ref>David Sider, « Anaxagoras, Socrates, and the History of "Philosophy" », ''Research Bulletin of the CHS'', 2016 ; W. K. C. Guthrie, 1965, p. 327-331.</ref>. Dans l'''Apologie'', l'accusation portée contre Socrate inclut l'imputation de théories cosmologiques manifestement inspirées d'Anaxagore, ce qui montre l'association étroite entre les deux penseurs dans l'esprit des Athéniens, indépendamment de la distance philosophique réelle qui les sépare<ref>Platon, ''Apologie de Socrate'', 26d (DK 59 A 35). Cf. Gregory Vlastos, ''Socrates: Ironist and Moral Philosopher'', Ithaca, Cornell University Press, 1991, p. 293-297.</ref>. Xénophon présente pour sa part Socrate comme mettant en garde ses disciples contre l'étude des phénomènes célestes à la manière d'Anaxagore, ce qui laisse entendre que Socrate lui-même s'était explicitement démarqué de la philosophie naturelle anaxagoréenne<ref>Xénophon, ''Mémorables'', IV, 7, 6 (DK 59 A 47).</ref>. === L'appropriation platonicienne : du Noûs au Démiurge === Platon s'empare de la doctrine anaxagoréenne du Noûs et la transforme, en la radicalisant, en une cosmologie téléologique pleinement articulée. Dans le ''Timée'', Platon présente le Démiurge, cet artisan divin qui façonne le monde sensible à l'image des Formes éternelles, comme une figure qu'on peut lire en dialogue avec le Noûs anaxagoréen<ref>Platon, ''Timée'', 29a-30c, 47e-48a. Cf. Glenn Morrow, « Necessity and Persuasion in Plato's ''Timaeus'' », ''Philosophical Review'', vol. 59, 1950, p. 147-163 ; Luc Brisson, ''Le Même et l'Autre dans la structure ontologique du Timée de Platon'', Paris, Klincksieck, 1974, p. 87-125.</ref>. Il convient toutefois d'être prudent. La téléologie platonicienne va en effet bien au-delà de ce qu'affirmait Anaxagore : le Démiurge contemple les Formes éternelles pour façonner le monde, et cet arrière-plan métaphysique d'essences intelligibles n'a pas d'équivalent chez le Clazoménien, dont le Noûs demeure un principe moteur et cognitif, mais non un principe qui « voit » des réalités intelligibles préalables à son action. Dans le ''Philèbe'', Platon affirme explicitement sa dette envers Anaxagore en déclarant que « l'Intellect est roi du ciel et de la terre »<ref>Platon, ''Philèbe'', 28c (DK 59 A 47). Cf. également ''Cratyle'', 413c.</ref>, reprenant ainsi la doctrine anaxagoréenne selon laquelle « le Noûs domine tout »<ref>Anaxagore, B12 (DK 59 B 12).</ref>. Dans les ''Lois'', Platon fait l'éloge des « anciens » qui ont découvert que « l'Intellect gouverne toutes choses », allusion probable à Anaxagore<ref>Platon, ''Lois'', X, 897b-c, XII, 967b-c. Cf. Malcolm Schofield, 1980, p. 55-70.</ref>. L'influence d'Anaxagore sur Platon est donc réelle, mais elle passe par une transformation considérable de la doctrine originelle : le Noûs anaxagoréen, simple cause motrice, devient chez Platon un Intellect qui contemple le Bien et façonne le monde selon le meilleur ordre possible. Le passage d'Anaxagore à Platon est celui qui fait naître, en toute rigueur, la tradition téléologique de la philosophie occidentale. === La critique aristotélicienne === Aristote, tout en reconnaissant l'importance historique d'Anaxagore, fut l'un de ses critiques les plus sévères. Dans la ''Métaphysique'', il salue Anaxagore comme « un homme sobre parmi des bavards »<ref>Aristote, ''Métaphysique'', I, 3, 984b15-20 (DK 59 A 43).</ref>, louant son introduction du Noûs comme cause de l'ordre cosmique. Mais cette louange est immédiatement suivie d'une critique : Anaxagore « utilise l'Intellect comme un ''deus ex machina'' »<ref>Aristote, ''Métaphysique'', I, 4, 985a18-21 (DK 59 A 47).</ref>. Comme on l'a vu, cette critique présuppose un idéal téléologique qui n'est pas celui d'Anaxagore lui-même. Aristote adopte en revanche, en le reformulant, le terme technique homéomère (ὁμοιομερής) pour désigner les substances anaxagoréennes, bien qu'il soit probable qu'Anaxagore lui-même n'ait jamais utilisé ce mot<ref>Cf. Malcolm Schofield, 1980, p. 87-108.</ref>. La distinction que la tradition anaxagoréenne a léguée, entre substances homéomères (chair, os, sang) et substances anhoméomères (main, pied, visage), devient ainsi fondamentale dans la philosophie naturelle aristotélicienne, où elle servira à articuler l'analyse des parties du vivant<ref>Aristote, ''De la génération et de la corruption'', I, 1, 314a20-b1 ; ''Parties des animaux'', II, 1, 646a12-24.</ref>. === L'héritage dans la philosophie hellénistique et romaine === Après Aristote, la pensée d'Anaxagore continua d'exercer une influence diffuse. Les Stoïciens s'approprièrent certains aspects de sa doctrine du Noûs pour développer leur propre concept du Logos universel qui pénètre et gouverne toute la nature<ref>Diogène Laërce, VII, 134-139 (SVF II, 634) ; Cicéron, ''De la nature des dieux'', I, 11, 27 ; II, 8, 23. Cf. A. A. Long et D. N. Sedley, ''The Hellenistic Philosophers'', vol. I, Cambridge, Cambridge University Press, 1987, p. 268-274.</ref>. Le pneuma stoïcien présente des analogies avec le Noûs anaxagoréen, bien que les Stoïciens aient rejeté le dualisme matière/esprit d'Anaxagore en faveur d'un matérialisme intégral<ref>Michael J. White, « Stoic Natural Philosophy », dans Brad Inwood (éd.), ''The Cambridge Companion to the Stoics'', Cambridge, Cambridge University Press, 2003, p. 124-152.</ref>. Les Épicuriens, en revanche, rejetèrent la doctrine anaxagoréenne. Lucrèce critique explicitement Anaxagore dans le ''De natura rerum''<ref>Lucrèce, ''De la nature'', I, 830-920 (DK 59 A 44). Cf. David Sedley, ''Lucretius and the Transformation of Greek Wisdom'', Cambridge, Cambridge University Press, 1998, p. 24-33.</ref>. Dans la tradition néoplatonicienne, Anaxagore fut lu à travers le prisme de Platon. Simplicius, au VI{{e}} siècle de notre ère, consacra de longs passages de son commentaire sur la ''Physique'' d'Aristote à l'exégèse des fragments d'Anaxagore ; c'est d'ailleurs grâce à ces commentaires que la majeure partie de notre connaissance d'Anaxagore nous est parvenue<ref>Simplicius, ''Commentaire sur la Physique'' (passim).</ref>. === Un héritage à ne pas surinterpréter === Il est tentant de présenter Anaxagore comme un précurseur de la science mécaniste moderne, de l'atomisme, voire de la physique contemporaine. Il faut résister à cette tentation, au moins dans sa forme la plus large. Au XVII{{e}} siècle, certains philosophes mécanistes ont effectivement cité les présocratiques pour légitimer leur programme, mais c'est l'atomisme de Démocrite et de Leucippe, médiatisé par Épicure et par Lucrèce, qui a exercé une influence directe sur la physique corpusculaire naissante de Gassendi, Boyle et Newton. L'influence propre d'Anaxagore sur cette tradition reste, pour l'essentiel, limitée et indirecte : sa doctrine de la divisibilité infinie et du mélange universel s'oppose d'ailleurs aux postulats fondamentaux de l'atomisme classique, et c'est précisément cette opposition qui la rendait peu exploitable pour les mécanistes modernes<ref>Alan Chalmers, « Atomism from the 17th to the 20th Century », ''Stanford Encyclopedia of Philosophy'', 2005 (révisé 2014) ; Andrew Pyle, ''Atomism and its Critics : From Democritus to Newton'', Bristol, Thoemmes Press, 1997.</ref>. On trouve aussi, ici ou là, des rapprochements entre la doctrine anaxagoréenne du « tout dans tout » et certaines idées de la physique moderne : théorie des champs, intrication quantique, non-séparabilité des systèmes physiques. De tels rapprochements, parfois suggérés par des physiciens eux-mêmes (Werner Heisenberg évoque à l'occasion les présocratiques dans ses réflexions philosophiques), peuvent avoir une valeur heuristique ou pédagogique. Ils ne doivent pas pour autant être transformés en affirmations de continuité doctrinale. La physique quantique procède d'un appareil mathématique et expérimental qui n'a aucun équivalent chez les Grecs anciens, et les analogies conceptuelles qu'on peut tracer avec Anaxagore relèvent de la métaphore rétrospective, non de la filiation historique<ref>Werner Heisenberg, ''Physics and Philosophy'', New York, Harper, 1958, p. 62-63, évoque les présocratiques sans établir de filiation précise avec la physique quantique.</ref>. Il a été parfois suggéré, de manière analogue, que les grands théologiens médiévaux aient vu dans le Noûs un précurseur du Dieu créateur et ordonnateur. Cette suggestion demande une prudence particulière. Thomas d'Aquin, Maïmonide et Avicenne s'inscrivent dans une tradition aristotélicienne et néoplatonicienne déjà très élaborée, dans laquelle le Noûs anaxagoréen n'apparaît, quand il est mentionné, qu'à travers la médiation d'Aristote, et le plus souvent pour être critiqué. La théologie médiévale développe sa conception du Dieu créateur à partir de ressources propres (exégèse biblique, coranique ou talmudique, théologie négative néoplatonicienne, métaphysique aristotélicienne de l'acte pur), et non par appropriation directe de la doctrine anaxagoréenne. Il faut donc parler de continuités discrètes dans une histoire complexe, où la figure d'Anaxagore est plus souvent un repoussoir ou une étape dépassée qu'une source vive<ref>Sur la tradition aristotélicienne et néoplatonicienne médiévale, voir Étienne Gilson, ''L'esprit de la philosophie médiévale'', Paris, Vrin, 1932 ; sur la transmission arabe des présocratiques, voir Cristina D'Ancona, « Greek into Arabic: Neoplatonism in Translation », dans P. Adamson et R. C. Taylor (éd.), ''The Cambridge Companion to Arabic Philosophy'', Cambridge, Cambridge University Press, 2005, p. 10-31.</ref>. Une dernière mise en garde concerne la prédiction de l'éclipse et la chute du météorite d'Aigos Potamos, qui ont parfois été présentées comme des triomphes de la « méthode scientifique » naissante. En réalité, les sources qui attribuent à Anaxagore ces prouesses prédictives sont tardives et souvent légendaires ; les historiens des sciences contemporains, comme Daniel Graham ou Geoffrey Lloyd, se montrent prudents, voire sceptiques, sur l'authenticité de ces anticipations. L'importance historique d'Anaxagore ne tient pas à la précision de ses prédictions, mais à la cohérence et à l'ambition explicative de son système naturaliste, qui propose de rendre compte des phénomènes célestes par des principes physiques accessibles à la raison, sans recourir aux figures mythologiques traditionnelles. === Bilan === L'influence d'Anaxagore sur la postérité se caractérise par un contraste fondamental : d'un côté, son introduction du Noûs comme principe cosmique fut saluée comme une avancée majeure par Aristote lui-même, qui loue son caractère « sobre » par contraste avec les rêveries des premiers Ioniens ; de l'autre, son refus (ou son incapacité) à développer une explication par le « meilleur » fut jugée insuffisante par Socrate, Platon et Aristote. Cette dualité traverse toute l'histoire de sa réception : Anaxagore est à la fois le penseur qui a rendu pensable une cause intellectuelle du cosmos, et celui qui a laissé cette cause inemployée au goût de ses successeurs<ref>W. K. C. Guthrie, 1965, p. 327-331 ; Malcolm Schofield, 1980, p. 55-70 ; Daniel Graham, ''Science before Socrates'', Oxford, Oxford University Press, 2006, p. 152-158.</ref>. Cette limitation même fut paradoxalement féconde. En ouvrant une voie sans la parcourir jusqu'au bout, Anaxagore a invité ses successeurs à poursuivre le chemin, chacun à sa manière. Socrate s'est tourné vers la philosophie morale, en cherchant dans le Bien la cause que le Noûs anaxagoréen ne fournissait pas. Platon a développé, dans le ''Timée'' et ailleurs, une cosmologie téléologique dans laquelle le Démiurge contemple les Formes éternelles pour façonner le monde. Aristote a élaboré, contre Platon autant que contre Anaxagore, une doctrine systématique des quatre causes qui intègre la cause finale dans un schéma explicatif unifié. Tous trois ont puisé dans Anaxagore, chacun à sa manière, mais au prix d'une transformation qui leur appartient en propre. On peut donc parler d'une empreinte durable d'Anaxagore sur les orientations ultérieures de la philosophie grecque, sans pour autant soutenir que Socrate, Platon ou Aristote n'auraient pas été ce qu'ils furent sans lui : leurs doctrines ont leurs propres fondements, souvent en réaction à Anaxagore autant qu'en prolongement de lui, et la cause anaxagoréenne n'est, dans leur cas, jamais que partielle. Sur le plan scientifique, l'héritage d'Anaxagore est surtout celui d'un modèle d'explication naturaliste. Il propose des explications des phénomènes célestes et météorologiques en termes de substances et de processus physiques, sans recourir aux agents mythologiques qui peuplaient encore l'imaginaire grec traditionnel. Le soleil n'est plus Hélios mais une pierre incandescente ; la lune n'est plus une déesse mais un corps rocheux qui reçoit la lumière du soleil ; la foudre n'est plus le trait de Zeus mais le produit d'un phénomène atmosphérique. Cet héritage naturaliste n'est pas négligeable, et il a nourri durablement la tradition philosophique et scientifique grecque. Il serait pourtant excessif de lui attribuer à titre principal la fondation d'une « méthode scientifique » au sens moderne : l'élaboration de cette méthode suppose l'invention de la preuve démonstrative, le développement de la mathématisation de la nature, et bien d'autres étapes que la pensée d'Anaxagore n'a pas accomplies<ref>Daniel Gershenson et Daniel Greenberg, 1964, défendent une version forte de la thèse d'Anaxagore comme fondateur de la méthode scientifique, thèse qu'il convient de modérer. Cf. Geoffrey Lloyd, ''Early Greek Science : Thales to Aristotle'', Londres, Chatto & Windus, 1970, pour une perspective plus prudente.</ref>. En définitive, Anaxagore occupe une place singulière dans l'histoire de la philosophie : celle d'un pionnier qui ouvre une voie sans l'explorer entièrement, et qui a légué à ses successeurs à la fois une doctrine (dans ses fragments conservés) et la tâche philosophique de combler ce que cette doctrine laisse ouvert. Cette position intermédiaire entre la cosmologie ionienne, dont il est le dernier grand représentant à Athènes, et la philosophie classique, dont il est l'un des principaux préparateurs, fait d'Anaxagore une figure pivot, dont l'intérêt philosophique propre ne doit pas être dilué dans l'histoire des influences qu'il a exercées. == Notes et références == {{references|colonnes=2}} == Bibliographie == === Textes anciens : éditions et traductions === ; Diels, Hermann & Kranz, Walther (éds.) : ''Die Fragmente der Vorsokratiker'', 3 vol., Berlin, Weidmann, 1951-1952 (6{{e}} éd.) : [Édition standard de référence pour les fragments présocratiques, avec le système de numérotation DK (Diels-Kranz) utilisé dans la présente étude] ; Laks, André & Most, Glenn W. (éds.) : ''Early Greek Philosophy'', 9 vol., Loeb Classical Library, Cambridge (Mass.), Harvard University Press, 2016 : [Édition plus récente avec traduction anglaise et nouveau système de numérotation, utile en complément de Diels-Kranz] ; Kirk, G. S., Raven, J. E. & Schofield, M. (éds.) : ''The Presocratic Philosophers: A Critical History with a Selection of Texts'', 2{{e}} édition, Cambridge, Cambridge University Press, 1983 : [Traductions anglaises commentées des fragments] ; Curd, Patricia (éd.) : ''Anaxagoras of Clazomenae: Fragments and Testimonia'', Toronto, University of Toronto Press, 2007 : [Édition critique avec traductions anglaises commentées et analyses détaillées] ; Sider, David (éd.) : ''The Fragments of Anaxagoras: With a Commentary'', Sankt Augustin, Academia Verlag, 2005 : [Édition avec commentaire détaillé] ; Platon : ''Phédon'', trad. fr. Monique Dixsaut, Paris, GF-Flammarion, 1991 : [Dialogue contenant la critique socratique du Noûs d'Anaxagore] ; Platon : ''Apologie de Socrate'', trad. fr. Luc Brisson, Paris, GF-Flammarion, 1997 ; Platon : ''Timée'', trad. fr. Luc Brisson, Paris, GF-Flammarion, 1992 ; Platon : ''Philèbe'', trad. fr. Alfred Diès, Paris, Les Belles Lettres, 1941 ; Platon : ''Lois'', trad. fr. Édouard des Places, Paris, Les Belles Lettres, 1951-1956 ; Aristote : ''Métaphysique'', trad. fr. Jean Tricot, Paris, Vrin, 1933 ; Aristote : ''Physique'', trad. fr. Jean Tricot, Paris, Vrin, 1936 ; Aristote : ''Du Ciel'', trad. fr. Jean Tricot, Paris, Vrin, 1949 ; Aristote : ''Génération et corruption'', trad. fr. Jean Tricot, Paris, Vrin, 1950 ; Aristote : ''Génération des animaux'', trad. fr. Jean Tricot, Paris, Vrin, 1957 ; Aristote : ''Histoire des animaux'', trad. fr. Jean Tricot, Paris, Vrin, 1957 ; Aristote : ''Parties des animaux'', trad. fr. Jean Tricot, Paris, Vrin, 1957 ; Aristote : ''De l'âme'', trad. fr. Richard Bodéüs, Paris, GF-Flammarion, 1993 ; Diogène Laërce : ''Vies et doctrines des philosophes illustres'', sous la dir. de Marie-Odile Goulet-Cazé, Paris, Le Livre de Poche (La Pochothèque), 1999 ; Théophraste : ''De Sensibus'' (''On Sense Perception''), trad. angl. dans Kirk, Raven & Schofield, 1983 ; Simplicius : ''In Aristotelis Physicorum libros commentaria'', éd. Hermann Diels, Berlin, Reimer, 1882-1895 : [Source principale pour la transmission des fragments d'Anaxagore] ; Hippolyte : ''Réfutation de toutes les hérésies'', trad. angl. dans Curd, 2007 ; Lucrèce : ''De la nature'', trad. fr. Alfred Ernout, Paris, Les Belles Lettres, 1920 ; Cicéron : ''De la nature des dieux'', trad. fr. Clara Auvray-Assayas, Paris, Les Belles Lettres, 2002 ; Plutarque : ''Vies parallèles'' (''Vie de Périclès'', ''Vie de Lysandre''), trad. fr. Anne-Marie Ozanam, Paris, Gallimard, Bibliothèque de la Pléiade, 2001 ; Xénophon : ''Mémorables'', trad. fr. Louis-André Dorion et Michele Bandini, Paris, Les Belles Lettres, 2000-2011 === Études modernes : histoire et philosophie antiques === ; Schofield, Malcolm : ''An Essay on Anaxagoras'', Cambridge, Cambridge University Press, 1980 : [Monographie majeure : étude exhaustive de la pensée anaxagoréenne avec analyse textuelle détaillée] ; Curd, Patricia : « Anaxagoras », ''Stanford Encyclopedia of Philosophy'', publié 2007, révision substantielle 2019 : [Synthèse de référence, avec bibliographie à jour] ; Guthrie, W. K. C. : ''A History of Greek Philosophy'', vol. II : ''The Presocratic Tradition from Parmenides to Democritus'', Cambridge, Cambridge University Press, 1965 ; Barnes, Jonathan : ''The Presocratic Philosophers'', 2 vol., Londres, Routledge, 1982 (révisé 2006) ; Kirk, G. S., Raven, J. E. & Schofield, M. : ''The Presocratic Philosophers: A Critical History with a Selection of Texts'', 2{{e}} édition, Cambridge, Cambridge University Press, 1983 ; Vlastos, Gregory : « The Physical Theory of Anaxagoras », ''Philosophical Review'', vol. 59, 1950, p. 31-57 ; Peck, Arthur L. : « Anaxagoras: Predication as a Problem in Physics », ''Classical Quarterly'', vol. 25, 1931, p. 27-37 et p. 112-120 ; Strang, Colin : « The Physical Theory of Anaxagoras », ''Archiv für Geschichte der Philosophie'', vol. 45, 1963, p. 101-118 ; Cornford, F. M. : « Anaxagoras' Theory of Matter », ''Classical Quarterly'', vol. 24, 1930, p. 14-30 ; Graham, Daniel W. : « Was Anaxagoras a Reductionist? », ''Ancient Philosophy'', vol. 24, 2004, p. 1-18 ; Graham, Daniel W. : ''Science before Socrates: Parmenides, Anaxagoras, and the New Astronomy'', Oxford, Oxford University Press, 2006 ; Curd, Patricia : ''The Legacy of Parmenides: Eleatic Monism and Later Presocratic Thought'', Princeton, Princeton University Press, 1998 ; Owen, G. E. L. : « The Place of the Timaeus in Plato's Dialogues », ''Classical Quarterly'', vol. 3, 1953, p. 79-95 ; repris dans ''Logic, Science and Dialectic'', Londres, Duckworth, 1986 ; Raven, J. E. : « The Basis of Anaxagoras' Cosmology », ''Classical Quarterly'', vol. 4, 1954, p. 123-137 ; Kerferd, George B. : « Anaxagoras and the Concept of Matter before Aristotle », ''Bulletin of the John Rylands Library'', vol. 52, 1969, p. 129-143 ; Lloyd, David : « Anaxagoras on Life and Mind », ''Phronesis'', vol. 14, 1969, p. 246-251 ; Deichgräber, Karl : « Anaxagoras Stil », ''Philologus'', vol. 87, 1933, p. 15-26 ; Norden, Eduard : ''Agnostos Theos: Untersuchungen zur Formengeschichte religiöser Rede'', Leipzig, Teubner, 1913 ; Taylor, A. E. : « On the Date of the Trial of Anaxagoras », ''Classical Quarterly'', vol. 11, 1917, p. 81-87 ; Kahn, Charles H. : ''Anaximander and the Origins of Greek Cosmology'', New York, Columbia University Press, 1960 ; Inwood, Brad : « Anaxagoras and Infinite Divisibility », ''Illinois Classical Studies'', vol. 11, 1986, p. 17-33 ; Sedley, David : ''Creationism and Its Critics in Antiquity'', Berkeley, University of California Press, 2007 ; Sedley, David : « Teleology and Myth in the ''Phaedo'' », ''Proceedings of the Boston Area Colloquium in Ancient Philosophy'', vol. 5, 1989, p. 359-383 ; Betegh, Gábor : « Archelaus on Cosmogony and the Origins of Social Institutions », ''Oxford Studies in Ancient Philosophy'', vol. 51, 2016, p. 1-40 ; Sider, David : « Anaxagoras, Socrates, and the History of "Philosophy" », ''Research Bulletin of the Center for Hellenic Studies'', 31 octobre 2016 ; Furley, David L. : ''Two Studies in the Greek Atomists'', Princeton, Princeton University Press, 1967 ; Furley, David L. : « Anaxagoras, Plato and Naming of Parts », dans ''Presocratic Philosophy: Essays in Honour of Alexander Mourelatos'', éd. Victor Caston et Daniel Graham, Aldershot, Ashgate, 2002, p. 119-126 ; Furth, Montgomery : « A Philosophical Hero? Anaxagoras and the Eleatics », ''Oxford Studies in Ancient Philosophy'', vol. 9, 1991, p. 95-129 ; Lesher, James : « Mind's Knowledge and Powers of Control in Anaxagoras », ''Phronesis'', vol. 40, 1995, p. 125-142 ; Marmodoro, Anna : « Anaxagoras's Qualitative Gunk », ''British Journal for the History of Philosophy'', vol. 23, 2015, p. 402-422 ; Marmodoro, Anna & Morison, Benjamin (éds.) : ''Everything in Everything: Anaxagoras's Metaphysics'', Oxford, Oxford University Press, 2019 ; Vassallo, Christian : « Nous, Motion, and Teleology in Anaxagoras », ''Oxford Studies in Ancient Philosophy'', vol. 50, 2016, p. 1-32 === Études modernes : biologie, physiologie et philosophie naturelle === ; Gershenson, Daniel E. & Greenberg, Daniel A. : ''Anaxagoras and the Birth of Scientific Method'', New York, Blaisdell, 1964 : [À utiliser avec précaution : la thèse centrale sur la « naissance de la méthode scientifique » doit être tempérée] ; Meyer, Arthur William : ''Essays on the History of Embryology'', Stanford, Stanford University Press, 1939 ; Preus, Anthony : « The Techne of Nutrition in Ancient Greek Philosophy », ''Apeiron'', vol. 53, 2020, p. 97-124 ; Kember, Oliver : « Anaxagoras' Theory of Sex Differentiation and Heredity », ''Phronesis'', vol. 18, 1973, p. 1-14 ; Mittwoch, Ursula : « Sex Determination: Science & Society Series on Sex and Science », ''EMBO Reports'', vol. 14, 2013, p. 588-592 ; Kupreeva, Inna : « Sensing the World: Humans, Plants, and the Physicality of Life in Early Greek Philosophy », dans ''Physis and Psyche in Plato and Aristotle'', éd. S. D. Kolstrup et T. L. Kind, Londres, Bloomsbury, 2024, p. 95-114 === Études modernes : astronomie, cosmologie et météorologie === ; Theodossiou, Evangelos Th., Dimitrijevic, Milcho S., Mantarakis, Nikos A. & Georgakarakos, Nikolaos I. : « The Fall of a Meteorite at Aegos Potami in 467/6 BC », ''Journal of Astronomical History and Heritage'', vol. 5, 2002, p. 135-140 ; Graham, Daniel W. & Hintz, Eric : « Anaxagoras and the Comet », ''Apeiron'', vol. 40, 2007, p. 1-20 ; Couprie, Dirk L. : « Anaxagoras on the Milky Way and Lunar Eclipses », ''Rhizomata'', vol. 5, 2017, p. 127-147 ; Lloyd, Geoffrey E. R. : ''Early Greek Science: Thales to Aristotle'', Londres, Chatto & Windus, 1970 === Études modernes : influence et réception === ; Vlastos, Gregory : ''Socrates: Ironist and Moral Philosopher'', Ithaca, Cornell University Press, 1991 ; Morrow, Glenn R. : « Necessity and Persuasion in Plato's ''Timaeus'' », ''Philosophical Review'', vol. 59, 1950, p. 147-163 ; Brisson, Luc : ''Le Même et l'Autre dans la structure ontologique du Timée de Platon'', Paris, Klincksieck, 1974 ; Johansen, Thomas Kjeller : ''Plato's Natural Philosophy'', Cambridge, Cambridge University Press, 2004 ; Johansen, Thomas Kjeller : « From Craft to Nature: The Emergence of Natural Teleology », dans ''Plato and Hesiod'', éd. G. R. Boys-Stones et J. H. Haubold, Oxford, Oxford University Press, 2020, p. 100-125 ; Long, A. A. & Sedley, D. N. : ''The Hellenistic Philosophers'', vol. I, Cambridge, Cambridge University Press, 1987 ; White, Michael J. : « Stoic Natural Philosophy », dans ''The Cambridge Companion to the Stoics'', éd. Brad Inwood, Cambridge, Cambridge University Press, 2003, p. 124-152 ; Sedley, David : ''Lucretius and the Transformation of Greek Wisdom'', Cambridge, Cambridge University Press, 1998 ; Chalmers, Alan : « Atomism from the 17th to the 20th Century », ''Stanford Encyclopedia of Philosophy'', 2005 (révisé 2014) ; Pyle, Andrew : ''Atomism and its Critics: From Democritus to Newton'', Bristol, Thoemmes Press, 1997 ; Gilson, Étienne : ''L'esprit de la philosophie médiévale'', Paris, Vrin, 1932 ; Heisenberg, Werner : ''Physics and Philosophy'', New York, Harper, 1958 : [À consulter pour les rapprochements prudents entre présocratiques et physique moderne, à titre d'analogie heuristique] === Instruments de recherche et ressources === ; Curd, Patricia : « Anaxagoras », ''Stanford Encyclopedia of Philosophy'', 2007 (révision substantielle 2019) ; Graham, Daniel W. : « Presocratic Philosophy », ''Stanford Encyclopedia of Philosophy'', 2019 ; ''Oxford Classical Dictionary'' : s.v. « Anaxagoras », diverses éditions : [À consulter pour la mise en garde prudente sur la tradition biographique] === Dictionnaires et encyclopédies === ; Goulet, Richard (éd.) : ''Dictionnaire des philosophes antiques'', vol. I, Paris, CNRS Éditions, 1989 (2{{e}} éd. 2003) : [Entrée détaillée sur Anaxagore avec bibliographie] {{autocat}} [[Catégorie:Philosophe]] {{DEFAULTSORT:Anaxagore}} 1h66pr9pypy48lle7v4ytb82zi607jy Discussion utilisateur:Jean-Jacques MILAN/Livre d'or 3 83942 768091 767794 2026-06-18T19:09:04Z DavidL 1746 768091 wikitext text/x-wiki Jean-Jacques Milan est mort le {{Date-|12|4|2026}}. Il était passionné de photo et contributeur sur 3 gros projets. Il totalisait {{unité|80000 contributions}} à travers les projets. == Messages d'utilisateurs == <gallery> File:Candleburning.jpg|Condoléances à Élise, sa femme, et toute sa famille. [[user:Eihel|Eihel]] </gallery> ---- On a eu des débuts un peu rugueux ^^ (les torts étaient partagés) mais au final, on s'appréciait mutuellement... [[Utilisateur:Cdang|Cdang]] ([[Discussion utilisateur:Cdang|discussion]]) 15 juin 2026 à 01:31 (CEST) ---- Sincères condoléances. [[Utilisateur:JackPotte|JackPotte]] ([[Discussion utilisateur:JackPotte|<span style="color:#FF6600">$</span>♠]]) 15 juin 2026 à 16:21 (CEST) ---- Condoléances à tous ceux qui le connaissait. Nous avons perdu un contributeur important : en plus d'avoir créé [[Photographie|le plus grand livre du projet]], il a mis en place et développé [[Wikilivres:CDU|le système de classement des livres]]. --&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 18 juin 2026 à 21:09 (CEST) 5gfyw5xyfdqt6tsbewpfiwyy2o38end Fonctionnement d'un ordinateur/Les circuits incrémenteurs/décrémenteurs 0 83953 768007 2026-06-18T14:26:56Z Mewtow 31375 Page créée avec « Le circuit '''incrémenteur''' incrémente un nombre entier. Plus précisément, il prend en entrée un nombre entier, et fournit en entier le nombre suivant, il lui ajoute 1. Une telle opération peut paraitre triviale et peu intéressante. Cependant, elle est très utilisée et est absolument cruciale pour créer des circuits capables de compter ou décompter. De plus, au-delà de leur utilisation dans les compteurs, les incrémenteurs étaient très utilisés... » 768007 wikitext text/x-wiki Le circuit '''incrémenteur''' incrémente un nombre entier. Plus précisément, il prend en entrée un nombre entier, et fournit en entier le nombre suivant, il lui ajoute 1. Une telle opération peut paraitre triviale et peu intéressante. Cependant, elle est très utilisée et est absolument cruciale pour créer des circuits capables de compter ou décompter. De plus, au-delà de leur utilisation dans les compteurs, les incrémenteurs étaient très utilisés sur les premiers processeurs 8 bits, comme le Z-80, le 6502, les premiers processeurs x86 comme le 8008, le 8086, le 8085, et bien d'autres. Il s'agit de circuits assez simples, bien plus simples que les additionneurs. Ils peuvent reprendre les optimisations présentes dans les additionneurs, comme l'anticipation de retenue ou le ''carry skip'', mais ces techniques sont bien plus simples à utiliser avec un incrémenteur. Il existe aussi des ''circuits décrémenteurs'', qui décrémentent une opérande, ainsi que des ''circuits incrémenteur-décrémenteur'', qui peuvent incrémenter ou décrémenter, selon comment on les configure. Je ne vais pas détailler ces circuits plus que ça, car de tels circuits sont assez rares, comparé à un circuit incrémenteur simple. ==L'incrémenteur à propagation de retenue== Le circuit incrémenteur se construit sur la même base qu'un additionneur, qu'on simplifie. L'opération effectuée est la suivante : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Le calcul alors très simple : il suffit d'additionner 1 au bit de poids faible, sur la colonne la plus à droite, et propager les retenues pour les autres colonnes. En clair, on n'additionne que deux bits à chaque colonne : un 1 sur celle tout à droite, la retenue de la colonne précédente pour les autres. En clair : un incrémenteur est un additionneur normal, dont on a remplacé les additionneurs complets par des demi-additionneurs. Le 1 le plus à droite est injecté sur l'entrée de retenue entrante de l'additionneur. Et cela marche avec tous les types d'additionneurs, que ce soit des additionneurs à propagation de retenue, à anticipation de retenue, etc. Un '''incrémenteur à propagation de retenue''' est donc constitué de demi-additionneurs enchaînés les uns à la suite des autres. Le circuit incrémenteur basique est équivalent à un additionneur à propagation de retenue, mais où on aurait remplacé tous les additionneurs complets par des demi-additionneurs. [[File:Circuit incrémenteur.png|centre|vignette|upright=3|Circuit incrémenteur.]] Maintenant, regardons le demi-additionneur le plus à droite, celui pour le bit de poids faible. Son entrée de retenue entrante est mise à 1 pour faire l'incrémentation. Quelques incrémenteurs permettent de configurer cette entrée de retenue à 0 ou à 1, ce qui effectue : soit une opération identité (l'opérande est recopié sur la sortie), soit une incrémentation. Un tel circuit est nommé un '''incrémenteur commandable'''. Nous aurons à utiliser une fois ou deux de tels incrémenteurs commandables dans la suite du cours. ==Les incrémenteurs ''carry skip''== Il est possible d'optimiser un incrémenteur, sur le même modèle que les additionneurs vus plus haut. Une optimisation intéressante est de faire l'incrémentation, non pas bit par bit, mais par paquets de deux bits. le résultat est que l'incrémentation est deux fois plus rapide, ou presque. Le circuit incrémenteur est donc composé en enchainant non pas des demi-additionneurs, mais des '''incrémenteurs 2 bits''' qui incrémentent une opérande de deux bits. [[File:Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits.png|centre|vignette|upright=2.5|Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits]] Reste à concevoir l'incrémenteur 2 bits. Une première solution part de deux demi-additionneurs et effectue quelques simplifications au niveau des transistors et des portes logiques. Par exemple, l'Intel 8085 a utilisé un circuit optimisé, fabriqué avec des portes NAND et NOR. La raison est qu'avec les technologies de transistors CMOS actuelles, les portes NAND et NOR utilisent moins de transistors que les portes ET et OU. Et cette possibilité a été utilisé pour effectuer des simplifications assez mineures, mais toujours bonnes à prendre. Mais nous ne pouvons pas en parler ici. Une solution alternative fabrique des incrémenteurs 2 bits qui calculent séparément les deux bits du résultat et la retenue sortante. La retenue sortante est calculée à partir des bits de l’opérande, sans propager des retenues. Ainsi, la retenue sortante est connu en avance, sans passer par deux demi-additionneurs. Pour créer un tel incrémenteur, le mieux est de partir de sa table de vérité. {|class="wikitable" |- ! Opérande !! Retenue entrante !! !! Retenue sortante !! Résultat |- | 00 || 0 || || 0 || 00 |- | 01 || 0 || || 0 || 01 |- | 10 || 0 || || 0 || 10 |- | 11 || 0 || || 0 || 11 |- | colspan="5" | |- | 00 || 1 || || 0 || 01 |- | 01 || 1 || || 0 || 10 |- | 10 || 1 || || 0 || 11 |- | 11 || 1 || || 1 || 00 |} Elle nous dit que la retenue sortante ne vaut 1 que dans un seul cas : les deux bits d'opérande valent 1, la retenue entrante vaut 1. Elle se calcule alors avec une porte ET à trois entrées. Pour les deux bits du résultat, les équations logiques ne donnent pas un résultat satisfaisant. La solution la plus simple est d'utiliser deux demi-additionneurs et de retirer les portes logiques superflues. Le résultat est alors un '''incrémenteur 2 bits ''carry skip''''', où la retenue sortante est calculée séparément du reste. [[File:Incrémenteur carry skip 2 bits.png|centre|vignette|upright=2.5|Incrémenteur ''carry skip'' 2 bits]] ==Les incrémenteurs à anticipation de retenue== Il est possible d'utiliser l'anticipation de retenue pour un incrémenteur. Et celle-ci est assez simple, car déterminer la retenue ne demande pas de calculs complexes, contrairement à l'addition. Pour le comprendre, on peut regarder comment la retenue sortant d'un demi-additionneur est formée. Elle est calculée en faisant un ET logique entre la retenue entrante et le bit d'opérande. Une retenue est donc un ET logique entre toutes les retenues précédentes. Un autre moyen de s'en rendre compte est de regarder une suite de nombres codés en binaire : * 000 * 001 * 010 * 011 * 100 * 101 * 110 * 111 Il faut remarquer que lors d'une incrémentation, un bit s'inverse quand les bits des colonnes précédentes valent tous 1. Rappelons qu'additionner un bit avec une retenue inverse celui-ci si la retenue vaut 1, le recopie à l'identique si la retenue vaut zéro. Déterminer si les N bits précédents sont à 1 demande un simple ET entre les bits en question. Un incrémenteur à anticipation de retenue est donc composé d'un paquet de portes ET, avec pas mal de redondance entre les portes. Pour éviter de gaspiller trop de portes logiques, une solution est de mélanger anticipation de retenues et propagation de retenue. Par exemple, pour un incrémenteur 32 bits, on peut découper l'opérande en 4 octets : on anticipe les retenues pour chaque octet, mais l'incrémentation de chaque octet se fait avec propagation de retenue et/ou ''carry skip''. [[File:Incrémenteur à anticipation de retenues.png|centre|vignette|upright=3|Incrémenteur hybride utilisant partiellement l'anticipation de retenues.]] Quelques processeurs utilisaient l'anticipation de retenues. Par exemple, le processeur Z-80 de Zilog utilisait un incrémenteur pour des nombres de 16 bits, ce qui demandait des performances assez élevées. Et cet incrémenteur utilisait à la fois anticipation de retenues et ''carry skip''. Il était découpé en quatre blocs avant anticipation de retenues entre eux : un bloc regroupant les 7 bits de poids faible, suivi par un bloc de 5 bits, lui-même suivi par un bloc de 3 bits, terminé par un dernier bit isolé. A l'intérieur de ces blocs, les bits sont regroupés en paires utilisant le ''carry skip''. Pour ceux qui veulent en savoir plus sur cet incrémenteur, voici un lien sur le sujet : * [https://www.righto.com/2013/11/the-z-80s-16-bit-incrementdecrement.html The Z-80's 16-bit increment/decrement circuit reverse engineered]. odkrjrcj5imavrkqq037bw9ydo8qw04 768009 768007 2026-06-18T14:30:50Z Mewtow 31375 /* L'incrémenteur à propagation de retenue */ 768009 wikitext text/x-wiki Le circuit '''incrémenteur''' incrémente un nombre entier. Plus précisément, il prend en entrée un nombre entier, et fournit en entier le nombre suivant, il lui ajoute 1. Une telle opération peut paraitre triviale et peu intéressante. Cependant, elle est très utilisée et est absolument cruciale pour créer des circuits capables de compter ou décompter. De plus, au-delà de leur utilisation dans les compteurs, les incrémenteurs étaient très utilisés sur les premiers processeurs 8 bits, comme le Z-80, le 6502, les premiers processeurs x86 comme le 8008, le 8086, le 8085, et bien d'autres. Il s'agit de circuits assez simples, bien plus simples que les additionneurs. Ils peuvent reprendre les optimisations présentes dans les additionneurs, comme l'anticipation de retenue ou le ''carry skip'', mais ces techniques sont bien plus simples à utiliser avec un incrémenteur. Il existe aussi des ''circuits décrémenteurs'', qui décrémentent une opérande, ainsi que des ''circuits incrémenteur-décrémenteur'', qui peuvent incrémenter ou décrémenter, selon comment on les configure. Je ne vais pas détailler ces circuits plus que ça, car de tels circuits sont assez rares, comparé à un circuit incrémenteur simple. ==Le demi-additionneur== Le circuit incrémenteur effectue l'opération suivante : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Un incrémenteur basique doit donc faire une addition pour chaque colonne, et précisémment une addition de deux bits. Il se trouve que la table d'addition est très simple en binaire. Jugez plutôt : * 0 + 0 = 0, retenue = 0 ; * 0 + 1 = 1, retenue = 0 ; * 1 + 0 = 1, retenue = 0 ; * 1 + 1 = 0, retenue = 1. Un circuit capable d'additionner deux bits est donc simple à construire avec les techniques vues dans les premiers chapitres. On voit immédiatement que la colonne des retenues donne une porte ET, alors que celle du bit de somme est calculé par un XOR. Le circuit obtenu est appelé un '''demi-additionneur'''. {| class="flexible" |[[File:1-bit half-adder.svg|class=transparent|centre|Demi-addtionneur.]] |[[File:Half-adder.svg|centre|class=transparent|Circuit d'un demi-addtionneur.]] |} [[File:Full Adder Block.svg|vignette|upright=1|class=transparent|Additionneur complet.]] ==L'incrémenteur à propagation de retenue== Maintenant que l'on sait comment additionner deux bits, reprenons l'opération d'incrémentation : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Sur la colonne la plus à droite, il doit ajouter un au bit de poids faible. Pour les colonnes suivantes, la situation est plus compliquée, en raison de la présence de retenues. Le calcul alors très simple : il suffit d'additionner 1 au bit de poids faible, sur la colonne la plus à droite, et propager les retenues pour les autres colonnes. En clair, on n'additionne que deux bits à chaque colonne : un 1 sur celle tout à droite, la retenue de la colonne précédente pour les autres. En clair : un incrémenteur est un additionneur normal, dont on a remplacé les additionneurs complets par des demi-additionneurs. Le 1 le plus à droite est injecté sur l'entrée de retenue entrante de l'additionneur. Et cela marche avec tous les types d'additionneurs, que ce soit des additionneurs à propagation de retenue, à anticipation de retenue, etc. Un '''incrémenteur à propagation de retenue''' est donc constitué de demi-additionneurs enchaînés les uns à la suite des autres. Le circuit incrémenteur basique est équivalent à un additionneur à propagation de retenue, mais où on aurait remplacé tous les additionneurs complets par des demi-additionneurs. [[File:Circuit incrémenteur.png|centre|vignette|upright=3|Circuit incrémenteur.]] Maintenant, regardons le demi-additionneur le plus à droite, celui pour le bit de poids faible. Son entrée de retenue entrante est mise à 1 pour faire l'incrémentation. Quelques incrémenteurs permettent de configurer cette entrée de retenue à 0 ou à 1, ce qui effectue : soit une opération identité (l'opérande est recopié sur la sortie), soit une incrémentation. Un tel circuit est nommé un '''incrémenteur commandable'''. Nous aurons à utiliser une fois ou deux de tels incrémenteurs commandables dans la suite du cours. ==Les incrémenteurs ''carry skip''== Il est possible d'optimiser un incrémenteur, sur le même modèle que les additionneurs vus plus haut. Une optimisation intéressante est de faire l'incrémentation, non pas bit par bit, mais par paquets de deux bits. le résultat est que l'incrémentation est deux fois plus rapide, ou presque. Le circuit incrémenteur est donc composé en enchainant non pas des demi-additionneurs, mais des '''incrémenteurs 2 bits''' qui incrémentent une opérande de deux bits. [[File:Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits.png|centre|vignette|upright=2.5|Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits]] Reste à concevoir l'incrémenteur 2 bits. Une première solution part de deux demi-additionneurs et effectue quelques simplifications au niveau des transistors et des portes logiques. Par exemple, l'Intel 8085 a utilisé un circuit optimisé, fabriqué avec des portes NAND et NOR. La raison est qu'avec les technologies de transistors CMOS actuelles, les portes NAND et NOR utilisent moins de transistors que les portes ET et OU. Et cette possibilité a été utilisé pour effectuer des simplifications assez mineures, mais toujours bonnes à prendre. Mais nous ne pouvons pas en parler ici. Une solution alternative fabrique des incrémenteurs 2 bits qui calculent séparément les deux bits du résultat et la retenue sortante. La retenue sortante est calculée à partir des bits de l’opérande, sans propager des retenues. Ainsi, la retenue sortante est connu en avance, sans passer par deux demi-additionneurs. Pour créer un tel incrémenteur, le mieux est de partir de sa table de vérité. {|class="wikitable" |- ! Opérande !! Retenue entrante !! !! Retenue sortante !! Résultat |- | 00 || 0 || || 0 || 00 |- | 01 || 0 || || 0 || 01 |- | 10 || 0 || || 0 || 10 |- | 11 || 0 || || 0 || 11 |- | colspan="5" | |- | 00 || 1 || || 0 || 01 |- | 01 || 1 || || 0 || 10 |- | 10 || 1 || || 0 || 11 |- | 11 || 1 || || 1 || 00 |} Elle nous dit que la retenue sortante ne vaut 1 que dans un seul cas : les deux bits d'opérande valent 1, la retenue entrante vaut 1. Elle se calcule alors avec une porte ET à trois entrées. Pour les deux bits du résultat, les équations logiques ne donnent pas un résultat satisfaisant. La solution la plus simple est d'utiliser deux demi-additionneurs et de retirer les portes logiques superflues. Le résultat est alors un '''incrémenteur 2 bits ''carry skip''''', où la retenue sortante est calculée séparément du reste. [[File:Incrémenteur carry skip 2 bits.png|centre|vignette|upright=2.5|Incrémenteur ''carry skip'' 2 bits]] ==Les incrémenteurs à anticipation de retenue== Il est possible d'utiliser l'anticipation de retenue pour un incrémenteur. Et celle-ci est assez simple, car déterminer la retenue ne demande pas de calculs complexes, contrairement à l'addition. Pour le comprendre, on peut regarder comment la retenue sortant d'un demi-additionneur est formée. Elle est calculée en faisant un ET logique entre la retenue entrante et le bit d'opérande. Une retenue est donc un ET logique entre toutes les retenues précédentes. Un autre moyen de s'en rendre compte est de regarder une suite de nombres codés en binaire : * 000 * 001 * 010 * 011 * 100 * 101 * 110 * 111 Il faut remarquer que lors d'une incrémentation, un bit s'inverse quand les bits des colonnes précédentes valent tous 1. Rappelons qu'additionner un bit avec une retenue inverse celui-ci si la retenue vaut 1, le recopie à l'identique si la retenue vaut zéro. Déterminer si les N bits précédents sont à 1 demande un simple ET entre les bits en question. Un incrémenteur à anticipation de retenue est donc composé d'un paquet de portes ET, avec pas mal de redondance entre les portes. Pour éviter de gaspiller trop de portes logiques, une solution est de mélanger anticipation de retenues et propagation de retenue. Par exemple, pour un incrémenteur 32 bits, on peut découper l'opérande en 4 octets : on anticipe les retenues pour chaque octet, mais l'incrémentation de chaque octet se fait avec propagation de retenue et/ou ''carry skip''. [[File:Incrémenteur à anticipation de retenues.png|centre|vignette|upright=3|Incrémenteur hybride utilisant partiellement l'anticipation de retenues.]] Quelques processeurs utilisaient l'anticipation de retenues. Par exemple, le processeur Z-80 de Zilog utilisait un incrémenteur pour des nombres de 16 bits, ce qui demandait des performances assez élevées. Et cet incrémenteur utilisait à la fois anticipation de retenues et ''carry skip''. Il était découpé en quatre blocs avant anticipation de retenues entre eux : un bloc regroupant les 7 bits de poids faible, suivi par un bloc de 5 bits, lui-même suivi par un bloc de 3 bits, terminé par un dernier bit isolé. A l'intérieur de ces blocs, les bits sont regroupés en paires utilisant le ''carry skip''. Pour ceux qui veulent en savoir plus sur cet incrémenteur, voici un lien sur le sujet : * [https://www.righto.com/2013/11/the-z-80s-16-bit-incrementdecrement.html The Z-80's 16-bit increment/decrement circuit reverse engineered]. e9is5txtn0ic5bvadtnq9q5yg6h114l 768012 768009 2026-06-18T14:31:51Z Mewtow 31375 /* Les incrémenteurs à anticipation de retenue */ 768012 wikitext text/x-wiki Le circuit '''incrémenteur''' incrémente un nombre entier. Plus précisément, il prend en entrée un nombre entier, et fournit en entier le nombre suivant, il lui ajoute 1. Une telle opération peut paraitre triviale et peu intéressante. Cependant, elle est très utilisée et est absolument cruciale pour créer des circuits capables de compter ou décompter. De plus, au-delà de leur utilisation dans les compteurs, les incrémenteurs étaient très utilisés sur les premiers processeurs 8 bits, comme le Z-80, le 6502, les premiers processeurs x86 comme le 8008, le 8086, le 8085, et bien d'autres. Il s'agit de circuits assez simples, bien plus simples que les additionneurs. Ils peuvent reprendre les optimisations présentes dans les additionneurs, comme l'anticipation de retenue ou le ''carry skip'', mais ces techniques sont bien plus simples à utiliser avec un incrémenteur. Il existe aussi des ''circuits décrémenteurs'', qui décrémentent une opérande, ainsi que des ''circuits incrémenteur-décrémenteur'', qui peuvent incrémenter ou décrémenter, selon comment on les configure. Je ne vais pas détailler ces circuits plus que ça, car de tels circuits sont assez rares, comparé à un circuit incrémenteur simple. ==Le demi-additionneur== Le circuit incrémenteur effectue l'opération suivante : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Un incrémenteur basique doit donc faire une addition pour chaque colonne, et précisémment une addition de deux bits. Il se trouve que la table d'addition est très simple en binaire. Jugez plutôt : * 0 + 0 = 0, retenue = 0 ; * 0 + 1 = 1, retenue = 0 ; * 1 + 0 = 1, retenue = 0 ; * 1 + 1 = 0, retenue = 1. Un circuit capable d'additionner deux bits est donc simple à construire avec les techniques vues dans les premiers chapitres. On voit immédiatement que la colonne des retenues donne une porte ET, alors que celle du bit de somme est calculé par un XOR. Le circuit obtenu est appelé un '''demi-additionneur'''. {| class="flexible" |[[File:1-bit half-adder.svg|class=transparent|centre|Demi-addtionneur.]] |[[File:Half-adder.svg|centre|class=transparent|Circuit d'un demi-addtionneur.]] |} [[File:Full Adder Block.svg|vignette|upright=1|class=transparent|Additionneur complet.]] ==L'incrémenteur à propagation de retenue== Maintenant que l'on sait comment additionner deux bits, reprenons l'opération d'incrémentation : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Sur la colonne la plus à droite, il doit ajouter un au bit de poids faible. Pour les colonnes suivantes, la situation est plus compliquée, en raison de la présence de retenues. Le calcul alors très simple : il suffit d'additionner 1 au bit de poids faible, sur la colonne la plus à droite, et propager les retenues pour les autres colonnes. En clair, on n'additionne que deux bits à chaque colonne : un 1 sur celle tout à droite, la retenue de la colonne précédente pour les autres. En clair : un incrémenteur est un additionneur normal, dont on a remplacé les additionneurs complets par des demi-additionneurs. Le 1 le plus à droite est injecté sur l'entrée de retenue entrante de l'additionneur. Et cela marche avec tous les types d'additionneurs, que ce soit des additionneurs à propagation de retenue, à anticipation de retenue, etc. Un '''incrémenteur à propagation de retenue''' est donc constitué de demi-additionneurs enchaînés les uns à la suite des autres. Le circuit incrémenteur basique est équivalent à un additionneur à propagation de retenue, mais où on aurait remplacé tous les additionneurs complets par des demi-additionneurs. [[File:Circuit incrémenteur.png|centre|vignette|upright=3|Circuit incrémenteur.]] Maintenant, regardons le demi-additionneur le plus à droite, celui pour le bit de poids faible. Son entrée de retenue entrante est mise à 1 pour faire l'incrémentation. Quelques incrémenteurs permettent de configurer cette entrée de retenue à 0 ou à 1, ce qui effectue : soit une opération identité (l'opérande est recopié sur la sortie), soit une incrémentation. Un tel circuit est nommé un '''incrémenteur commandable'''. Nous aurons à utiliser une fois ou deux de tels incrémenteurs commandables dans la suite du cours. ==Les incrémenteurs ''carry skip''== Il est possible d'optimiser un incrémenteur, sur le même modèle que les additionneurs vus plus haut. Une optimisation intéressante est de faire l'incrémentation, non pas bit par bit, mais par paquets de deux bits. le résultat est que l'incrémentation est deux fois plus rapide, ou presque. Le circuit incrémenteur est donc composé en enchainant non pas des demi-additionneurs, mais des '''incrémenteurs 2 bits''' qui incrémentent une opérande de deux bits. [[File:Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits.png|centre|vignette|upright=2.5|Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits]] Reste à concevoir l'incrémenteur 2 bits. Une première solution part de deux demi-additionneurs et effectue quelques simplifications au niveau des transistors et des portes logiques. Par exemple, l'Intel 8085 a utilisé un circuit optimisé, fabriqué avec des portes NAND et NOR. La raison est qu'avec les technologies de transistors CMOS actuelles, les portes NAND et NOR utilisent moins de transistors que les portes ET et OU. Et cette possibilité a été utilisé pour effectuer des simplifications assez mineures, mais toujours bonnes à prendre. Mais nous ne pouvons pas en parler ici. Une solution alternative fabrique des incrémenteurs 2 bits qui calculent séparément les deux bits du résultat et la retenue sortante. La retenue sortante est calculée à partir des bits de l’opérande, sans propager des retenues. Ainsi, la retenue sortante est connu en avance, sans passer par deux demi-additionneurs. Pour créer un tel incrémenteur, le mieux est de partir de sa table de vérité. {|class="wikitable" |- ! Opérande !! Retenue entrante !! !! Retenue sortante !! Résultat |- | 00 || 0 || || 0 || 00 |- | 01 || 0 || || 0 || 01 |- | 10 || 0 || || 0 || 10 |- | 11 || 0 || || 0 || 11 |- | colspan="5" | |- | 00 || 1 || || 0 || 01 |- | 01 || 1 || || 0 || 10 |- | 10 || 1 || || 0 || 11 |- | 11 || 1 || || 1 || 00 |} Elle nous dit que la retenue sortante ne vaut 1 que dans un seul cas : les deux bits d'opérande valent 1, la retenue entrante vaut 1. Elle se calcule alors avec une porte ET à trois entrées. Pour les deux bits du résultat, les équations logiques ne donnent pas un résultat satisfaisant. La solution la plus simple est d'utiliser deux demi-additionneurs et de retirer les portes logiques superflues. Le résultat est alors un '''incrémenteur 2 bits ''carry skip''''', où la retenue sortante est calculée séparément du reste. [[File:Incrémenteur carry skip 2 bits.png|centre|vignette|upright=2.5|Incrémenteur ''carry skip'' 2 bits]] ==Les incrémenteurs à anticipation de retenue== Il est possible d'utiliser l'anticipation de retenue pour un incrémenteur. Et celle-ci est assez simple, car déterminer la retenue ne demande pas de calculs complexes, contrairement à l'addition. Pour le comprendre, on peut regarder comment la retenue sortant d'un demi-additionneur est formée. Elle est calculée en faisant un ET logique entre la retenue entrante et le bit d'opérande. Une retenue est donc un ET logique entre toutes les retenues précédentes. Un autre moyen de s'en rendre compte est de regarder une suite de nombres codés en binaire : * 000 * 001 * 010 * 011 * 100 * 101 * 110 * 111 Il faut remarquer que lors d'une incrémentation, un bit s'inverse quand les bits des colonnes précédentes valent tous 1. Rappelons qu'additionner un bit avec une retenue inverse celui-ci si la retenue vaut 1, le recopie à l'identique si la retenue vaut zéro. Déterminer si les N bits précédents sont à 1 demande un simple ET entre les bits en question. Un incrémenteur à anticipation de retenue est donc composé d'un paquet de portes ET, avec pas mal de redondance entre les portes. Pour éviter de gaspiller trop de portes logiques, une solution est de mélanger anticipation de retenues et propagation de retenue. Par exemple, pour un incrémenteur 32 bits, on peut découper l'opérande en 4 octets : on anticipe les retenues pour chaque octet, mais l'incrémentation de chaque octet se fait avec propagation de retenue et/ou ''carry skip''. [[File:Incrémenteur à anticipation de retenues.png|centre|vignette|upright=3|Incrémenteur hybride utilisant partiellement l'anticipation de retenues.]] Quelques processeurs utilisaient l'anticipation de retenues. Par exemple, le processeur Z-80 de Zilog utilisait un incrémenteur pour des nombres de 16 bits, ce qui demandait des performances assez élevées. Et cet incrémenteur utilisait à la fois anticipation de retenues et ''carry skip''. Il était découpé en quatre blocs avant anticipation de retenues entre eux : un bloc regroupant les 7 bits de poids faible, suivi par un bloc de 5 bits, lui-même suivi par un bloc de 3 bits, terminé par un dernier bit isolé. A l'intérieur de ces blocs, les bits sont regroupés en paires utilisant le ''carry skip''. Pour ceux qui veulent en savoir plus sur cet incrémenteur, voici un lien sur le sujet : * [https://www.righto.com/2013/11/the-z-80s-16-bit-incrementdecrement.html The Z-80's 16-bit increment/decrement circuit reverse engineered]. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de sélection | prevText=Les circuits de sélection | next=Les bascules : des mémoires de 1 bit | nextText=Les bascules : des mémoires de 1 bit }} </noinclude> s18pwvsb88w5u9ujncg7urg0wuo65zh 768013 768012 2026-06-18T14:35:35Z Mewtow 31375 /* L'incrémenteur à propagation de retenue */ 768013 wikitext text/x-wiki Le circuit '''incrémenteur''' incrémente un nombre entier. Plus précisément, il prend en entrée un nombre entier, et fournit en entier le nombre suivant, il lui ajoute 1. Une telle opération peut paraitre triviale et peu intéressante. Cependant, elle est très utilisée et est absolument cruciale pour créer des circuits capables de compter ou décompter. De plus, au-delà de leur utilisation dans les compteurs, les incrémenteurs étaient très utilisés sur les premiers processeurs 8 bits, comme le Z-80, le 6502, les premiers processeurs x86 comme le 8008, le 8086, le 8085, et bien d'autres. Il s'agit de circuits assez simples, bien plus simples que les additionneurs. Ils peuvent reprendre les optimisations présentes dans les additionneurs, comme l'anticipation de retenue ou le ''carry skip'', mais ces techniques sont bien plus simples à utiliser avec un incrémenteur. Il existe aussi des ''circuits décrémenteurs'', qui décrémentent une opérande, ainsi que des ''circuits incrémenteur-décrémenteur'', qui peuvent incrémenter ou décrémenter, selon comment on les configure. Je ne vais pas détailler ces circuits plus que ça, car de tels circuits sont assez rares, comparé à un circuit incrémenteur simple. ==Le demi-additionneur== Le circuit incrémenteur effectue l'opération suivante : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Un incrémenteur basique doit donc faire une addition pour chaque colonne, et précisémment une addition de deux bits. Il se trouve que la table d'addition est très simple en binaire. Jugez plutôt : * 0 + 0 = 0, retenue = 0 ; * 0 + 1 = 1, retenue = 0 ; * 1 + 0 = 1, retenue = 0 ; * 1 + 1 = 0, retenue = 1. Un circuit capable d'additionner deux bits est donc simple à construire avec les techniques vues dans les premiers chapitres. On voit immédiatement que la colonne des retenues donne une porte ET, alors que celle du bit de somme est calculé par un XOR. Le circuit obtenu est appelé un '''demi-additionneur'''. {| class="flexible" |[[File:1-bit half-adder.svg|class=transparent|centre|Demi-addtionneur.]] |[[File:Half-adder.svg|centre|class=transparent|Circuit d'un demi-addtionneur.]] |} [[File:Full Adder Block.svg|vignette|upright=1|class=transparent|Additionneur complet.]] ==L'incrémenteur à propagation de retenue== Maintenant que l'on sait comment additionner deux bits, reprenons l'opération d'incrémentation : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Sur la colonne la plus à droite, il doit ajouter un au bit de poids faible. Pour les colonnes suivantes, il faut additionner le bit de l'opérande avec la retenue de la colonne précédente. En clair, on n'additionne que deux bits à chaque colonne : un 1 sur celle tout à droite, la retenue de la colonne précédente pour les autres. Et cela nous donne une idée de comment faire pour créer le circuit incrémenteur. Il suffit d'utiliser un demi-additionneur par colonne, et de les enchainer les uns à la suite des autres. Chaque demi-additionneur additionne le bit de l'opérande avec la retenue fournie par le demi-additionneur précédent. Le seul qui fait exception est celui pour la colonne de poids faible. Pour celui là, il doit ajouter 1 au bit de poids faible. Du moins, c'est le cas le plus simple. Il est aussi possible de configurer ce bit d'entrée, en l'envoyant sur une entrée du circuit incrémenteur. Dans ce cas, le circuit ne fait rien si on envoie un zéro sur cette entrée, il incrémente l'opérande si on envoie un 1. Le résultat est appelé un '''incrémenteur à propagation de retenue'''. Il est constitué de demi-additionneurs enchaînés les uns à la suite des autres, qui propagent les retenues calculées du bit de poids faible vers le bit de poids fort. [[File:Circuit incrémenteur.png|centre|vignette|upright=3|Circuit incrémenteur.]] Maintenant, regardons le demi-additionneur le plus à droite, celui pour le bit de poids faible. Son entrée de retenue entrante est mise à 1 pour faire l'incrémentation. Quelques incrémenteurs permettent de configurer cette entrée de retenue à 0 ou à 1, ce qui effectue : soit une opération identité (l'opérande est recopié sur la sortie), soit une incrémentation. Un tel circuit est nommé un '''incrémenteur commandable'''. Nous aurons à utiliser une fois ou deux de tels incrémenteurs commandables dans la suite du cours. ==Les incrémenteurs ''carry skip''== Il est possible d'optimiser un incrémenteur, sur le même modèle que les additionneurs vus plus haut. Une optimisation intéressante est de faire l'incrémentation, non pas bit par bit, mais par paquets de deux bits. le résultat est que l'incrémentation est deux fois plus rapide, ou presque. Le circuit incrémenteur est donc composé en enchainant non pas des demi-additionneurs, mais des '''incrémenteurs 2 bits''' qui incrémentent une opérande de deux bits. [[File:Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits.png|centre|vignette|upright=2.5|Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits]] Reste à concevoir l'incrémenteur 2 bits. Une première solution part de deux demi-additionneurs et effectue quelques simplifications au niveau des transistors et des portes logiques. Par exemple, l'Intel 8085 a utilisé un circuit optimisé, fabriqué avec des portes NAND et NOR. La raison est qu'avec les technologies de transistors CMOS actuelles, les portes NAND et NOR utilisent moins de transistors que les portes ET et OU. Et cette possibilité a été utilisé pour effectuer des simplifications assez mineures, mais toujours bonnes à prendre. Mais nous ne pouvons pas en parler ici. Une solution alternative fabrique des incrémenteurs 2 bits qui calculent séparément les deux bits du résultat et la retenue sortante. La retenue sortante est calculée à partir des bits de l’opérande, sans propager des retenues. Ainsi, la retenue sortante est connu en avance, sans passer par deux demi-additionneurs. Pour créer un tel incrémenteur, le mieux est de partir de sa table de vérité. {|class="wikitable" |- ! Opérande !! Retenue entrante !! !! Retenue sortante !! Résultat |- | 00 || 0 || || 0 || 00 |- | 01 || 0 || || 0 || 01 |- | 10 || 0 || || 0 || 10 |- | 11 || 0 || || 0 || 11 |- | colspan="5" | |- | 00 || 1 || || 0 || 01 |- | 01 || 1 || || 0 || 10 |- | 10 || 1 || || 0 || 11 |- | 11 || 1 || || 1 || 00 |} Elle nous dit que la retenue sortante ne vaut 1 que dans un seul cas : les deux bits d'opérande valent 1, la retenue entrante vaut 1. Elle se calcule alors avec une porte ET à trois entrées. Pour les deux bits du résultat, les équations logiques ne donnent pas un résultat satisfaisant. La solution la plus simple est d'utiliser deux demi-additionneurs et de retirer les portes logiques superflues. Le résultat est alors un '''incrémenteur 2 bits ''carry skip''''', où la retenue sortante est calculée séparément du reste. [[File:Incrémenteur carry skip 2 bits.png|centre|vignette|upright=2.5|Incrémenteur ''carry skip'' 2 bits]] ==Les incrémenteurs à anticipation de retenue== Il est possible d'utiliser l'anticipation de retenue pour un incrémenteur. Et celle-ci est assez simple, car déterminer la retenue ne demande pas de calculs complexes, contrairement à l'addition. Pour le comprendre, on peut regarder comment la retenue sortant d'un demi-additionneur est formée. Elle est calculée en faisant un ET logique entre la retenue entrante et le bit d'opérande. Une retenue est donc un ET logique entre toutes les retenues précédentes. Un autre moyen de s'en rendre compte est de regarder une suite de nombres codés en binaire : * 000 * 001 * 010 * 011 * 100 * 101 * 110 * 111 Il faut remarquer que lors d'une incrémentation, un bit s'inverse quand les bits des colonnes précédentes valent tous 1. Rappelons qu'additionner un bit avec une retenue inverse celui-ci si la retenue vaut 1, le recopie à l'identique si la retenue vaut zéro. Déterminer si les N bits précédents sont à 1 demande un simple ET entre les bits en question. Un incrémenteur à anticipation de retenue est donc composé d'un paquet de portes ET, avec pas mal de redondance entre les portes. Pour éviter de gaspiller trop de portes logiques, une solution est de mélanger anticipation de retenues et propagation de retenue. Par exemple, pour un incrémenteur 32 bits, on peut découper l'opérande en 4 octets : on anticipe les retenues pour chaque octet, mais l'incrémentation de chaque octet se fait avec propagation de retenue et/ou ''carry skip''. [[File:Incrémenteur à anticipation de retenues.png|centre|vignette|upright=3|Incrémenteur hybride utilisant partiellement l'anticipation de retenues.]] Quelques processeurs utilisaient l'anticipation de retenues. Par exemple, le processeur Z-80 de Zilog utilisait un incrémenteur pour des nombres de 16 bits, ce qui demandait des performances assez élevées. Et cet incrémenteur utilisait à la fois anticipation de retenues et ''carry skip''. Il était découpé en quatre blocs avant anticipation de retenues entre eux : un bloc regroupant les 7 bits de poids faible, suivi par un bloc de 5 bits, lui-même suivi par un bloc de 3 bits, terminé par un dernier bit isolé. A l'intérieur de ces blocs, les bits sont regroupés en paires utilisant le ''carry skip''. Pour ceux qui veulent en savoir plus sur cet incrémenteur, voici un lien sur le sujet : * [https://www.righto.com/2013/11/the-z-80s-16-bit-incrementdecrement.html The Z-80's 16-bit increment/decrement circuit reverse engineered]. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de sélection | prevText=Les circuits de sélection | next=Les bascules : des mémoires de 1 bit | nextText=Les bascules : des mémoires de 1 bit }} </noinclude> to30231o6223aj2ew6m8z557hcpaurt 768014 768013 2026-06-18T14:36:22Z Mewtow 31375 /* L'incrémenteur à propagation de retenue */ 768014 wikitext text/x-wiki Le circuit '''incrémenteur''' incrémente un nombre entier. Plus précisément, il prend en entrée un nombre entier, et fournit en entier le nombre suivant, il lui ajoute 1. Une telle opération peut paraitre triviale et peu intéressante. Cependant, elle est très utilisée et est absolument cruciale pour créer des circuits capables de compter ou décompter. De plus, au-delà de leur utilisation dans les compteurs, les incrémenteurs étaient très utilisés sur les premiers processeurs 8 bits, comme le Z-80, le 6502, les premiers processeurs x86 comme le 8008, le 8086, le 8085, et bien d'autres. Il s'agit de circuits assez simples, bien plus simples que les additionneurs. Ils peuvent reprendre les optimisations présentes dans les additionneurs, comme l'anticipation de retenue ou le ''carry skip'', mais ces techniques sont bien plus simples à utiliser avec un incrémenteur. Il existe aussi des ''circuits décrémenteurs'', qui décrémentent une opérande, ainsi que des ''circuits incrémenteur-décrémenteur'', qui peuvent incrémenter ou décrémenter, selon comment on les configure. Je ne vais pas détailler ces circuits plus que ça, car de tels circuits sont assez rares, comparé à un circuit incrémenteur simple. ==Le demi-additionneur== Le circuit incrémenteur effectue l'opération suivante : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Un incrémenteur basique doit donc faire une addition pour chaque colonne, et précisémment une addition de deux bits. Il se trouve que la table d'addition est très simple en binaire. Jugez plutôt : * 0 + 0 = 0, retenue = 0 ; * 0 + 1 = 1, retenue = 0 ; * 1 + 0 = 1, retenue = 0 ; * 1 + 1 = 0, retenue = 1. Un circuit capable d'additionner deux bits est donc simple à construire avec les techniques vues dans les premiers chapitres. On voit immédiatement que la colonne des retenues donne une porte ET, alors que celle du bit de somme est calculé par un XOR. Le circuit obtenu est appelé un '''demi-additionneur'''. {| class="flexible" |[[File:1-bit half-adder.svg|class=transparent|centre|Demi-addtionneur.]] |[[File:Half-adder.svg|centre|class=transparent|Circuit d'un demi-addtionneur.]] |} [[File:Full Adder Block.svg|vignette|upright=1|class=transparent|Additionneur complet.]] ==L'incrémenteur à propagation de retenue== Maintenant que l'on sait comment additionner deux bits, reprenons l'opération d'incrémentation : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Sur la colonne la plus à droite, il doit ajouter un au bit de poids faible. Pour les colonnes suivantes, il faut additionner le bit de l'opérande avec la retenue de la colonne précédente. En clair, on n'additionne que deux bits à chaque colonne : un 1 sur celle tout à droite, la retenue de la colonne précédente pour les autres. Et cela nous donne une idée de comment faire pour créer le circuit incrémenteur. Il suffit d'utiliser un demi-additionneur par colonne, et de les enchainer les uns à la suite des autres. Chaque demi-additionneur additionne le bit de l'opérande avec la retenue fournie par le demi-additionneur précédent. Le seul qui fait exception est celui pour la colonne de poids faible. Pour celui là, il doit ajouter 1 au bit de poids faible. Le résultat est appelé un '''incrémenteur à propagation de retenue'''. Il est constitué de demi-additionneurs enchaînés les uns à la suite des autres, qui propagent les retenues calculées du bit de poids faible vers le bit de poids fort. [[File:Circuit incrémenteur.png|centre|vignette|upright=3|Circuit incrémenteur.]] Maintenant, regardons le demi-additionneur le plus à droite, celui pour le bit de poids faible. Son entrée de retenue entrante est mise à 1 pour faire l'incrémentation. Quelques incrémenteurs permettent de configurer cette entrée de retenue à 0 ou à 1, ce qui effectue : soit une opération identité (l'opérande est recopié sur la sortie), soit une incrémentation. Un tel circuit est nommé un '''incrémenteur commandable'''. Nous aurons à utiliser une fois ou deux de tels incrémenteurs commandables dans la suite du cours. ==Les incrémenteurs ''carry skip''== Il est possible d'optimiser un incrémenteur, sur le même modèle que les additionneurs vus plus haut. Une optimisation intéressante est de faire l'incrémentation, non pas bit par bit, mais par paquets de deux bits. le résultat est que l'incrémentation est deux fois plus rapide, ou presque. Le circuit incrémenteur est donc composé en enchainant non pas des demi-additionneurs, mais des '''incrémenteurs 2 bits''' qui incrémentent une opérande de deux bits. [[File:Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits.png|centre|vignette|upright=2.5|Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits]] Reste à concevoir l'incrémenteur 2 bits. Une première solution part de deux demi-additionneurs et effectue quelques simplifications au niveau des transistors et des portes logiques. Par exemple, l'Intel 8085 a utilisé un circuit optimisé, fabriqué avec des portes NAND et NOR. La raison est qu'avec les technologies de transistors CMOS actuelles, les portes NAND et NOR utilisent moins de transistors que les portes ET et OU. Et cette possibilité a été utilisé pour effectuer des simplifications assez mineures, mais toujours bonnes à prendre. Mais nous ne pouvons pas en parler ici. Une solution alternative fabrique des incrémenteurs 2 bits qui calculent séparément les deux bits du résultat et la retenue sortante. La retenue sortante est calculée à partir des bits de l’opérande, sans propager des retenues. Ainsi, la retenue sortante est connu en avance, sans passer par deux demi-additionneurs. Pour créer un tel incrémenteur, le mieux est de partir de sa table de vérité. {|class="wikitable" |- ! Opérande !! Retenue entrante !! !! Retenue sortante !! Résultat |- | 00 || 0 || || 0 || 00 |- | 01 || 0 || || 0 || 01 |- | 10 || 0 || || 0 || 10 |- | 11 || 0 || || 0 || 11 |- | colspan="5" | |- | 00 || 1 || || 0 || 01 |- | 01 || 1 || || 0 || 10 |- | 10 || 1 || || 0 || 11 |- | 11 || 1 || || 1 || 00 |} Elle nous dit que la retenue sortante ne vaut 1 que dans un seul cas : les deux bits d'opérande valent 1, la retenue entrante vaut 1. Elle se calcule alors avec une porte ET à trois entrées. Pour les deux bits du résultat, les équations logiques ne donnent pas un résultat satisfaisant. La solution la plus simple est d'utiliser deux demi-additionneurs et de retirer les portes logiques superflues. Le résultat est alors un '''incrémenteur 2 bits ''carry skip''''', où la retenue sortante est calculée séparément du reste. [[File:Incrémenteur carry skip 2 bits.png|centre|vignette|upright=2.5|Incrémenteur ''carry skip'' 2 bits]] ==Les incrémenteurs à anticipation de retenue== Il est possible d'utiliser l'anticipation de retenue pour un incrémenteur. Et celle-ci est assez simple, car déterminer la retenue ne demande pas de calculs complexes, contrairement à l'addition. Pour le comprendre, on peut regarder comment la retenue sortant d'un demi-additionneur est formée. Elle est calculée en faisant un ET logique entre la retenue entrante et le bit d'opérande. Une retenue est donc un ET logique entre toutes les retenues précédentes. Un autre moyen de s'en rendre compte est de regarder une suite de nombres codés en binaire : * 000 * 001 * 010 * 011 * 100 * 101 * 110 * 111 Il faut remarquer que lors d'une incrémentation, un bit s'inverse quand les bits des colonnes précédentes valent tous 1. Rappelons qu'additionner un bit avec une retenue inverse celui-ci si la retenue vaut 1, le recopie à l'identique si la retenue vaut zéro. Déterminer si les N bits précédents sont à 1 demande un simple ET entre les bits en question. Un incrémenteur à anticipation de retenue est donc composé d'un paquet de portes ET, avec pas mal de redondance entre les portes. Pour éviter de gaspiller trop de portes logiques, une solution est de mélanger anticipation de retenues et propagation de retenue. Par exemple, pour un incrémenteur 32 bits, on peut découper l'opérande en 4 octets : on anticipe les retenues pour chaque octet, mais l'incrémentation de chaque octet se fait avec propagation de retenue et/ou ''carry skip''. [[File:Incrémenteur à anticipation de retenues.png|centre|vignette|upright=3|Incrémenteur hybride utilisant partiellement l'anticipation de retenues.]] Quelques processeurs utilisaient l'anticipation de retenues. Par exemple, le processeur Z-80 de Zilog utilisait un incrémenteur pour des nombres de 16 bits, ce qui demandait des performances assez élevées. Et cet incrémenteur utilisait à la fois anticipation de retenues et ''carry skip''. Il était découpé en quatre blocs avant anticipation de retenues entre eux : un bloc regroupant les 7 bits de poids faible, suivi par un bloc de 5 bits, lui-même suivi par un bloc de 3 bits, terminé par un dernier bit isolé. A l'intérieur de ces blocs, les bits sont regroupés en paires utilisant le ''carry skip''. Pour ceux qui veulent en savoir plus sur cet incrémenteur, voici un lien sur le sujet : * [https://www.righto.com/2013/11/the-z-80s-16-bit-incrementdecrement.html The Z-80's 16-bit increment/decrement circuit reverse engineered]. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de sélection | prevText=Les circuits de sélection | next=Les bascules : des mémoires de 1 bit | nextText=Les bascules : des mémoires de 1 bit }} </noinclude> 0ghw99uq2gmnx1nbtidcjgshyobq45p 768015 768014 2026-06-18T14:36:35Z Mewtow 31375 768015 wikitext text/x-wiki Le circuit '''incrémenteur''' incrémente un nombre entier. Plus précisément, il prend en entrée un nombre entier, et fournit en entier le nombre suivant, il lui ajoute 1. Une telle opération peut paraitre triviale et peu intéressante. Cependant, elle est très utilisée et est absolument cruciale pour créer des circuits capables de compter ou décompter. De plus, au-delà de leur utilisation dans les compteurs, les incrémenteurs étaient très utilisés sur les premiers processeurs 8 bits, comme le Z-80, le 6502, les premiers processeurs x86 comme le 8008, le 8086, le 8085, et bien d'autres. Il s'agit de circuits assez simples, bien plus simples que les additionneurs. Ils peuvent reprendre les optimisations présentes dans les additionneurs, comme l'anticipation de retenue ou le ''carry skip'', mais ces techniques sont bien plus simples à utiliser avec un incrémenteur. Il existe aussi des ''circuits décrémenteurs'', qui décrémentent une opérande, ainsi que des ''circuits incrémenteur-décrémenteur'', qui peuvent incrémenter ou décrémenter, selon comment on les configure. Je ne vais pas détailler ces circuits plus que ça, car de tels circuits sont assez rares, comparé à un circuit incrémenteur simple. ==Le demi-additionneur== Le circuit incrémenteur effectue l'opération suivante : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Un incrémenteur basique doit donc faire une addition pour chaque colonne, et précisémment une addition de deux bits. Il se trouve que la table d'addition est très simple en binaire. Jugez plutôt : * 0 + 0 = 0, retenue = 0 ; * 0 + 1 = 1, retenue = 0 ; * 1 + 0 = 1, retenue = 0 ; * 1 + 1 = 0, retenue = 1. Un circuit capable d'additionner deux bits est donc simple à construire avec les techniques vues dans les premiers chapitres. On voit immédiatement que la colonne des retenues donne une porte ET, alors que celle du bit de somme est calculé par un XOR. Le circuit obtenu est appelé un '''demi-additionneur'''. {| class="flexible" |[[File:1-bit half-adder.svg|class=transparent|centre|Demi-addtionneur.]] |[[File:Half-adder.svg|centre|class=transparent|Circuit d'un demi-addtionneur.]] |} ==L'incrémenteur à propagation de retenue== Maintenant que l'on sait comment additionner deux bits, reprenons l'opération d'incrémentation : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Sur la colonne la plus à droite, il doit ajouter un au bit de poids faible. Pour les colonnes suivantes, il faut additionner le bit de l'opérande avec la retenue de la colonne précédente. En clair, on n'additionne que deux bits à chaque colonne : un 1 sur celle tout à droite, la retenue de la colonne précédente pour les autres. Et cela nous donne une idée de comment faire pour créer le circuit incrémenteur. Il suffit d'utiliser un demi-additionneur par colonne, et de les enchainer les uns à la suite des autres. Chaque demi-additionneur additionne le bit de l'opérande avec la retenue fournie par le demi-additionneur précédent. Le seul qui fait exception est celui pour la colonne de poids faible. Pour celui là, il doit ajouter 1 au bit de poids faible. Le résultat est appelé un '''incrémenteur à propagation de retenue'''. Il est constitué de demi-additionneurs enchaînés les uns à la suite des autres, qui propagent les retenues calculées du bit de poids faible vers le bit de poids fort. [[File:Circuit incrémenteur.png|centre|vignette|upright=3|Circuit incrémenteur.]] Maintenant, regardons le demi-additionneur le plus à droite, celui pour le bit de poids faible. Son entrée de retenue entrante est mise à 1 pour faire l'incrémentation. Quelques incrémenteurs permettent de configurer cette entrée de retenue à 0 ou à 1, ce qui effectue : soit une opération identité (l'opérande est recopié sur la sortie), soit une incrémentation. Un tel circuit est nommé un '''incrémenteur commandable'''. Nous aurons à utiliser une fois ou deux de tels incrémenteurs commandables dans la suite du cours. ==Les incrémenteurs ''carry skip''== Il est possible d'optimiser un incrémenteur, sur le même modèle que les additionneurs vus plus haut. Une optimisation intéressante est de faire l'incrémentation, non pas bit par bit, mais par paquets de deux bits. le résultat est que l'incrémentation est deux fois plus rapide, ou presque. Le circuit incrémenteur est donc composé en enchainant non pas des demi-additionneurs, mais des '''incrémenteurs 2 bits''' qui incrémentent une opérande de deux bits. [[File:Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits.png|centre|vignette|upright=2.5|Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits]] Reste à concevoir l'incrémenteur 2 bits. Une première solution part de deux demi-additionneurs et effectue quelques simplifications au niveau des transistors et des portes logiques. Par exemple, l'Intel 8085 a utilisé un circuit optimisé, fabriqué avec des portes NAND et NOR. La raison est qu'avec les technologies de transistors CMOS actuelles, les portes NAND et NOR utilisent moins de transistors que les portes ET et OU. Et cette possibilité a été utilisé pour effectuer des simplifications assez mineures, mais toujours bonnes à prendre. Mais nous ne pouvons pas en parler ici. Une solution alternative fabrique des incrémenteurs 2 bits qui calculent séparément les deux bits du résultat et la retenue sortante. La retenue sortante est calculée à partir des bits de l’opérande, sans propager des retenues. Ainsi, la retenue sortante est connu en avance, sans passer par deux demi-additionneurs. Pour créer un tel incrémenteur, le mieux est de partir de sa table de vérité. {|class="wikitable" |- ! Opérande !! Retenue entrante !! !! Retenue sortante !! Résultat |- | 00 || 0 || || 0 || 00 |- | 01 || 0 || || 0 || 01 |- | 10 || 0 || || 0 || 10 |- | 11 || 0 || || 0 || 11 |- | colspan="5" | |- | 00 || 1 || || 0 || 01 |- | 01 || 1 || || 0 || 10 |- | 10 || 1 || || 0 || 11 |- | 11 || 1 || || 1 || 00 |} Elle nous dit que la retenue sortante ne vaut 1 que dans un seul cas : les deux bits d'opérande valent 1, la retenue entrante vaut 1. Elle se calcule alors avec une porte ET à trois entrées. Pour les deux bits du résultat, les équations logiques ne donnent pas un résultat satisfaisant. La solution la plus simple est d'utiliser deux demi-additionneurs et de retirer les portes logiques superflues. Le résultat est alors un '''incrémenteur 2 bits ''carry skip''''', où la retenue sortante est calculée séparément du reste. [[File:Incrémenteur carry skip 2 bits.png|centre|vignette|upright=2.5|Incrémenteur ''carry skip'' 2 bits]] ==Les incrémenteurs à anticipation de retenue== Il est possible d'utiliser l'anticipation de retenue pour un incrémenteur. Et celle-ci est assez simple, car déterminer la retenue ne demande pas de calculs complexes, contrairement à l'addition. Pour le comprendre, on peut regarder comment la retenue sortant d'un demi-additionneur est formée. Elle est calculée en faisant un ET logique entre la retenue entrante et le bit d'opérande. Une retenue est donc un ET logique entre toutes les retenues précédentes. Un autre moyen de s'en rendre compte est de regarder une suite de nombres codés en binaire : * 000 * 001 * 010 * 011 * 100 * 101 * 110 * 111 Il faut remarquer que lors d'une incrémentation, un bit s'inverse quand les bits des colonnes précédentes valent tous 1. Rappelons qu'additionner un bit avec une retenue inverse celui-ci si la retenue vaut 1, le recopie à l'identique si la retenue vaut zéro. Déterminer si les N bits précédents sont à 1 demande un simple ET entre les bits en question. Un incrémenteur à anticipation de retenue est donc composé d'un paquet de portes ET, avec pas mal de redondance entre les portes. Pour éviter de gaspiller trop de portes logiques, une solution est de mélanger anticipation de retenues et propagation de retenue. Par exemple, pour un incrémenteur 32 bits, on peut découper l'opérande en 4 octets : on anticipe les retenues pour chaque octet, mais l'incrémentation de chaque octet se fait avec propagation de retenue et/ou ''carry skip''. [[File:Incrémenteur à anticipation de retenues.png|centre|vignette|upright=3|Incrémenteur hybride utilisant partiellement l'anticipation de retenues.]] Quelques processeurs utilisaient l'anticipation de retenues. Par exemple, le processeur Z-80 de Zilog utilisait un incrémenteur pour des nombres de 16 bits, ce qui demandait des performances assez élevées. Et cet incrémenteur utilisait à la fois anticipation de retenues et ''carry skip''. Il était découpé en quatre blocs avant anticipation de retenues entre eux : un bloc regroupant les 7 bits de poids faible, suivi par un bloc de 5 bits, lui-même suivi par un bloc de 3 bits, terminé par un dernier bit isolé. A l'intérieur de ces blocs, les bits sont regroupés en paires utilisant le ''carry skip''. Pour ceux qui veulent en savoir plus sur cet incrémenteur, voici un lien sur le sujet : * [https://www.righto.com/2013/11/the-z-80s-16-bit-incrementdecrement.html The Z-80's 16-bit increment/decrement circuit reverse engineered]. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de sélection | prevText=Les circuits de sélection | next=Les bascules : des mémoires de 1 bit | nextText=Les bascules : des mémoires de 1 bit }} </noinclude> 2bwveiqtod5o9n3pws7z6o4w3kal1t1 768016 768015 2026-06-18T14:40:35Z Mewtow 31375 /* Les incrémenteurs carry skip */ 768016 wikitext text/x-wiki Le circuit '''incrémenteur''' incrémente un nombre entier. Plus précisément, il prend en entrée un nombre entier, et fournit en entier le nombre suivant, il lui ajoute 1. Une telle opération peut paraitre triviale et peu intéressante. Cependant, elle est très utilisée et est absolument cruciale pour créer des circuits capables de compter ou décompter. De plus, au-delà de leur utilisation dans les compteurs, les incrémenteurs étaient très utilisés sur les premiers processeurs 8 bits, comme le Z-80, le 6502, les premiers processeurs x86 comme le 8008, le 8086, le 8085, et bien d'autres. Il s'agit de circuits assez simples, bien plus simples que les additionneurs. Ils peuvent reprendre les optimisations présentes dans les additionneurs, comme l'anticipation de retenue ou le ''carry skip'', mais ces techniques sont bien plus simples à utiliser avec un incrémenteur. Il existe aussi des ''circuits décrémenteurs'', qui décrémentent une opérande, ainsi que des ''circuits incrémenteur-décrémenteur'', qui peuvent incrémenter ou décrémenter, selon comment on les configure. Je ne vais pas détailler ces circuits plus que ça, car de tels circuits sont assez rares, comparé à un circuit incrémenteur simple. ==Le demi-additionneur== Le circuit incrémenteur effectue l'opération suivante : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Un incrémenteur basique doit donc faire une addition pour chaque colonne, et précisémment une addition de deux bits. Il se trouve que la table d'addition est très simple en binaire. Jugez plutôt : * 0 + 0 = 0, retenue = 0 ; * 0 + 1 = 1, retenue = 0 ; * 1 + 0 = 1, retenue = 0 ; * 1 + 1 = 0, retenue = 1. Un circuit capable d'additionner deux bits est donc simple à construire avec les techniques vues dans les premiers chapitres. On voit immédiatement que la colonne des retenues donne une porte ET, alors que celle du bit de somme est calculé par un XOR. Le circuit obtenu est appelé un '''demi-additionneur'''. {| class="flexible" |[[File:1-bit half-adder.svg|class=transparent|centre|Demi-addtionneur.]] |[[File:Half-adder.svg|centre|class=transparent|Circuit d'un demi-addtionneur.]] |} ==L'incrémenteur à propagation de retenue== Maintenant que l'on sait comment additionner deux bits, reprenons l'opération d'incrémentation : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Sur la colonne la plus à droite, il doit ajouter un au bit de poids faible. Pour les colonnes suivantes, il faut additionner le bit de l'opérande avec la retenue de la colonne précédente. En clair, on n'additionne que deux bits à chaque colonne : un 1 sur celle tout à droite, la retenue de la colonne précédente pour les autres. Et cela nous donne une idée de comment faire pour créer le circuit incrémenteur. Il suffit d'utiliser un demi-additionneur par colonne, et de les enchainer les uns à la suite des autres. Chaque demi-additionneur additionne le bit de l'opérande avec la retenue fournie par le demi-additionneur précédent. Le seul qui fait exception est celui pour la colonne de poids faible. Pour celui là, il doit ajouter 1 au bit de poids faible. Le résultat est appelé un '''incrémenteur à propagation de retenue'''. Il est constitué de demi-additionneurs enchaînés les uns à la suite des autres, qui propagent les retenues calculées du bit de poids faible vers le bit de poids fort. [[File:Circuit incrémenteur.png|centre|vignette|upright=3|Circuit incrémenteur.]] Maintenant, regardons le demi-additionneur le plus à droite, celui pour le bit de poids faible. Son entrée de retenue entrante est mise à 1 pour faire l'incrémentation. Quelques incrémenteurs permettent de configurer cette entrée de retenue à 0 ou à 1, ce qui effectue : soit une opération identité (l'opérande est recopié sur la sortie), soit une incrémentation. Un tel circuit est nommé un '''incrémenteur commandable'''. Nous aurons à utiliser une fois ou deux de tels incrémenteurs commandables dans la suite du cours. L'incrémenteur à propagation de retenue est le plus simple et le plus économe en portes logiques. Mais de tels incrémenteurs sont rarement utilisés. A la place, on leur préfère des incrémenteurs plus performants, qui utilisent souvent plus de portes logiques. De tels incrémenteurs sont conçus pour rendre le calcul des retenues plus rapide. En effet, la rapidité d'une incrémentation est limitée par la propagation de la retenue : les retenues commencent à être calculées au bit de poids fort et on doit les calculer colonne par colonne, jusqu’à atteindre le bit de poids fort. Et cette propagation des retenues prend beaucoup de temps. Plus l'opérande est longue, plus ce temps est élevé. Il y a deux optimisations principales, appelées le ''carry skip'' et l'anticipation de retenue, que nous allons décrire ci-dessous. ==Les incrémenteurs ''carry skip''== Il est possible d'optimiser un incrémenteur, sur le même modèle que les additionneurs vus plus haut. Une optimisation intéressante est de faire l'incrémentation, non pas bit par bit, mais par paquets de deux bits. le résultat est que l'incrémentation est deux fois plus rapide, ou presque. Le circuit incrémenteur est donc composé en enchainant non pas des demi-additionneurs, mais des '''incrémenteurs 2 bits''' qui incrémentent une opérande de deux bits. [[File:Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits.png|centre|vignette|upright=2.5|Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits]] Reste à concevoir l'incrémenteur 2 bits. Une première solution part de deux demi-additionneurs et effectue quelques simplifications au niveau des transistors et des portes logiques. Par exemple, l'Intel 8085 a utilisé un circuit optimisé, fabriqué avec des portes NAND et NOR. La raison est qu'avec les technologies de transistors CMOS actuelles, les portes NAND et NOR utilisent moins de transistors que les portes ET et OU. Et cette possibilité a été utilisé pour effectuer des simplifications assez mineures, mais toujours bonnes à prendre. Mais nous ne pouvons pas en parler ici. Une solution alternative fabrique des incrémenteurs 2 bits qui calculent séparément les deux bits du résultat et la retenue sortante. La retenue sortante est calculée à partir des bits de l’opérande, sans propager des retenues. Ainsi, la retenue sortante est connu en avance, sans passer par deux demi-additionneurs. Pour créer un tel incrémenteur, le mieux est de partir de sa table de vérité. {|class="wikitable" |- ! Opérande !! Retenue entrante !! !! Retenue sortante !! Résultat |- | 00 || 0 || || 0 || 00 |- | 01 || 0 || || 0 || 01 |- | 10 || 0 || || 0 || 10 |- | 11 || 0 || || 0 || 11 |- | colspan="5" | |- | 00 || 1 || || 0 || 01 |- | 01 || 1 || || 0 || 10 |- | 10 || 1 || || 0 || 11 |- | 11 || 1 || || 1 || 00 |} Elle nous dit que la retenue sortante ne vaut 1 que dans un seul cas : les deux bits d'opérande valent 1, la retenue entrante vaut 1. Elle se calcule alors avec une porte ET à trois entrées. Pour les deux bits du résultat, les équations logiques ne donnent pas un résultat satisfaisant. La solution la plus simple est d'utiliser deux demi-additionneurs et de retirer les portes logiques superflues. Le résultat est alors un '''incrémenteur 2 bits ''carry skip''''', où la retenue sortante est calculée séparément du reste. [[File:Incrémenteur carry skip 2 bits.png|centre|vignette|upright=2.5|Incrémenteur ''carry skip'' 2 bits]] ==Les incrémenteurs à anticipation de retenue== Il est possible d'utiliser l'anticipation de retenue pour un incrémenteur. Et celle-ci est assez simple, car déterminer la retenue ne demande pas de calculs complexes, contrairement à l'addition. Pour le comprendre, on peut regarder comment la retenue sortant d'un demi-additionneur est formée. Elle est calculée en faisant un ET logique entre la retenue entrante et le bit d'opérande. Une retenue est donc un ET logique entre toutes les retenues précédentes. Un autre moyen de s'en rendre compte est de regarder une suite de nombres codés en binaire : * 000 * 001 * 010 * 011 * 100 * 101 * 110 * 111 Il faut remarquer que lors d'une incrémentation, un bit s'inverse quand les bits des colonnes précédentes valent tous 1. Rappelons qu'additionner un bit avec une retenue inverse celui-ci si la retenue vaut 1, le recopie à l'identique si la retenue vaut zéro. Déterminer si les N bits précédents sont à 1 demande un simple ET entre les bits en question. Un incrémenteur à anticipation de retenue est donc composé d'un paquet de portes ET, avec pas mal de redondance entre les portes. Pour éviter de gaspiller trop de portes logiques, une solution est de mélanger anticipation de retenues et propagation de retenue. Par exemple, pour un incrémenteur 32 bits, on peut découper l'opérande en 4 octets : on anticipe les retenues pour chaque octet, mais l'incrémentation de chaque octet se fait avec propagation de retenue et/ou ''carry skip''. [[File:Incrémenteur à anticipation de retenues.png|centre|vignette|upright=3|Incrémenteur hybride utilisant partiellement l'anticipation de retenues.]] Quelques processeurs utilisaient l'anticipation de retenues. Par exemple, le processeur Z-80 de Zilog utilisait un incrémenteur pour des nombres de 16 bits, ce qui demandait des performances assez élevées. Et cet incrémenteur utilisait à la fois anticipation de retenues et ''carry skip''. Il était découpé en quatre blocs avant anticipation de retenues entre eux : un bloc regroupant les 7 bits de poids faible, suivi par un bloc de 5 bits, lui-même suivi par un bloc de 3 bits, terminé par un dernier bit isolé. A l'intérieur de ces blocs, les bits sont regroupés en paires utilisant le ''carry skip''. Pour ceux qui veulent en savoir plus sur cet incrémenteur, voici un lien sur le sujet : * [https://www.righto.com/2013/11/the-z-80s-16-bit-incrementdecrement.html The Z-80's 16-bit increment/decrement circuit reverse engineered]. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de sélection | prevText=Les circuits de sélection | next=Les bascules : des mémoires de 1 bit | nextText=Les bascules : des mémoires de 1 bit }} </noinclude> 6rkmbosq9gyj5syhh3pheese3e0nlp8 768017 768016 2026-06-18T14:42:42Z Mewtow 31375 /* Le demi-additionneur */ 768017 wikitext text/x-wiki Le circuit '''incrémenteur''' incrémente un nombre entier. Plus précisément, il prend en entrée un nombre entier, et fournit en entier le nombre suivant, il lui ajoute 1. Une telle opération peut paraitre triviale et peu intéressante. Cependant, elle est très utilisée et est absolument cruciale pour créer des circuits capables de compter ou décompter. De plus, au-delà de leur utilisation dans les compteurs, les incrémenteurs étaient très utilisés sur les premiers processeurs 8 bits, comme le Z-80, le 6502, les premiers processeurs x86 comme le 8008, le 8086, le 8085, et bien d'autres. Il s'agit de circuits assez simples, bien plus simples que les additionneurs. Ils peuvent reprendre les optimisations présentes dans les additionneurs, comme l'anticipation de retenue ou le ''carry skip'', mais ces techniques sont bien plus simples à utiliser avec un incrémenteur. Il existe aussi des ''circuits décrémenteurs'', qui décrémentent une opérande, ainsi que des ''circuits incrémenteur-décrémenteur'', qui peuvent incrémenter ou décrémenter, selon comment on les configure. Je ne vais pas détailler ces circuits plus que ça, car de tels circuits sont assez rares, comparé à un circuit incrémenteur simple. ==Le demi-additionneur== Le circuit incrémenteur effectue l'opération suivante : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Un incrémenteur basique doit donc faire une addition pour chaque colonne, et précisémment une addition de deux bits. Il se trouve que la table d'addition est très simple en binaire. Jugez plutôt : * 0 + 0 = 0, retenue = 0 ; * 0 + 1 = 1, retenue = 0 ; * 1 + 0 = 1, retenue = 0 ; * 1 + 1 = 0, retenue = 1. Un circuit capable d'additionner deux bits est donc simple à construire avec les techniques vues dans les premiers chapitres. On voit immédiatement que la colonne des retenues donne une porte ET, alors que celle du bit de somme est calculé par un XOR. Le circuit obtenu est appelé un '''demi-additionneur'''. Il dispose d'une sortie S pour la somme, et C pour la retenue (''carry'' an anglais). {| class="flexible" |[[File:1-bit half-adder.svg|class=transparent|centre|Demi-addtionneur.]] |[[File:Half-adder.svg|centre|class=transparent|Circuit d'un demi-addtionneur.]] |} ==L'incrémenteur à propagation de retenue== Maintenant que l'on sait comment additionner deux bits, reprenons l'opération d'incrémentation : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Sur la colonne la plus à droite, il doit ajouter un au bit de poids faible. Pour les colonnes suivantes, il faut additionner le bit de l'opérande avec la retenue de la colonne précédente. En clair, on n'additionne que deux bits à chaque colonne : un 1 sur celle tout à droite, la retenue de la colonne précédente pour les autres. Et cela nous donne une idée de comment faire pour créer le circuit incrémenteur. Il suffit d'utiliser un demi-additionneur par colonne, et de les enchainer les uns à la suite des autres. Chaque demi-additionneur additionne le bit de l'opérande avec la retenue fournie par le demi-additionneur précédent. Le seul qui fait exception est celui pour la colonne de poids faible. Pour celui là, il doit ajouter 1 au bit de poids faible. Le résultat est appelé un '''incrémenteur à propagation de retenue'''. Il est constitué de demi-additionneurs enchaînés les uns à la suite des autres, qui propagent les retenues calculées du bit de poids faible vers le bit de poids fort. [[File:Circuit incrémenteur.png|centre|vignette|upright=3|Circuit incrémenteur.]] Maintenant, regardons le demi-additionneur le plus à droite, celui pour le bit de poids faible. Son entrée de retenue entrante est mise à 1 pour faire l'incrémentation. Quelques incrémenteurs permettent de configurer cette entrée de retenue à 0 ou à 1, ce qui effectue : soit une opération identité (l'opérande est recopié sur la sortie), soit une incrémentation. Un tel circuit est nommé un '''incrémenteur commandable'''. Nous aurons à utiliser une fois ou deux de tels incrémenteurs commandables dans la suite du cours. L'incrémenteur à propagation de retenue est le plus simple et le plus économe en portes logiques. Mais de tels incrémenteurs sont rarement utilisés. A la place, on leur préfère des incrémenteurs plus performants, qui utilisent souvent plus de portes logiques. De tels incrémenteurs sont conçus pour rendre le calcul des retenues plus rapide. En effet, la rapidité d'une incrémentation est limitée par la propagation de la retenue : les retenues commencent à être calculées au bit de poids fort et on doit les calculer colonne par colonne, jusqu’à atteindre le bit de poids fort. Et cette propagation des retenues prend beaucoup de temps. Plus l'opérande est longue, plus ce temps est élevé. Il y a deux optimisations principales, appelées le ''carry skip'' et l'anticipation de retenue, que nous allons décrire ci-dessous. ==Les incrémenteurs ''carry skip''== Il est possible d'optimiser un incrémenteur, sur le même modèle que les additionneurs vus plus haut. Une optimisation intéressante est de faire l'incrémentation, non pas bit par bit, mais par paquets de deux bits. le résultat est que l'incrémentation est deux fois plus rapide, ou presque. Le circuit incrémenteur est donc composé en enchainant non pas des demi-additionneurs, mais des '''incrémenteurs 2 bits''' qui incrémentent une opérande de deux bits. [[File:Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits.png|centre|vignette|upright=2.5|Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits]] Reste à concevoir l'incrémenteur 2 bits. Une première solution part de deux demi-additionneurs et effectue quelques simplifications au niveau des transistors et des portes logiques. Par exemple, l'Intel 8085 a utilisé un circuit optimisé, fabriqué avec des portes NAND et NOR. La raison est qu'avec les technologies de transistors CMOS actuelles, les portes NAND et NOR utilisent moins de transistors que les portes ET et OU. Et cette possibilité a été utilisé pour effectuer des simplifications assez mineures, mais toujours bonnes à prendre. Mais nous ne pouvons pas en parler ici. Une solution alternative fabrique des incrémenteurs 2 bits qui calculent séparément les deux bits du résultat et la retenue sortante. La retenue sortante est calculée à partir des bits de l’opérande, sans propager des retenues. Ainsi, la retenue sortante est connu en avance, sans passer par deux demi-additionneurs. Pour créer un tel incrémenteur, le mieux est de partir de sa table de vérité. {|class="wikitable" |- ! Opérande !! Retenue entrante !! !! Retenue sortante !! Résultat |- | 00 || 0 || || 0 || 00 |- | 01 || 0 || || 0 || 01 |- | 10 || 0 || || 0 || 10 |- | 11 || 0 || || 0 || 11 |- | colspan="5" | |- | 00 || 1 || || 0 || 01 |- | 01 || 1 || || 0 || 10 |- | 10 || 1 || || 0 || 11 |- | 11 || 1 || || 1 || 00 |} Elle nous dit que la retenue sortante ne vaut 1 que dans un seul cas : les deux bits d'opérande valent 1, la retenue entrante vaut 1. Elle se calcule alors avec une porte ET à trois entrées. Pour les deux bits du résultat, les équations logiques ne donnent pas un résultat satisfaisant. La solution la plus simple est d'utiliser deux demi-additionneurs et de retirer les portes logiques superflues. Le résultat est alors un '''incrémenteur 2 bits ''carry skip''''', où la retenue sortante est calculée séparément du reste. [[File:Incrémenteur carry skip 2 bits.png|centre|vignette|upright=2.5|Incrémenteur ''carry skip'' 2 bits]] ==Les incrémenteurs à anticipation de retenue== Il est possible d'utiliser l'anticipation de retenue pour un incrémenteur. Et celle-ci est assez simple, car déterminer la retenue ne demande pas de calculs complexes, contrairement à l'addition. Pour le comprendre, on peut regarder comment la retenue sortant d'un demi-additionneur est formée. Elle est calculée en faisant un ET logique entre la retenue entrante et le bit d'opérande. Une retenue est donc un ET logique entre toutes les retenues précédentes. Un autre moyen de s'en rendre compte est de regarder une suite de nombres codés en binaire : * 000 * 001 * 010 * 011 * 100 * 101 * 110 * 111 Il faut remarquer que lors d'une incrémentation, un bit s'inverse quand les bits des colonnes précédentes valent tous 1. Rappelons qu'additionner un bit avec une retenue inverse celui-ci si la retenue vaut 1, le recopie à l'identique si la retenue vaut zéro. Déterminer si les N bits précédents sont à 1 demande un simple ET entre les bits en question. Un incrémenteur à anticipation de retenue est donc composé d'un paquet de portes ET, avec pas mal de redondance entre les portes. Pour éviter de gaspiller trop de portes logiques, une solution est de mélanger anticipation de retenues et propagation de retenue. Par exemple, pour un incrémenteur 32 bits, on peut découper l'opérande en 4 octets : on anticipe les retenues pour chaque octet, mais l'incrémentation de chaque octet se fait avec propagation de retenue et/ou ''carry skip''. [[File:Incrémenteur à anticipation de retenues.png|centre|vignette|upright=3|Incrémenteur hybride utilisant partiellement l'anticipation de retenues.]] Quelques processeurs utilisaient l'anticipation de retenues. Par exemple, le processeur Z-80 de Zilog utilisait un incrémenteur pour des nombres de 16 bits, ce qui demandait des performances assez élevées. Et cet incrémenteur utilisait à la fois anticipation de retenues et ''carry skip''. Il était découpé en quatre blocs avant anticipation de retenues entre eux : un bloc regroupant les 7 bits de poids faible, suivi par un bloc de 5 bits, lui-même suivi par un bloc de 3 bits, terminé par un dernier bit isolé. A l'intérieur de ces blocs, les bits sont regroupés en paires utilisant le ''carry skip''. Pour ceux qui veulent en savoir plus sur cet incrémenteur, voici un lien sur le sujet : * [https://www.righto.com/2013/11/the-z-80s-16-bit-incrementdecrement.html The Z-80's 16-bit increment/decrement circuit reverse engineered]. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de sélection | prevText=Les circuits de sélection | next=Les bascules : des mémoires de 1 bit | nextText=Les bascules : des mémoires de 1 bit }} </noinclude> rvzzath4ll6hw2xa9twvsdne7kl0mnc 768018 768017 2026-06-18T14:44:00Z Mewtow 31375 /* Les incrémenteurs carry skip */ 768018 wikitext text/x-wiki Le circuit '''incrémenteur''' incrémente un nombre entier. Plus précisément, il prend en entrée un nombre entier, et fournit en entier le nombre suivant, il lui ajoute 1. Une telle opération peut paraitre triviale et peu intéressante. Cependant, elle est très utilisée et est absolument cruciale pour créer des circuits capables de compter ou décompter. De plus, au-delà de leur utilisation dans les compteurs, les incrémenteurs étaient très utilisés sur les premiers processeurs 8 bits, comme le Z-80, le 6502, les premiers processeurs x86 comme le 8008, le 8086, le 8085, et bien d'autres. Il s'agit de circuits assez simples, bien plus simples que les additionneurs. Ils peuvent reprendre les optimisations présentes dans les additionneurs, comme l'anticipation de retenue ou le ''carry skip'', mais ces techniques sont bien plus simples à utiliser avec un incrémenteur. Il existe aussi des ''circuits décrémenteurs'', qui décrémentent une opérande, ainsi que des ''circuits incrémenteur-décrémenteur'', qui peuvent incrémenter ou décrémenter, selon comment on les configure. Je ne vais pas détailler ces circuits plus que ça, car de tels circuits sont assez rares, comparé à un circuit incrémenteur simple. ==Le demi-additionneur== Le circuit incrémenteur effectue l'opération suivante : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Un incrémenteur basique doit donc faire une addition pour chaque colonne, et précisémment une addition de deux bits. Il se trouve que la table d'addition est très simple en binaire. Jugez plutôt : * 0 + 0 = 0, retenue = 0 ; * 0 + 1 = 1, retenue = 0 ; * 1 + 0 = 1, retenue = 0 ; * 1 + 1 = 0, retenue = 1. Un circuit capable d'additionner deux bits est donc simple à construire avec les techniques vues dans les premiers chapitres. On voit immédiatement que la colonne des retenues donne une porte ET, alors que celle du bit de somme est calculé par un XOR. Le circuit obtenu est appelé un '''demi-additionneur'''. Il dispose d'une sortie S pour la somme, et C pour la retenue (''carry'' an anglais). {| class="flexible" |[[File:1-bit half-adder.svg|class=transparent|centre|Demi-addtionneur.]] |[[File:Half-adder.svg|centre|class=transparent|Circuit d'un demi-addtionneur.]] |} ==L'incrémenteur à propagation de retenue== Maintenant que l'on sait comment additionner deux bits, reprenons l'opération d'incrémentation : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Sur la colonne la plus à droite, il doit ajouter un au bit de poids faible. Pour les colonnes suivantes, il faut additionner le bit de l'opérande avec la retenue de la colonne précédente. En clair, on n'additionne que deux bits à chaque colonne : un 1 sur celle tout à droite, la retenue de la colonne précédente pour les autres. Et cela nous donne une idée de comment faire pour créer le circuit incrémenteur. Il suffit d'utiliser un demi-additionneur par colonne, et de les enchainer les uns à la suite des autres. Chaque demi-additionneur additionne le bit de l'opérande avec la retenue fournie par le demi-additionneur précédent. Le seul qui fait exception est celui pour la colonne de poids faible. Pour celui là, il doit ajouter 1 au bit de poids faible. Le résultat est appelé un '''incrémenteur à propagation de retenue'''. Il est constitué de demi-additionneurs enchaînés les uns à la suite des autres, qui propagent les retenues calculées du bit de poids faible vers le bit de poids fort. [[File:Circuit incrémenteur.png|centre|vignette|upright=3|Circuit incrémenteur.]] Maintenant, regardons le demi-additionneur le plus à droite, celui pour le bit de poids faible. Son entrée de retenue entrante est mise à 1 pour faire l'incrémentation. Quelques incrémenteurs permettent de configurer cette entrée de retenue à 0 ou à 1, ce qui effectue : soit une opération identité (l'opérande est recopié sur la sortie), soit une incrémentation. Un tel circuit est nommé un '''incrémenteur commandable'''. Nous aurons à utiliser une fois ou deux de tels incrémenteurs commandables dans la suite du cours. L'incrémenteur à propagation de retenue est le plus simple et le plus économe en portes logiques. Mais de tels incrémenteurs sont rarement utilisés. A la place, on leur préfère des incrémenteurs plus performants, qui utilisent souvent plus de portes logiques. De tels incrémenteurs sont conçus pour rendre le calcul des retenues plus rapide. En effet, la rapidité d'une incrémentation est limitée par la propagation de la retenue : les retenues commencent à être calculées au bit de poids fort et on doit les calculer colonne par colonne, jusqu’à atteindre le bit de poids fort. Et cette propagation des retenues prend beaucoup de temps. Plus l'opérande est longue, plus ce temps est élevé. Il y a deux optimisations principales, appelées le ''carry skip'' et l'anticipation de retenue, que nous allons décrire ci-dessous. ==Les incrémenteurs ''carry skip''== L'optimisation '''''carry skip''''' effectue l'incrémentation, non pas bit par bit, mais par paquets de deux bits. le résultat est que l'incrémentation est deux fois plus rapide, ou presque. Le circuit incrémenteur est donc composé en enchainant non pas des demi-additionneurs, mais des '''incrémenteurs 2 bits''' qui incrémentent une opérande de deux bits. [[File:Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits.png|centre|vignette|upright=2.5|Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits]] Reste à concevoir l'incrémenteur 2 bits. Une première solution part de deux demi-additionneurs et effectue quelques simplifications au niveau des transistors et des portes logiques. Par exemple, l'Intel 8085 a utilisé un circuit optimisé, fabriqué avec des portes NAND et NOR. La raison est qu'avec les technologies de transistors CMOS actuelles, les portes NAND et NOR utilisent moins de transistors que les portes ET et OU. Et cette possibilité a été utilisé pour effectuer des simplifications assez mineures, mais toujours bonnes à prendre. Mais nous ne pouvons pas en parler ici. Une solution alternative fabrique des incrémenteurs 2 bits qui calculent séparément les deux bits du résultat et la retenue sortante. La retenue sortante est calculée à partir des bits de l’opérande, sans propager des retenues. Ainsi, la retenue sortante est connu en avance, sans passer par deux demi-additionneurs. Pour créer un tel incrémenteur, le mieux est de partir de sa table de vérité. {|class="wikitable" |- ! Opérande !! Retenue entrante !! !! Retenue sortante !! Résultat |- | 00 || 0 || || 0 || 00 |- | 01 || 0 || || 0 || 01 |- | 10 || 0 || || 0 || 10 |- | 11 || 0 || || 0 || 11 |- | colspan="5" | |- | 00 || 1 || || 0 || 01 |- | 01 || 1 || || 0 || 10 |- | 10 || 1 || || 0 || 11 |- | 11 || 1 || || 1 || 00 |} Elle nous dit que la retenue sortante ne vaut 1 que dans un seul cas : les deux bits d'opérande valent 1, la retenue entrante vaut 1. Elle se calcule alors avec une porte ET à trois entrées. Pour les deux bits du résultat, les équations logiques ne donnent pas un résultat satisfaisant. La solution la plus simple est d'utiliser deux demi-additionneurs et de retirer les portes logiques superflues. Le résultat est alors un '''incrémenteur 2 bits ''carry skip''''', où la retenue sortante est calculée séparément du reste. [[File:Incrémenteur carry skip 2 bits.png|centre|vignette|upright=2.5|Incrémenteur ''carry skip'' 2 bits]] ==Les incrémenteurs à anticipation de retenue== Il est possible d'utiliser l'anticipation de retenue pour un incrémenteur. Et celle-ci est assez simple, car déterminer la retenue ne demande pas de calculs complexes, contrairement à l'addition. Pour le comprendre, on peut regarder comment la retenue sortant d'un demi-additionneur est formée. Elle est calculée en faisant un ET logique entre la retenue entrante et le bit d'opérande. Une retenue est donc un ET logique entre toutes les retenues précédentes. Un autre moyen de s'en rendre compte est de regarder une suite de nombres codés en binaire : * 000 * 001 * 010 * 011 * 100 * 101 * 110 * 111 Il faut remarquer que lors d'une incrémentation, un bit s'inverse quand les bits des colonnes précédentes valent tous 1. Rappelons qu'additionner un bit avec une retenue inverse celui-ci si la retenue vaut 1, le recopie à l'identique si la retenue vaut zéro. Déterminer si les N bits précédents sont à 1 demande un simple ET entre les bits en question. Un incrémenteur à anticipation de retenue est donc composé d'un paquet de portes ET, avec pas mal de redondance entre les portes. Pour éviter de gaspiller trop de portes logiques, une solution est de mélanger anticipation de retenues et propagation de retenue. Par exemple, pour un incrémenteur 32 bits, on peut découper l'opérande en 4 octets : on anticipe les retenues pour chaque octet, mais l'incrémentation de chaque octet se fait avec propagation de retenue et/ou ''carry skip''. [[File:Incrémenteur à anticipation de retenues.png|centre|vignette|upright=3|Incrémenteur hybride utilisant partiellement l'anticipation de retenues.]] Quelques processeurs utilisaient l'anticipation de retenues. Par exemple, le processeur Z-80 de Zilog utilisait un incrémenteur pour des nombres de 16 bits, ce qui demandait des performances assez élevées. Et cet incrémenteur utilisait à la fois anticipation de retenues et ''carry skip''. Il était découpé en quatre blocs avant anticipation de retenues entre eux : un bloc regroupant les 7 bits de poids faible, suivi par un bloc de 5 bits, lui-même suivi par un bloc de 3 bits, terminé par un dernier bit isolé. A l'intérieur de ces blocs, les bits sont regroupés en paires utilisant le ''carry skip''. Pour ceux qui veulent en savoir plus sur cet incrémenteur, voici un lien sur le sujet : * [https://www.righto.com/2013/11/the-z-80s-16-bit-incrementdecrement.html The Z-80's 16-bit increment/decrement circuit reverse engineered]. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de sélection | prevText=Les circuits de sélection | next=Les bascules : des mémoires de 1 bit | nextText=Les bascules : des mémoires de 1 bit }} </noinclude> 0rw3f1bkn9esqvc94rk0lextxgs3ytf 768019 768018 2026-06-18T14:45:38Z Mewtow 31375 /* Les incrémenteurs à anticipation de retenue */ 768019 wikitext text/x-wiki Le circuit '''incrémenteur''' incrémente un nombre entier. Plus précisément, il prend en entrée un nombre entier, et fournit en entier le nombre suivant, il lui ajoute 1. Une telle opération peut paraitre triviale et peu intéressante. Cependant, elle est très utilisée et est absolument cruciale pour créer des circuits capables de compter ou décompter. De plus, au-delà de leur utilisation dans les compteurs, les incrémenteurs étaient très utilisés sur les premiers processeurs 8 bits, comme le Z-80, le 6502, les premiers processeurs x86 comme le 8008, le 8086, le 8085, et bien d'autres. Il s'agit de circuits assez simples, bien plus simples que les additionneurs. Ils peuvent reprendre les optimisations présentes dans les additionneurs, comme l'anticipation de retenue ou le ''carry skip'', mais ces techniques sont bien plus simples à utiliser avec un incrémenteur. Il existe aussi des ''circuits décrémenteurs'', qui décrémentent une opérande, ainsi que des ''circuits incrémenteur-décrémenteur'', qui peuvent incrémenter ou décrémenter, selon comment on les configure. Je ne vais pas détailler ces circuits plus que ça, car de tels circuits sont assez rares, comparé à un circuit incrémenteur simple. ==Le demi-additionneur== Le circuit incrémenteur effectue l'opération suivante : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Un incrémenteur basique doit donc faire une addition pour chaque colonne, et précisémment une addition de deux bits. Il se trouve que la table d'addition est très simple en binaire. Jugez plutôt : * 0 + 0 = 0, retenue = 0 ; * 0 + 1 = 1, retenue = 0 ; * 1 + 0 = 1, retenue = 0 ; * 1 + 1 = 0, retenue = 1. Un circuit capable d'additionner deux bits est donc simple à construire avec les techniques vues dans les premiers chapitres. On voit immédiatement que la colonne des retenues donne une porte ET, alors que celle du bit de somme est calculé par un XOR. Le circuit obtenu est appelé un '''demi-additionneur'''. Il dispose d'une sortie S pour la somme, et C pour la retenue (''carry'' an anglais). {| class="flexible" |[[File:1-bit half-adder.svg|class=transparent|centre|Demi-addtionneur.]] |[[File:Half-adder.svg|centre|class=transparent|Circuit d'un demi-addtionneur.]] |} ==L'incrémenteur à propagation de retenue== Maintenant que l'on sait comment additionner deux bits, reprenons l'opération d'incrémentation : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Sur la colonne la plus à droite, il doit ajouter un au bit de poids faible. Pour les colonnes suivantes, il faut additionner le bit de l'opérande avec la retenue de la colonne précédente. En clair, on n'additionne que deux bits à chaque colonne : un 1 sur celle tout à droite, la retenue de la colonne précédente pour les autres. Et cela nous donne une idée de comment faire pour créer le circuit incrémenteur. Il suffit d'utiliser un demi-additionneur par colonne, et de les enchainer les uns à la suite des autres. Chaque demi-additionneur additionne le bit de l'opérande avec la retenue fournie par le demi-additionneur précédent. Le seul qui fait exception est celui pour la colonne de poids faible. Pour celui là, il doit ajouter 1 au bit de poids faible. Le résultat est appelé un '''incrémenteur à propagation de retenue'''. Il est constitué de demi-additionneurs enchaînés les uns à la suite des autres, qui propagent les retenues calculées du bit de poids faible vers le bit de poids fort. [[File:Circuit incrémenteur.png|centre|vignette|upright=3|Circuit incrémenteur.]] Maintenant, regardons le demi-additionneur le plus à droite, celui pour le bit de poids faible. Son entrée de retenue entrante est mise à 1 pour faire l'incrémentation. Quelques incrémenteurs permettent de configurer cette entrée de retenue à 0 ou à 1, ce qui effectue : soit une opération identité (l'opérande est recopié sur la sortie), soit une incrémentation. Un tel circuit est nommé un '''incrémenteur commandable'''. Nous aurons à utiliser une fois ou deux de tels incrémenteurs commandables dans la suite du cours. L'incrémenteur à propagation de retenue est le plus simple et le plus économe en portes logiques. Mais de tels incrémenteurs sont rarement utilisés. A la place, on leur préfère des incrémenteurs plus performants, qui utilisent souvent plus de portes logiques. De tels incrémenteurs sont conçus pour rendre le calcul des retenues plus rapide. En effet, la rapidité d'une incrémentation est limitée par la propagation de la retenue : les retenues commencent à être calculées au bit de poids fort et on doit les calculer colonne par colonne, jusqu’à atteindre le bit de poids fort. Et cette propagation des retenues prend beaucoup de temps. Plus l'opérande est longue, plus ce temps est élevé. Il y a deux optimisations principales, appelées le ''carry skip'' et l'anticipation de retenue, que nous allons décrire ci-dessous. ==Les incrémenteurs ''carry skip''== L'optimisation '''''carry skip''''' effectue l'incrémentation, non pas bit par bit, mais par paquets de deux bits. le résultat est que l'incrémentation est deux fois plus rapide, ou presque. Le circuit incrémenteur est donc composé en enchainant non pas des demi-additionneurs, mais des '''incrémenteurs 2 bits''' qui incrémentent une opérande de deux bits. [[File:Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits.png|centre|vignette|upright=2.5|Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits]] Reste à concevoir l'incrémenteur 2 bits. Une première solution part de deux demi-additionneurs et effectue quelques simplifications au niveau des transistors et des portes logiques. Par exemple, l'Intel 8085 a utilisé un circuit optimisé, fabriqué avec des portes NAND et NOR. La raison est qu'avec les technologies de transistors CMOS actuelles, les portes NAND et NOR utilisent moins de transistors que les portes ET et OU. Et cette possibilité a été utilisé pour effectuer des simplifications assez mineures, mais toujours bonnes à prendre. Mais nous ne pouvons pas en parler ici. Une solution alternative fabrique des incrémenteurs 2 bits qui calculent séparément les deux bits du résultat et la retenue sortante. La retenue sortante est calculée à partir des bits de l’opérande, sans propager des retenues. Ainsi, la retenue sortante est connu en avance, sans passer par deux demi-additionneurs. Pour créer un tel incrémenteur, le mieux est de partir de sa table de vérité. {|class="wikitable" |- ! Opérande !! Retenue entrante !! !! Retenue sortante !! Résultat |- | 00 || 0 || || 0 || 00 |- | 01 || 0 || || 0 || 01 |- | 10 || 0 || || 0 || 10 |- | 11 || 0 || || 0 || 11 |- | colspan="5" | |- | 00 || 1 || || 0 || 01 |- | 01 || 1 || || 0 || 10 |- | 10 || 1 || || 0 || 11 |- | 11 || 1 || || 1 || 00 |} Elle nous dit que la retenue sortante ne vaut 1 que dans un seul cas : les deux bits d'opérande valent 1, la retenue entrante vaut 1. Elle se calcule alors avec une porte ET à trois entrées. Pour les deux bits du résultat, les équations logiques ne donnent pas un résultat satisfaisant. La solution la plus simple est d'utiliser deux demi-additionneurs et de retirer les portes logiques superflues. Le résultat est alors un '''incrémenteur 2 bits ''carry skip''''', où la retenue sortante est calculée séparément du reste. [[File:Incrémenteur carry skip 2 bits.png|centre|vignette|upright=2.5|Incrémenteur ''carry skip'' 2 bits]] ==Les incrémenteurs à anticipation de retenue== L''''anticipation de retenue''' calcule la retenue d'une colonne sans attendre les retenues des colonnes précédentes. Il s'agit d'une optimisation qui est utilisée pour l'incrémentation, l'addition et d'autres opérations similaires. Pour l'incrémentation, déterminer la retenue ne demande pas de calculs complexes, contrairement à l'addition. Pour le comprendre, on peut regarder comment la retenue sortant d'un demi-additionneur est formée. Elle est calculée en faisant un ET logique entre la retenue entrante et le bit d'opérande. Une retenue est donc un ET logique entre toutes les retenues précédentes. Un autre moyen de s'en rendre compte est de regarder une suite de nombres codés en binaire : * 000 * 001 * 010 * 011 * 100 * 101 * 110 * 111 Il faut remarquer que lors d'une incrémentation, un bit s'inverse quand les bits des colonnes précédentes valent tous 1. Rappelons qu'additionner un bit avec une retenue inverse celui-ci si la retenue vaut 1, le recopie à l'identique si la retenue vaut zéro. Déterminer si les N bits précédents sont à 1 demande un simple ET entre les bits en question. Un incrémenteur à anticipation de retenue est donc composé d'un paquet de portes ET, avec pas mal de redondance entre les portes. Pour éviter de gaspiller trop de portes logiques, une solution est de mélanger anticipation de retenues et propagation de retenue. Par exemple, pour un incrémenteur 32 bits, on peut découper l'opérande en 4 octets : on anticipe les retenues pour chaque octet, mais l'incrémentation de chaque octet se fait avec propagation de retenue et/ou ''carry skip''. [[File:Incrémenteur à anticipation de retenues.png|centre|vignette|upright=3|Incrémenteur hybride utilisant partiellement l'anticipation de retenues.]] Quelques processeurs utilisaient l'anticipation de retenues. Par exemple, le processeur Z-80 de Zilog utilisait un incrémenteur pour des nombres de 16 bits, ce qui demandait des performances assez élevées. Et cet incrémenteur utilisait à la fois anticipation de retenues et ''carry skip''. Il était découpé en quatre blocs avant anticipation de retenues entre eux : un bloc regroupant les 7 bits de poids faible, suivi par un bloc de 5 bits, lui-même suivi par un bloc de 3 bits, terminé par un dernier bit isolé. A l'intérieur de ces blocs, les bits sont regroupés en paires utilisant le ''carry skip''. Pour ceux qui veulent en savoir plus sur cet incrémenteur, voici un lien sur le sujet : * [https://www.righto.com/2013/11/the-z-80s-16-bit-incrementdecrement.html The Z-80's 16-bit increment/decrement circuit reverse engineered]. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de sélection | prevText=Les circuits de sélection | next=Les bascules : des mémoires de 1 bit | nextText=Les bascules : des mémoires de 1 bit }} </noinclude> p9s4wg2eo7o0yyms52wx962kq3rmg3t 768020 768019 2026-06-18T14:46:53Z Mewtow 31375 /* Les incrémenteurs à anticipation de retenue */ 768020 wikitext text/x-wiki Le circuit '''incrémenteur''' incrémente un nombre entier. Plus précisément, il prend en entrée un nombre entier, et fournit en entier le nombre suivant, il lui ajoute 1. Une telle opération peut paraitre triviale et peu intéressante. Cependant, elle est très utilisée et est absolument cruciale pour créer des circuits capables de compter ou décompter. De plus, au-delà de leur utilisation dans les compteurs, les incrémenteurs étaient très utilisés sur les premiers processeurs 8 bits, comme le Z-80, le 6502, les premiers processeurs x86 comme le 8008, le 8086, le 8085, et bien d'autres. Il s'agit de circuits assez simples, bien plus simples que les additionneurs. Ils peuvent reprendre les optimisations présentes dans les additionneurs, comme l'anticipation de retenue ou le ''carry skip'', mais ces techniques sont bien plus simples à utiliser avec un incrémenteur. Il existe aussi des ''circuits décrémenteurs'', qui décrémentent une opérande, ainsi que des ''circuits incrémenteur-décrémenteur'', qui peuvent incrémenter ou décrémenter, selon comment on les configure. Je ne vais pas détailler ces circuits plus que ça, car de tels circuits sont assez rares, comparé à un circuit incrémenteur simple. ==Le demi-additionneur== Le circuit incrémenteur effectue l'opération suivante : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Un incrémenteur basique doit donc faire une addition pour chaque colonne, et précisémment une addition de deux bits. Il se trouve que la table d'addition est très simple en binaire. Jugez plutôt : * 0 + 0 = 0, retenue = 0 ; * 0 + 1 = 1, retenue = 0 ; * 1 + 0 = 1, retenue = 0 ; * 1 + 1 = 0, retenue = 1. Un circuit capable d'additionner deux bits est donc simple à construire avec les techniques vues dans les premiers chapitres. On voit immédiatement que la colonne des retenues donne une porte ET, alors que celle du bit de somme est calculé par un XOR. Le circuit obtenu est appelé un '''demi-additionneur'''. Il dispose d'une sortie S pour la somme, et C pour la retenue (''carry'' an anglais). {| class="flexible" |[[File:1-bit half-adder.svg|class=transparent|centre|Demi-addtionneur.]] |[[File:Half-adder.svg|centre|class=transparent|Circuit d'un demi-addtionneur.]] |} ==L'incrémenteur à propagation de retenue== Maintenant que l'on sait comment additionner deux bits, reprenons l'opération d'incrémentation : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Sur la colonne la plus à droite, il doit ajouter un au bit de poids faible. Pour les colonnes suivantes, il faut additionner le bit de l'opérande avec la retenue de la colonne précédente. En clair, on n'additionne que deux bits à chaque colonne : un 1 sur celle tout à droite, la retenue de la colonne précédente pour les autres. Et cela nous donne une idée de comment faire pour créer le circuit incrémenteur. Il suffit d'utiliser un demi-additionneur par colonne, et de les enchainer les uns à la suite des autres. Chaque demi-additionneur additionne le bit de l'opérande avec la retenue fournie par le demi-additionneur précédent. Le seul qui fait exception est celui pour la colonne de poids faible. Pour celui là, il doit ajouter 1 au bit de poids faible. Le résultat est appelé un '''incrémenteur à propagation de retenue'''. Il est constitué de demi-additionneurs enchaînés les uns à la suite des autres, qui propagent les retenues calculées du bit de poids faible vers le bit de poids fort. [[File:Circuit incrémenteur.png|centre|vignette|upright=3|Circuit incrémenteur.]] Maintenant, regardons le demi-additionneur le plus à droite, celui pour le bit de poids faible. Son entrée de retenue entrante est mise à 1 pour faire l'incrémentation. Quelques incrémenteurs permettent de configurer cette entrée de retenue à 0 ou à 1, ce qui effectue : soit une opération identité (l'opérande est recopié sur la sortie), soit une incrémentation. Un tel circuit est nommé un '''incrémenteur commandable'''. Nous aurons à utiliser une fois ou deux de tels incrémenteurs commandables dans la suite du cours. L'incrémenteur à propagation de retenue est le plus simple et le plus économe en portes logiques. Mais de tels incrémenteurs sont rarement utilisés. A la place, on leur préfère des incrémenteurs plus performants, qui utilisent souvent plus de portes logiques. De tels incrémenteurs sont conçus pour rendre le calcul des retenues plus rapide. En effet, la rapidité d'une incrémentation est limitée par la propagation de la retenue : les retenues commencent à être calculées au bit de poids fort et on doit les calculer colonne par colonne, jusqu’à atteindre le bit de poids fort. Et cette propagation des retenues prend beaucoup de temps. Plus l'opérande est longue, plus ce temps est élevé. Il y a deux optimisations principales, appelées le ''carry skip'' et l'anticipation de retenue, que nous allons décrire ci-dessous. ==Les incrémenteurs ''carry skip''== L'optimisation '''''carry skip''''' effectue l'incrémentation, non pas bit par bit, mais par paquets de deux bits. le résultat est que l'incrémentation est deux fois plus rapide, ou presque. Le circuit incrémenteur est donc composé en enchainant non pas des demi-additionneurs, mais des '''incrémenteurs 2 bits''' qui incrémentent une opérande de deux bits. [[File:Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits.png|centre|vignette|upright=2.5|Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits]] Reste à concevoir l'incrémenteur 2 bits. Une première solution part de deux demi-additionneurs et effectue quelques simplifications au niveau des transistors et des portes logiques. Par exemple, l'Intel 8085 a utilisé un circuit optimisé, fabriqué avec des portes NAND et NOR. La raison est qu'avec les technologies de transistors CMOS actuelles, les portes NAND et NOR utilisent moins de transistors que les portes ET et OU. Et cette possibilité a été utilisé pour effectuer des simplifications assez mineures, mais toujours bonnes à prendre. Mais nous ne pouvons pas en parler ici. Une solution alternative fabrique des incrémenteurs 2 bits qui calculent séparément les deux bits du résultat et la retenue sortante. La retenue sortante est calculée à partir des bits de l’opérande, sans propager des retenues. Ainsi, la retenue sortante est connu en avance, sans passer par deux demi-additionneurs. Pour créer un tel incrémenteur, le mieux est de partir de sa table de vérité. {|class="wikitable" |- ! Opérande !! Retenue entrante !! !! Retenue sortante !! Résultat |- | 00 || 0 || || 0 || 00 |- | 01 || 0 || || 0 || 01 |- | 10 || 0 || || 0 || 10 |- | 11 || 0 || || 0 || 11 |- | colspan="5" | |- | 00 || 1 || || 0 || 01 |- | 01 || 1 || || 0 || 10 |- | 10 || 1 || || 0 || 11 |- | 11 || 1 || || 1 || 00 |} Elle nous dit que la retenue sortante ne vaut 1 que dans un seul cas : les deux bits d'opérande valent 1, la retenue entrante vaut 1. Elle se calcule alors avec une porte ET à trois entrées. Pour les deux bits du résultat, les équations logiques ne donnent pas un résultat satisfaisant. La solution la plus simple est d'utiliser deux demi-additionneurs et de retirer les portes logiques superflues. Le résultat est alors un '''incrémenteur 2 bits ''carry skip''''', où la retenue sortante est calculée séparément du reste. [[File:Incrémenteur carry skip 2 bits.png|centre|vignette|upright=2.5|Incrémenteur ''carry skip'' 2 bits]] ==Les incrémenteurs à anticipation de retenue== L''''anticipation de retenue''' calcule la retenue d'une colonne sans attendre les retenues des colonnes précédentes. Il s'agit d'une optimisation qui est utilisée pour l'incrémentation, l'addition et d'autres opérations similaires. Pour l'incrémentation, déterminer la retenue ne demande pas de calculs complexes, contrairement à l'addition. Pour le comprendre, on peut regarder comment la retenue sortant d'un demi-additionneur est formée. Elle est calculée en faisant un ET logique entre la retenue entrante et le bit d'opérande. Une retenue est donc un ET logique entre toutes les retenues précédentes. Un incrémenteur à anticipation de retenue est donc composé d'un paquet de portes ET à plusieurs entrées. En théorie, on peut utiliser une porte ET à plusieurs entrées pour chaque colonne. Cependant, cela entrainera un cout en transistors très important, avec pas mal de redondance entre les portes. Pour éviter de gaspiller trop de portes logiques, une solution est de mélanger anticipation de retenues et propagation de retenue. Par exemple, pour un incrémenteur 32 bits, on peut découper l'opérande en 4 octets : on anticipe les retenues pour chaque octet, mais l'incrémentation de chaque octet se fait avec propagation de retenue et/ou ''carry skip''. [[File:Incrémenteur à anticipation de retenues.png|centre|vignette|upright=3|Incrémenteur hybride utilisant partiellement l'anticipation de retenues.]] Quelques processeurs utilisaient l'anticipation de retenues. Par exemple, le processeur Z-80 de Zilog utilisait un incrémenteur pour des nombres de 16 bits, ce qui demandait des performances assez élevées. Et cet incrémenteur utilisait à la fois anticipation de retenues et ''carry skip''. Il était découpé en quatre blocs avant anticipation de retenues entre eux : un bloc regroupant les 7 bits de poids faible, suivi par un bloc de 5 bits, lui-même suivi par un bloc de 3 bits, terminé par un dernier bit isolé. A l'intérieur de ces blocs, les bits sont regroupés en paires utilisant le ''carry skip''. Pour ceux qui veulent en savoir plus sur cet incrémenteur, voici un lien sur le sujet : * [https://www.righto.com/2013/11/the-z-80s-16-bit-incrementdecrement.html The Z-80's 16-bit increment/decrement circuit reverse engineered]. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de sélection | prevText=Les circuits de sélection | next=Les bascules : des mémoires de 1 bit | nextText=Les bascules : des mémoires de 1 bit }} </noinclude> 26k5nh6sbmdj9s0tuhe3hlc6tz8x60f 768021 768020 2026-06-18T14:58:21Z Mewtow 31375 /* Les incrémenteurs à anticipation de retenue */ 768021 wikitext text/x-wiki Le circuit '''incrémenteur''' incrémente un nombre entier. Plus précisément, il prend en entrée un nombre entier, et fournit en entier le nombre suivant, il lui ajoute 1. Une telle opération peut paraitre triviale et peu intéressante. Cependant, elle est très utilisée et est absolument cruciale pour créer des circuits capables de compter ou décompter. De plus, au-delà de leur utilisation dans les compteurs, les incrémenteurs étaient très utilisés sur les premiers processeurs 8 bits, comme le Z-80, le 6502, les premiers processeurs x86 comme le 8008, le 8086, le 8085, et bien d'autres. Il s'agit de circuits assez simples, bien plus simples que les additionneurs. Ils peuvent reprendre les optimisations présentes dans les additionneurs, comme l'anticipation de retenue ou le ''carry skip'', mais ces techniques sont bien plus simples à utiliser avec un incrémenteur. Il existe aussi des ''circuits décrémenteurs'', qui décrémentent une opérande, ainsi que des ''circuits incrémenteur-décrémenteur'', qui peuvent incrémenter ou décrémenter, selon comment on les configure. Je ne vais pas détailler ces circuits plus que ça, car de tels circuits sont assez rares, comparé à un circuit incrémenteur simple. ==Le demi-additionneur== Le circuit incrémenteur effectue l'opération suivante : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Un incrémenteur basique doit donc faire une addition pour chaque colonne, et précisémment une addition de deux bits. Il se trouve que la table d'addition est très simple en binaire. Jugez plutôt : * 0 + 0 = 0, retenue = 0 ; * 0 + 1 = 1, retenue = 0 ; * 1 + 0 = 1, retenue = 0 ; * 1 + 1 = 0, retenue = 1. Un circuit capable d'additionner deux bits est donc simple à construire avec les techniques vues dans les premiers chapitres. On voit immédiatement que la colonne des retenues donne une porte ET, alors que celle du bit de somme est calculé par un XOR. Le circuit obtenu est appelé un '''demi-additionneur'''. Il dispose d'une sortie S pour la somme, et C pour la retenue (''carry'' an anglais). {| class="flexible" |[[File:1-bit half-adder.svg|class=transparent|centre|Demi-addtionneur.]] |[[File:Half-adder.svg|centre|class=transparent|Circuit d'un demi-addtionneur.]] |} ==L'incrémenteur à propagation de retenue== Maintenant que l'on sait comment additionner deux bits, reprenons l'opération d'incrémentation : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Sur la colonne la plus à droite, il doit ajouter un au bit de poids faible. Pour les colonnes suivantes, il faut additionner le bit de l'opérande avec la retenue de la colonne précédente. En clair, on n'additionne que deux bits à chaque colonne : un 1 sur celle tout à droite, la retenue de la colonne précédente pour les autres. Et cela nous donne une idée de comment faire pour créer le circuit incrémenteur. Il suffit d'utiliser un demi-additionneur par colonne, et de les enchainer les uns à la suite des autres. Chaque demi-additionneur additionne le bit de l'opérande avec la retenue fournie par le demi-additionneur précédent. Le seul qui fait exception est celui pour la colonne de poids faible. Pour celui là, il doit ajouter 1 au bit de poids faible. Le résultat est appelé un '''incrémenteur à propagation de retenue'''. Il est constitué de demi-additionneurs enchaînés les uns à la suite des autres, qui propagent les retenues calculées du bit de poids faible vers le bit de poids fort. [[File:Circuit incrémenteur.png|centre|vignette|upright=3|Circuit incrémenteur.]] Maintenant, regardons le demi-additionneur le plus à droite, celui pour le bit de poids faible. Son entrée de retenue entrante est mise à 1 pour faire l'incrémentation. Quelques incrémenteurs permettent de configurer cette entrée de retenue à 0 ou à 1, ce qui effectue : soit une opération identité (l'opérande est recopié sur la sortie), soit une incrémentation. Un tel circuit est nommé un '''incrémenteur commandable'''. Nous aurons à utiliser une fois ou deux de tels incrémenteurs commandables dans la suite du cours. L'incrémenteur à propagation de retenue est le plus simple et le plus économe en portes logiques. Mais de tels incrémenteurs sont rarement utilisés. A la place, on leur préfère des incrémenteurs plus performants, qui utilisent souvent plus de portes logiques. De tels incrémenteurs sont conçus pour rendre le calcul des retenues plus rapide. En effet, la rapidité d'une incrémentation est limitée par la propagation de la retenue : les retenues commencent à être calculées au bit de poids fort et on doit les calculer colonne par colonne, jusqu’à atteindre le bit de poids fort. Et cette propagation des retenues prend beaucoup de temps. Plus l'opérande est longue, plus ce temps est élevé. Il y a deux optimisations principales, appelées le ''carry skip'' et l'anticipation de retenue, que nous allons décrire ci-dessous. ==Les incrémenteurs ''carry skip''== L'optimisation '''''carry skip''''' effectue l'incrémentation, non pas bit par bit, mais par paquets de deux bits. le résultat est que l'incrémentation est deux fois plus rapide, ou presque. Le circuit incrémenteur est donc composé en enchainant non pas des demi-additionneurs, mais des '''incrémenteurs 2 bits''' qui incrémentent une opérande de deux bits. [[File:Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits.png|centre|vignette|upright=2.5|Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits]] Reste à concevoir l'incrémenteur 2 bits. Une première solution part de deux demi-additionneurs et effectue quelques simplifications au niveau des transistors et des portes logiques. Par exemple, l'Intel 8085 a utilisé un circuit optimisé, fabriqué avec des portes NAND et NOR. La raison est qu'avec les technologies de transistors CMOS actuelles, les portes NAND et NOR utilisent moins de transistors que les portes ET et OU. Et cette possibilité a été utilisé pour effectuer des simplifications assez mineures, mais toujours bonnes à prendre. Mais nous ne pouvons pas en parler ici. Une solution alternative fabrique des incrémenteurs 2 bits qui calculent séparément les deux bits du résultat et la retenue sortante. La retenue sortante est calculée à partir des bits de l’opérande, sans propager des retenues. Ainsi, la retenue sortante est connu en avance, sans passer par deux demi-additionneurs. Pour créer un tel incrémenteur, le mieux est de partir de sa table de vérité. {|class="wikitable" |- ! Opérande !! Retenue entrante !! !! Retenue sortante !! Résultat |- | 00 || 0 || || 0 || 00 |- | 01 || 0 || || 0 || 01 |- | 10 || 0 || || 0 || 10 |- | 11 || 0 || || 0 || 11 |- | colspan="5" | |- | 00 || 1 || || 0 || 01 |- | 01 || 1 || || 0 || 10 |- | 10 || 1 || || 0 || 11 |- | 11 || 1 || || 1 || 00 |} Elle nous dit que la retenue sortante ne vaut 1 que dans un seul cas : les deux bits d'opérande valent 1, la retenue entrante vaut 1. Elle se calcule alors avec une porte ET à trois entrées. Pour les deux bits du résultat, les équations logiques ne donnent pas un résultat satisfaisant. La solution la plus simple est d'utiliser deux demi-additionneurs et de retirer les portes logiques superflues. Le résultat est alors un '''incrémenteur 2 bits ''carry skip''''', où la retenue sortante est calculée séparément du reste. [[File:Incrémenteur carry skip 2 bits.png|centre|vignette|upright=2.5|Incrémenteur ''carry skip'' 2 bits]] ==Les incrémenteurs à anticipation de retenue== L''''anticipation de retenue''' calcule la retenue d'une colonne sans attendre les retenues des colonnes précédentes. Il s'agit d'une optimisation qui est utilisée pour l'incrémentation, l'addition et d'autres opérations similaires. Pour l'incrémentation, déterminer la retenue ne demande pas de calculs complexes, contrairement à l'addition. Pour le comprendre, on peut regarder comment la retenue sortant d'un demi-additionneur est formée. Elle est calculée en faisant un ET logique entre la retenue entrante et le bit d'opérande. Une retenue est donc un ET logique entre toutes les retenues précédentes. Un incrémenteur à anticipation de retenue utilise donc une porte ET à plusieurs entrées pour calculer une retenue. [[File:Anticipation de retenue pour un bit du résultat, incrémenteur.png|centre|vignette|upright=2.5|Anticipation de retenue pour un bit du résultat, incrémenteur]] En théorie, on peut utiliser une porte ET à plusieurs entrées pour chaque colonne. Cependant, cela entrainera un cout en transistors très important, avec pas mal de redondance entre les portes. Pour éviter de gaspiller trop de portes logiques, une solution est de mélanger anticipation de retenues et propagation de retenue. Par exemple, pour un incrémenteur 32 bits, on peut découper l'opérande en 4 octets : on anticipe les retenues pour chaque octet, mais l'incrémentation de chaque octet se fait avec propagation de retenue et/ou ''carry skip''. [[File:Incrémenteur à anticipation de retenues.png|centre|vignette|upright=3|Incrémenteur hybride utilisant partiellement l'anticipation de retenues.]] Quelques processeurs utilisaient l'anticipation de retenues. Par exemple, le processeur Z-80 de Zilog utilisait un incrémenteur pour des nombres de 16 bits, ce qui demandait des performances assez élevées. Et cet incrémenteur utilisait à la fois anticipation de retenues et ''carry skip''. Il était découpé en quatre blocs avant anticipation de retenues entre eux : un bloc regroupant les 7 bits de poids faible, suivi par un bloc de 5 bits, lui-même suivi par un bloc de 3 bits, terminé par un dernier bit isolé. A l'intérieur de ces blocs, les bits sont regroupés en paires utilisant le ''carry skip''. Pour ceux qui veulent en savoir plus sur cet incrémenteur, voici un lien sur le sujet : * [https://www.righto.com/2013/11/the-z-80s-16-bit-incrementdecrement.html The Z-80's 16-bit increment/decrement circuit reverse engineered]. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de sélection | prevText=Les circuits de sélection | next=Les bascules : des mémoires de 1 bit | nextText=Les bascules : des mémoires de 1 bit }} </noinclude> 73b8zqwo1s32j9284227o4jaeuccmgr 768022 768021 2026-06-18T14:58:51Z Mewtow 31375 /* Les incrémenteurs à anticipation de retenue */ 768022 wikitext text/x-wiki Le circuit '''incrémenteur''' incrémente un nombre entier. Plus précisément, il prend en entrée un nombre entier, et fournit en entier le nombre suivant, il lui ajoute 1. Une telle opération peut paraitre triviale et peu intéressante. Cependant, elle est très utilisée et est absolument cruciale pour créer des circuits capables de compter ou décompter. De plus, au-delà de leur utilisation dans les compteurs, les incrémenteurs étaient très utilisés sur les premiers processeurs 8 bits, comme le Z-80, le 6502, les premiers processeurs x86 comme le 8008, le 8086, le 8085, et bien d'autres. Il s'agit de circuits assez simples, bien plus simples que les additionneurs. Ils peuvent reprendre les optimisations présentes dans les additionneurs, comme l'anticipation de retenue ou le ''carry skip'', mais ces techniques sont bien plus simples à utiliser avec un incrémenteur. Il existe aussi des ''circuits décrémenteurs'', qui décrémentent une opérande, ainsi que des ''circuits incrémenteur-décrémenteur'', qui peuvent incrémenter ou décrémenter, selon comment on les configure. Je ne vais pas détailler ces circuits plus que ça, car de tels circuits sont assez rares, comparé à un circuit incrémenteur simple. ==Le demi-additionneur== Le circuit incrémenteur effectue l'opération suivante : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Un incrémenteur basique doit donc faire une addition pour chaque colonne, et précisémment une addition de deux bits. Il se trouve que la table d'addition est très simple en binaire. Jugez plutôt : * 0 + 0 = 0, retenue = 0 ; * 0 + 1 = 1, retenue = 0 ; * 1 + 0 = 1, retenue = 0 ; * 1 + 1 = 0, retenue = 1. Un circuit capable d'additionner deux bits est donc simple à construire avec les techniques vues dans les premiers chapitres. On voit immédiatement que la colonne des retenues donne une porte ET, alors que celle du bit de somme est calculé par un XOR. Le circuit obtenu est appelé un '''demi-additionneur'''. Il dispose d'une sortie S pour la somme, et C pour la retenue (''carry'' an anglais). {| class="flexible" |[[File:1-bit half-adder.svg|class=transparent|centre|Demi-addtionneur.]] |[[File:Half-adder.svg|centre|class=transparent|Circuit d'un demi-addtionneur.]] |} ==L'incrémenteur à propagation de retenue== Maintenant que l'on sait comment additionner deux bits, reprenons l'opération d'incrémentation : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Sur la colonne la plus à droite, il doit ajouter un au bit de poids faible. Pour les colonnes suivantes, il faut additionner le bit de l'opérande avec la retenue de la colonne précédente. En clair, on n'additionne que deux bits à chaque colonne : un 1 sur celle tout à droite, la retenue de la colonne précédente pour les autres. Et cela nous donne une idée de comment faire pour créer le circuit incrémenteur. Il suffit d'utiliser un demi-additionneur par colonne, et de les enchainer les uns à la suite des autres. Chaque demi-additionneur additionne le bit de l'opérande avec la retenue fournie par le demi-additionneur précédent. Le seul qui fait exception est celui pour la colonne de poids faible. Pour celui là, il doit ajouter 1 au bit de poids faible. Le résultat est appelé un '''incrémenteur à propagation de retenue'''. Il est constitué de demi-additionneurs enchaînés les uns à la suite des autres, qui propagent les retenues calculées du bit de poids faible vers le bit de poids fort. [[File:Circuit incrémenteur.png|centre|vignette|upright=3|Circuit incrémenteur.]] Maintenant, regardons le demi-additionneur le plus à droite, celui pour le bit de poids faible. Son entrée de retenue entrante est mise à 1 pour faire l'incrémentation. Quelques incrémenteurs permettent de configurer cette entrée de retenue à 0 ou à 1, ce qui effectue : soit une opération identité (l'opérande est recopié sur la sortie), soit une incrémentation. Un tel circuit est nommé un '''incrémenteur commandable'''. Nous aurons à utiliser une fois ou deux de tels incrémenteurs commandables dans la suite du cours. L'incrémenteur à propagation de retenue est le plus simple et le plus économe en portes logiques. Mais de tels incrémenteurs sont rarement utilisés. A la place, on leur préfère des incrémenteurs plus performants, qui utilisent souvent plus de portes logiques. De tels incrémenteurs sont conçus pour rendre le calcul des retenues plus rapide. En effet, la rapidité d'une incrémentation est limitée par la propagation de la retenue : les retenues commencent à être calculées au bit de poids fort et on doit les calculer colonne par colonne, jusqu’à atteindre le bit de poids fort. Et cette propagation des retenues prend beaucoup de temps. Plus l'opérande est longue, plus ce temps est élevé. Il y a deux optimisations principales, appelées le ''carry skip'' et l'anticipation de retenue, que nous allons décrire ci-dessous. ==Les incrémenteurs ''carry skip''== L'optimisation '''''carry skip''''' effectue l'incrémentation, non pas bit par bit, mais par paquets de deux bits. le résultat est que l'incrémentation est deux fois plus rapide, ou presque. Le circuit incrémenteur est donc composé en enchainant non pas des demi-additionneurs, mais des '''incrémenteurs 2 bits''' qui incrémentent une opérande de deux bits. [[File:Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits.png|centre|vignette|upright=2.5|Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits]] Reste à concevoir l'incrémenteur 2 bits. Une première solution part de deux demi-additionneurs et effectue quelques simplifications au niveau des transistors et des portes logiques. Par exemple, l'Intel 8085 a utilisé un circuit optimisé, fabriqué avec des portes NAND et NOR. La raison est qu'avec les technologies de transistors CMOS actuelles, les portes NAND et NOR utilisent moins de transistors que les portes ET et OU. Et cette possibilité a été utilisé pour effectuer des simplifications assez mineures, mais toujours bonnes à prendre. Mais nous ne pouvons pas en parler ici. Une solution alternative fabrique des incrémenteurs 2 bits qui calculent séparément les deux bits du résultat et la retenue sortante. La retenue sortante est calculée à partir des bits de l’opérande, sans propager des retenues. Ainsi, la retenue sortante est connu en avance, sans passer par deux demi-additionneurs. Pour créer un tel incrémenteur, le mieux est de partir de sa table de vérité. {|class="wikitable" |- ! Opérande !! Retenue entrante !! !! Retenue sortante !! Résultat |- | 00 || 0 || || 0 || 00 |- | 01 || 0 || || 0 || 01 |- | 10 || 0 || || 0 || 10 |- | 11 || 0 || || 0 || 11 |- | colspan="5" | |- | 00 || 1 || || 0 || 01 |- | 01 || 1 || || 0 || 10 |- | 10 || 1 || || 0 || 11 |- | 11 || 1 || || 1 || 00 |} Elle nous dit que la retenue sortante ne vaut 1 que dans un seul cas : les deux bits d'opérande valent 1, la retenue entrante vaut 1. Elle se calcule alors avec une porte ET à trois entrées. Pour les deux bits du résultat, les équations logiques ne donnent pas un résultat satisfaisant. La solution la plus simple est d'utiliser deux demi-additionneurs et de retirer les portes logiques superflues. Le résultat est alors un '''incrémenteur 2 bits ''carry skip''''', où la retenue sortante est calculée séparément du reste. [[File:Incrémenteur carry skip 2 bits.png|centre|vignette|upright=2.5|Incrémenteur ''carry skip'' 2 bits]] ==Les incrémenteurs à anticipation de retenue== L''''anticipation de retenue''' calcule la retenue d'une colonne sans attendre les retenues des colonnes précédentes. Il s'agit d'une optimisation qui est utilisée pour l'incrémentation, l'addition et d'autres opérations similaires. Pour l'incrémentation, déterminer la retenue ne demande pas de calculs complexes, contrairement à l'addition. Pour le comprendre, on peut regarder comment la retenue sortant d'un demi-additionneur est formée. Elle est calculée en faisant un ET logique entre la retenue entrante et le bit d'opérande. Une retenue est donc un ET logique entre toutes les retenues précédentes. Un incrémenteur à anticipation de retenue utilise donc une porte ET à plusieurs entrées pour calculer une retenue. [[File:Anticipation de retenue pour un bit du résultat, incrémenteur.png|centre|vignette|upright=2.5|Anticipation de retenue pour un bit du résultat, incrémenteur]] En théorie, on peut utiliser une porte ET à plusieurs entrées pour chaque bit de l'opérande. Cependant, cela entrainera un cout en transistors très important. Pour éviter de gaspiller trop de portes logiques, une solution est de mélanger anticipation de retenues et propagation de retenue. Par exemple, pour un incrémenteur 32 bits, on peut découper l'opérande en 4 octets : on anticipe les retenues pour chaque octet, mais l'incrémentation de chaque octet se fait avec propagation de retenue et/ou ''carry skip''. [[File:Incrémenteur à anticipation de retenues.png|centre|vignette|upright=3|Incrémenteur hybride utilisant partiellement l'anticipation de retenues.]] Quelques processeurs utilisaient l'anticipation de retenues. Par exemple, le processeur Z-80 de Zilog utilisait un incrémenteur pour des nombres de 16 bits, ce qui demandait des performances assez élevées. Et cet incrémenteur utilisait à la fois anticipation de retenues et ''carry skip''. Il était découpé en quatre blocs avant anticipation de retenues entre eux : un bloc regroupant les 7 bits de poids faible, suivi par un bloc de 5 bits, lui-même suivi par un bloc de 3 bits, terminé par un dernier bit isolé. A l'intérieur de ces blocs, les bits sont regroupés en paires utilisant le ''carry skip''. Pour ceux qui veulent en savoir plus sur cet incrémenteur, voici un lien sur le sujet : * [https://www.righto.com/2013/11/the-z-80s-16-bit-incrementdecrement.html The Z-80's 16-bit increment/decrement circuit reverse engineered]. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de sélection | prevText=Les circuits de sélection | next=Les bascules : des mémoires de 1 bit | nextText=Les bascules : des mémoires de 1 bit }} </noinclude> r3r7t14uf3j0n2chhvtujqh03rmubv8 768033 768022 2026-06-18T15:18:00Z Mewtow 31375 768033 wikitext text/x-wiki Le circuit '''incrémenteur''' incrémente un nombre entier. Plus précisément, il prend en entrée un nombre entier, et fournit en entier le nombre suivant, il lui ajoute 1. Une telle opération peut paraitre triviale et peu intéressante. Cependant, elle est très utilisée et est absolument cruciale pour créer des circuits capables de compter ou décompter. De plus, au-delà de leur utilisation dans les compteurs, les incrémenteurs étaient très utilisés sur les premiers processeurs 8 bits, comme le Z-80, le 6502, les premiers processeurs x86 comme le 8008, le 8086, le 8085, et bien d'autres. Il s'agit de circuits assez simples, bien plus simples que les additionneurs. Ils peuvent reprendre les optimisations présentes dans les additionneurs, comme l'anticipation de retenue ou le ''carry skip'', mais ces techniques sont bien plus simples à utiliser avec un incrémenteur. Il existe aussi des ''circuits décrémenteurs'', qui décrémentent un opérande, ainsi que des ''circuits incrémenteur-décrémenteur'', qui peuvent incrémenter ou décrémenter, selon comment on les configure. Je ne vais pas détailler ces circuits plus que ça, car de tels circuits sont assez rares, comparé à un circuit incrémenteur simple. ==Le demi-additionneur== Le circuit incrémenteur effectue l'opération suivante : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Un incrémenteur basique doit donc faire une addition pour chaque colonne, et précisément une addition de deux bits. Il se trouve que la table d'addition est très simple en binaire. Jugez plutôt : * 0 + 0 = 0, retenue = 0 ; * 0 + 1 = 1, retenue = 0 ; * 1 + 0 = 1, retenue = 0 ; * 1 + 1 = 0, retenue = 1. Un circuit capable d'additionner deux bits est donc simple à construire avec les techniques vues dans les premiers chapitres. On voit immédiatement que la colonne des retenues donne une porte ET, alors que celle du bit de somme est calculé par un XOR. Le circuit obtenu est appelé un '''demi-additionneur'''. Il dispose d'une sortie S pour la somme, et C pour la retenue (''carry'' an anglais). {| class="flexible" |[[File:1-bit half-adder.svg|class=transparent|centre|Demi-addtionneur.]] |[[File:Half-adder.svg|centre|class=transparent|Circuit d'un demi-addtionneur.]] |} ==L'incrémenteur à propagation de retenue== Maintenant que l'on sait comment additionner deux bits, reprenons l'opération d'incrémentation : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Sur la colonne la plus à droite, il doit ajouter un au bit de poids faible. Pour les colonnes suivantes, il faut additionner le bit de l'opérande avec la retenue de la colonne précédente. En clair, on n'additionne que deux bits à chaque colonne : un 1 sur celle tout à droite, la retenue de la colonne précédente pour les autres. Et cela nous donne une idée de comment faire pour créer le circuit incrémenteur. Il suffit d'utiliser un demi-additionneur par colonne, et de les enchainer les uns à la suite des autres. Chaque demi-additionneur additionne le bit de l'opérande avec la retenue fournie par le demi-additionneur précédent. Le seul qui fait exception est celui pour la colonne de poids faible. Pour celui-là, il doit ajouter 1 au bit de poids faible. Le résultat est appelé un '''incrémenteur à propagation de retenue'''. Il est constitué de demi-additionneurs enchaînés les uns à la suite des autres, qui propagent les retenues calculées du bit de poids faible vers le bit de poids fort. [[File:Circuit incrémenteur.png|centre|vignette|upright=3|Circuit incrémenteur.]] Maintenant, regardons le demi-additionneur le plus à droite, celui pour le bit de poids faible. Son entrée de retenue entrante est mise à 1 pour faire l'incrémentation. Quelques incrémenteurs permettent de configurer cette entrée de retenue à 0 ou à 1, ce qui effectue : soit une opération identité (l'opérande est recopié sur la sortie), soit une incrémentation. Un tel circuit est nommé un '''incrémenteur commandable'''. Nous aurons à utiliser une fois ou deux de tels incrémenteurs commandables dans la suite du cours. L'incrémenteur à propagation de retenue est le plus simple et le plus économe en portes logiques. Mais de tels incrémenteurs sont rarement utilisés. À la place, on leur préfère des incrémenteurs plus performants, qui utilisent souvent plus de portes logiques. De tels incrémenteurs sont conçus pour rendre le calcul des retenues plus rapide. En effet, la rapidité d'une incrémentation est limitée par la propagation de la retenue : les retenues commencent à être calculées au bit de poids fort et on doit les calculer colonne par colonne, jusqu’à atteindre le bit de poids fort. Et cette propagation des retenues prend beaucoup de temps. Plus l'opérande est longue, plus ce temps est élevé. Il y a deux optimisations principales, appelées le ''carry skip'' et l'anticipation de retenue, que nous allons décrire ci-dessous. ==Les incrémenteurs ''carry skip''== L'optimisation '''''carry skip''''' effectue l'incrémentation, non pas bit par bit, mais par paquets de deux bits. Le résultat est que l'incrémentation est deux fois plus rapide, ou presque. Le circuit incrémenteur est donc composé en enchainant non pas des demi-additionneurs, mais des '''incrémenteurs 2 bits''' qui incrémentent un opérande de deux bits. [[File:Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits.png|centre|vignette|upright=2.5|Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits]] Reste à concevoir l'incrémenteur 2 bits. Une première solution part de deux demi-additionneurs et effectue quelques simplifications au niveau des transistors et des portes logiques. Par exemple, l'Intel 8085 a utilisé un circuit optimisé, fabriqué avec des portes NAND et NOR. La raison est qu'avec les technologies de transistors CMOS actuelles, les portes NAND et NOR utilisent moins de transistors que les portes ET et OU. Et cette possibilité a été utilisée pour effectuer des simplifications assez mineures, mais toujours bonnes à prendre. Mais nous ne pouvons pas en parler ici. Une solution alternative fabrique des incrémenteurs 2 bits qui calculent séparément les deux bits du résultat et la retenue sortante. La retenue sortante est calculée à partir des bits de l’opérande, sans propager des retenues. Ainsi, la retenue sortante est connue en avance, sans passer par deux demi-additionneurs. Pour créer un tel incrémenteur, le mieux est de partir de sa table de vérité. {|class="wikitable" |- ! Opérande !! Retenue entrante !! !! Retenue sortante !! Résultat |- | 00 || 0 || || 0 || 00 |- | 01 || 0 || || 0 || 01 |- | 10 || 0 || || 0 || 10 |- | 11 || 0 || || 0 || 11 |- | colspan="5" | |- | 00 || 1 || || 0 || 01 |- | 01 || 1 || || 0 || 10 |- | 10 || 1 || || 0 || 11 |- | 11 || 1 || || 1 || 00 |} Elle nous dit que la retenue sortante ne vaut 1 que dans un seul cas : les deux bits d'opérande valent 1, la retenue entrante vaut 1. Elle se calcule alors avec une porte ET à trois entrées. Pour les deux bits du résultat, les équations logiques ne donnent pas un résultat satisfaisant. La solution la plus simple est d'utiliser deux demi-additionneurs et de retirer les portes logiques superflues. Le résultat est alors un '''incrémenteur 2 bits ''carry skip''''', où la retenue sortante est calculée séparément du reste. [[File:Incrémenteur carry skip 2 bits.png|centre|vignette|upright=2.5|Incrémenteur ''carry skip'' 2 bits]] ==Les incrémenteurs à anticipation de retenue== L''''anticipation de retenue''' calcule la retenue d'une colonne sans attendre les retenues des colonnes précédentes. Il s'agit d'une optimisation qui est utilisée pour l'incrémentation, l'addition et d'autres opérations similaires. Pour l'incrémentation, déterminer la retenue ne demande pas de calculs complexes, contrairement à l'addition. Pour le comprendre, on peut regarder comment la retenue sortant d'un demi-additionneur est formée. Elle est calculée en faisant un ET logique entre la retenue entrante et le bit d'opérande. Une retenue est donc un ET logique entre toutes les retenues précédentes. Un incrémenteur à anticipation de retenue utilise donc une porte ET à plusieurs entrées pour calculer une retenue. [[File:Anticipation de retenue pour un bit du résultat, incrémenteur.png|centre|vignette|upright=2.5|Anticipation de retenue pour un bit du résultat, incrémenteur]] En théorie, on peut utiliser une porte ET à plusieurs entrées pour chaque bit de l'opérande. Cependant, cela entrainera un cout en transistors très important. Pour éviter de gaspiller trop de portes logiques, une solution est de mélanger anticipation de retenues et propagation de retenue. Par exemple, pour un incrémenteur 32 bits, on peut découper l'opérande en 4 octets : on anticipe les retenues pour chaque octet, mais l'incrémentation de chaque octet se fait avec propagation de retenue et/ou ''carry skip''. [[File:Incrémenteur à anticipation de retenues.png|centre|vignette|upright=3|Incrémenteur hybride utilisant partiellement l'anticipation de retenues.]] Quelques processeurs utilisaient l'anticipation de retenues. Par exemple, le processeur Z-80 de Zilog utilisait un incrémenteur pour des nombres de 16 bits, ce qui demandait des performances assez élevées. Et cet incrémenteur utilisait à la fois anticipation de retenues et ''carry skip''. Il était découpé en quatre blocs avant anticipation de retenues entre eux : un bloc regroupant les 7 bits de poids faible, suivi par un bloc de 5 bits, lui-même suivi par un bloc de 3 bits, terminé par un dernier bit isolé. A l'intérieur de ces blocs, les bits sont regroupés en paires utilisant le ''carry skip''. Pour ceux qui veulent en savoir plus sur cet incrémenteur, voici un lien sur le sujet : * [https://www.righto.com/2013/11/the-z-80s-16-bit-incrementdecrement.html The Z-80's 16-bit increment/decrement circuit reverse engineered]. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de sélection | prevText=Les circuits de sélection | next=Les bascules : des mémoires de 1 bit | nextText=Les bascules : des mémoires de 1 bit }} </noinclude> 0lt6p25p320bohxknvniixjacj25uvr 768084 768033 2026-06-18T17:08:11Z Mewtow 31375 768084 wikitext text/x-wiki Le circuit '''incrémenteur''' incrémente un nombre entier. Plus précisément, il prend en entrée un nombre entier, et fournit en entier le nombre suivant, il lui ajoute 1. Une telle opération peut paraitre triviale et peu intéressante. Cependant, elle est très utilisée et est absolument cruciale pour créer des compteurs, des circuits capables de compter ou décompter, qui auront droit à un chapitre dédié. De plus, au-delà de leur utilisation dans les compteurs, les incrémenteurs étaient très utilisés sur les premiers processeurs 8 bits, comme le Z-80, le 6502, les premiers processeurs x86 comme le 8008, le 8086, le 8085, et bien d'autres. Il s'agit de circuits assez simples, bien plus simples que les additionneurs. Ils peuvent reprendre les optimisations présentes dans les additionneurs, comme l'anticipation de retenue ou le ''carry skip'', mais ces techniques sont bien plus simples à utiliser avec un incrémenteur. Il existe aussi des ''circuits décrémenteurs'', qui décrémentent un opérande, ainsi que des ''circuits incrémenteur-décrémenteur'', qui peuvent incrémenter ou décrémenter, selon comment on les configure. Je ne vais pas détailler ces circuits plus que ça, car de tels circuits sont assez rares, comparé à un circuit incrémenteur simple. ==Le demi-additionneur== Le circuit incrémenteur effectue l'opération suivante : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Un incrémenteur basique doit donc faire une addition pour chaque colonne, et précisément une addition de deux bits. Il se trouve que la table d'addition est très simple en binaire. Jugez plutôt : * 0 + 0 = 0, retenue = 0 ; * 0 + 1 = 1, retenue = 0 ; * 1 + 0 = 1, retenue = 0 ; * 1 + 1 = 0, retenue = 1. Un circuit capable d'additionner deux bits est donc simple à construire avec les techniques vues dans les premiers chapitres. On voit immédiatement que la colonne des retenues donne une porte ET, alors que celle du bit de somme est calculé par un XOR. Le circuit obtenu est appelé un '''demi-additionneur'''. Il dispose d'une sortie S pour la somme, et C pour la retenue (''carry'' an anglais). {| class="flexible" |[[File:1-bit half-adder.svg|class=transparent|centre|Demi-addtionneur.]] |[[File:Half-adder.svg|centre|class=transparent|Circuit d'un demi-addtionneur.]] |} ==L'incrémenteur à propagation de retenue== Maintenant que l'on sait comment additionner deux bits, reprenons l'opération d'incrémentation : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Sur la colonne la plus à droite, il doit ajouter un au bit de poids faible. Pour les colonnes suivantes, il faut additionner le bit de l'opérande avec la retenue de la colonne précédente. En clair, on n'additionne que deux bits à chaque colonne : un 1 sur celle tout à droite, la retenue de la colonne précédente pour les autres. Et cela nous donne une idée de comment faire pour créer le circuit incrémenteur. Il suffit d'utiliser un demi-additionneur par colonne, et de les enchainer les uns à la suite des autres. Chaque demi-additionneur additionne le bit de l'opérande avec la retenue fournie par le demi-additionneur précédent. Le seul qui fait exception est celui pour la colonne de poids faible. Pour celui-là, il doit ajouter 1 au bit de poids faible. Le résultat est appelé un '''incrémenteur à propagation de retenue'''. Il est constitué de demi-additionneurs enchaînés les uns à la suite des autres, qui propagent les retenues calculées du bit de poids faible vers le bit de poids fort. [[File:Circuit incrémenteur.png|centre|vignette|upright=3|Circuit incrémenteur.]] Maintenant, regardons le demi-additionneur le plus à droite, celui pour le bit de poids faible. Son entrée de retenue entrante est mise à 1 pour faire l'incrémentation. Quelques incrémenteurs permettent de configurer cette entrée de retenue à 0 ou à 1, ce qui effectue : soit une opération identité (l'opérande est recopié sur la sortie), soit une incrémentation. Un tel circuit est nommé un '''incrémenteur commandable'''. Nous aurons à utiliser une fois ou deux de tels incrémenteurs commandables dans la suite du cours. L'incrémenteur à propagation de retenue est le plus simple et le plus économe en portes logiques. Mais de tels incrémenteurs sont rarement utilisés. À la place, on leur préfère des incrémenteurs plus performants, qui utilisent souvent plus de portes logiques. De tels incrémenteurs sont conçus pour rendre le calcul des retenues plus rapide. En effet, la rapidité d'une incrémentation est limitée par la propagation de la retenue : les retenues commencent à être calculées au bit de poids fort et on doit les calculer colonne par colonne, jusqu’à atteindre le bit de poids fort. Et cette propagation des retenues prend beaucoup de temps. Plus l'opérande est longue, plus ce temps est élevé. Il y a deux optimisations principales, appelées le ''carry skip'' et l'anticipation de retenue, que nous allons décrire ci-dessous. ==Les incrémenteurs ''carry skip''== L'optimisation '''''carry skip''''' effectue l'incrémentation, non pas bit par bit, mais par paquets de deux bits. Le résultat est que l'incrémentation est deux fois plus rapide, ou presque. Le circuit incrémenteur est donc composé en enchainant non pas des demi-additionneurs, mais des '''incrémenteurs 2 bits''' qui incrémentent un opérande de deux bits. [[File:Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits.png|centre|vignette|upright=2.5|Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits]] Reste à concevoir l'incrémenteur 2 bits. Une première solution part de deux demi-additionneurs et effectue quelques simplifications au niveau des transistors et des portes logiques. Par exemple, l'Intel 8085 a utilisé un circuit optimisé, fabriqué avec des portes NAND et NOR. La raison est qu'avec les technologies de transistors CMOS actuelles, les portes NAND et NOR utilisent moins de transistors que les portes ET et OU. Et cette possibilité a été utilisée pour effectuer des simplifications assez mineures, mais toujours bonnes à prendre. Mais nous ne pouvons pas en parler ici. Une solution alternative fabrique des incrémenteurs 2 bits qui calculent séparément les deux bits du résultat et la retenue sortante. La retenue sortante est calculée à partir des bits de l’opérande, sans propager des retenues. Ainsi, la retenue sortante est connue en avance, sans passer par deux demi-additionneurs. Pour créer un tel incrémenteur, le mieux est de partir de sa table de vérité. {|class="wikitable" |- ! Opérande !! Retenue entrante !! !! Retenue sortante !! Résultat |- | 00 || 0 || || 0 || 00 |- | 01 || 0 || || 0 || 01 |- | 10 || 0 || || 0 || 10 |- | 11 || 0 || || 0 || 11 |- | colspan="5" | |- | 00 || 1 || || 0 || 01 |- | 01 || 1 || || 0 || 10 |- | 10 || 1 || || 0 || 11 |- | 11 || 1 || || 1 || 00 |} Elle nous dit que la retenue sortante ne vaut 1 que dans un seul cas : les deux bits d'opérande valent 1, la retenue entrante vaut 1. Elle se calcule alors avec une porte ET à trois entrées. Pour les deux bits du résultat, les équations logiques ne donnent pas un résultat satisfaisant. La solution la plus simple est d'utiliser deux demi-additionneurs et de retirer les portes logiques superflues. Le résultat est alors un '''incrémenteur 2 bits ''carry skip''''', où la retenue sortante est calculée séparément du reste. [[File:Incrémenteur carry skip 2 bits.png|centre|vignette|upright=2.5|Incrémenteur ''carry skip'' 2 bits]] ==Les incrémenteurs à anticipation de retenue== L''''anticipation de retenue''' calcule la retenue d'une colonne sans attendre les retenues des colonnes précédentes. Il s'agit d'une optimisation qui est utilisée pour l'incrémentation, l'addition et d'autres opérations similaires. Pour l'incrémentation, déterminer la retenue ne demande pas de calculs complexes, contrairement à l'addition. Pour le comprendre, on peut regarder comment la retenue sortant d'un demi-additionneur est formée. Elle est calculée en faisant un ET logique entre la retenue entrante et le bit d'opérande. Une retenue est donc un ET logique entre toutes les retenues précédentes. Un incrémenteur à anticipation de retenue utilise donc une porte ET à plusieurs entrées pour calculer une retenue. [[File:Anticipation de retenue pour un bit du résultat, incrémenteur.png|centre|vignette|upright=2.5|Anticipation de retenue pour un bit du résultat, incrémenteur]] En théorie, on peut utiliser une porte ET à plusieurs entrées pour chaque bit de l'opérande. Cependant, cela entrainera un cout en transistors très important. Pour éviter de gaspiller trop de portes logiques, une solution est de mélanger anticipation de retenues et propagation de retenue. Par exemple, pour un incrémenteur 32 bits, on peut découper l'opérande en 4 octets : on anticipe les retenues pour chaque octet, mais l'incrémentation de chaque octet se fait avec propagation de retenue et/ou ''carry skip''. [[File:Incrémenteur à anticipation de retenues.png|centre|vignette|upright=3|Incrémenteur hybride utilisant partiellement l'anticipation de retenues.]] Quelques processeurs utilisaient l'anticipation de retenues. Par exemple, le processeur Z-80 de Zilog utilisait un incrémenteur pour des nombres de 16 bits, ce qui demandait des performances assez élevées. Et cet incrémenteur utilisait à la fois anticipation de retenues et ''carry skip''. Il était découpé en quatre blocs avant anticipation de retenues entre eux : un bloc regroupant les 7 bits de poids faible, suivi par un bloc de 5 bits, lui-même suivi par un bloc de 3 bits, terminé par un dernier bit isolé. A l'intérieur de ces blocs, les bits sont regroupés en paires utilisant le ''carry skip''. Pour ceux qui veulent en savoir plus sur cet incrémenteur, voici un lien sur le sujet : * [https://www.righto.com/2013/11/the-z-80s-16-bit-incrementdecrement.html The Z-80's 16-bit increment/decrement circuit reverse engineered]. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de sélection | prevText=Les circuits de sélection | next=Les bascules : des mémoires de 1 bit | nextText=Les bascules : des mémoires de 1 bit }} </noinclude> 28hxiuodi5jj7eiunrbkwq7minqsjrk 768134 768084 2026-06-19T01:10:16Z Mewtow 31375 768134 wikitext text/x-wiki Le circuit '''incrémenteur''' incrémente un nombre entier. Plus précisément, il prend en entrée un nombre entier, et fournit en entier le nombre suivant, il lui ajoute 1. Une telle opération peut paraitre triviale et peu intéressante. Cependant, elle est très utilisée et est absolument cruciale pour créer des compteurs, des circuits capables de compter ou décompter, qui auront droit à un chapitre dédié. De plus, au-delà de leur utilisation dans les compteurs, les incrémenteurs étaient très utilisés sur les premiers processeurs 8 bits, comme le Z-80, le 6502, les premiers processeurs x86 comme le 8008, le 8086, le 8085, et bien d'autres. Il existe aussi des ''circuits décrémenteurs'', qui décrémentent un opérande, ainsi que des ''circuits incrémenteur-décrémenteur'', qui peuvent incrémenter ou décrémenter, selon comment on les configure. Je ne vais pas détailler ces circuits plus que ça, car de tels circuits sont assez rares, comparé à un circuit incrémenteur simple. ==Le demi-additionneur== Le circuit incrémenteur effectue l'opération suivante : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Un incrémenteur basique doit donc faire une addition pour chaque colonne, et précisément une addition de deux bits. Il se trouve que la table d'addition est très simple en binaire. Jugez plutôt : * 0 + 0 = 0, retenue = 0 ; * 0 + 1 = 1, retenue = 0 ; * 1 + 0 = 1, retenue = 0 ; * 1 + 1 = 0, retenue = 1. Un circuit capable d'additionner deux bits est donc simple à construire avec les techniques vues dans les premiers chapitres. On voit immédiatement que la colonne des retenues donne une porte ET, alors que celle du bit de somme est calculé par un XOR. Le circuit obtenu est appelé un '''demi-additionneur'''. Il dispose d'une sortie S pour la somme, et C pour la retenue (''carry'' an anglais). {| class="flexible" |[[File:1-bit half-adder.svg|class=transparent|centre|Demi-addtionneur.]] |[[File:Half-adder.svg|centre|class=transparent|Circuit d'un demi-addtionneur.]] |} ==L'incrémenteur à propagation de retenue== Maintenant que l'on sait comment additionner deux bits, reprenons l'opération d'incrémentation : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Sur la colonne la plus à droite, il doit ajouter un au bit de poids faible. Pour les colonnes suivantes, il faut additionner le bit de l'opérande avec la retenue de la colonne précédente. En clair, on n'additionne que deux bits à chaque colonne : un 1 sur celle tout à droite, la retenue de la colonne précédente pour les autres. Et cela nous donne une idée de comment faire pour créer le circuit incrémenteur. Il suffit d'utiliser un demi-additionneur par colonne, et de les enchainer les uns à la suite des autres. Chaque demi-additionneur additionne le bit de l'opérande avec la retenue fournie par le demi-additionneur précédent. Le seul qui fait exception est celui pour la colonne de poids faible. Pour celui-là, il doit ajouter 1 au bit de poids faible. Le résultat est appelé un '''incrémenteur à propagation de retenue'''. Il est constitué de demi-additionneurs enchaînés les uns à la suite des autres, qui propagent les retenues calculées du bit de poids faible vers le bit de poids fort. [[File:Circuit incrémenteur.png|centre|vignette|upright=3|Circuit incrémenteur.]] Maintenant, regardons le demi-additionneur le plus à droite, celui pour le bit de poids faible. Son entrée de retenue entrante est mise à 1 pour faire l'incrémentation. Quelques incrémenteurs permettent de configurer cette entrée de retenue à 0 ou à 1, ce qui effectue : soit une opération identité (l'opérande est recopié sur la sortie), soit une incrémentation. Un tel circuit est nommé un '''incrémenteur commandable'''. Nous aurons à utiliser une fois ou deux de tels incrémenteurs commandables dans la suite du cours. L'incrémenteur à propagation de retenue est le plus simple et le plus économe en portes logiques. Mais de tels incrémenteurs sont rarement utilisés. À la place, on leur préfère des incrémenteurs plus performants, qui utilisent souvent plus de portes logiques. De tels incrémenteurs sont conçus pour rendre le calcul des retenues plus rapide. En effet, la rapidité d'une incrémentation est limitée par la propagation de la retenue : les retenues commencent à être calculées au bit de poids fort et on doit les calculer colonne par colonne, jusqu’à atteindre le bit de poids fort. Et cette propagation des retenues prend beaucoup de temps. Plus l'opérande est longue, plus ce temps est élevé. Il y a deux optimisations principales, appelées le ''carry skip'' et l'anticipation de retenue, que nous allons décrire ci-dessous. ==Les incrémenteurs ''carry skip''== L'optimisation '''''carry skip''''' effectue l'incrémentation, non pas bit par bit, mais par paquets de deux bits. Le résultat est que l'incrémentation est deux fois plus rapide, ou presque. Le circuit incrémenteur est donc composé en enchainant non pas des demi-additionneurs, mais des '''incrémenteurs 2 bits''' qui incrémentent un opérande de deux bits. [[File:Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits.png|centre|vignette|upright=2.5|Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits]] Reste à concevoir l'incrémenteur 2 bits. Une première solution part de deux demi-additionneurs et effectue quelques simplifications au niveau des transistors et des portes logiques. Par exemple, l'Intel 8085 a utilisé un circuit optimisé, fabriqué avec des portes NAND et NOR. La raison est qu'avec les technologies de transistors CMOS actuelles, les portes NAND et NOR utilisent moins de transistors que les portes ET et OU. Et cette possibilité a été utilisée pour effectuer des simplifications assez mineures, mais toujours bonnes à prendre. Mais nous ne pouvons pas en parler ici. Une solution alternative fabrique des incrémenteurs 2 bits qui calculent séparément les deux bits du résultat et la retenue sortante. La retenue sortante est calculée à partir des bits de l’opérande, sans propager des retenues. Ainsi, la retenue sortante est connue en avance, sans passer par deux demi-additionneurs. Pour créer un tel incrémenteur, le mieux est de partir de sa table de vérité. {|class="wikitable" |- ! Opérande !! Retenue entrante !! !! Retenue sortante !! Résultat |- | 00 || 0 || || 0 || 00 |- | 01 || 0 || || 0 || 01 |- | 10 || 0 || || 0 || 10 |- | 11 || 0 || || 0 || 11 |- | colspan="5" | |- | 00 || 1 || || 0 || 01 |- | 01 || 1 || || 0 || 10 |- | 10 || 1 || || 0 || 11 |- | 11 || 1 || || 1 || 00 |} Elle nous dit que la retenue sortante ne vaut 1 que dans un seul cas : les deux bits d'opérande valent 1, la retenue entrante vaut 1. Elle se calcule alors avec une porte ET à trois entrées. Pour les deux bits du résultat, les équations logiques ne donnent pas un résultat satisfaisant. La solution la plus simple est d'utiliser deux demi-additionneurs et de retirer les portes logiques superflues. Le résultat est alors un '''incrémenteur 2 bits ''carry skip''''', où la retenue sortante est calculée séparément du reste. [[File:Incrémenteur carry skip 2 bits.png|centre|vignette|upright=2.5|Incrémenteur ''carry skip'' 2 bits]] ==Les incrémenteurs à anticipation de retenue== L''''anticipation de retenue''' calcule la retenue d'une colonne sans attendre les retenues des colonnes précédentes. Il s'agit d'une optimisation qui est utilisée pour l'incrémentation, l'addition et d'autres opérations similaires. Pour l'incrémentation, déterminer la retenue ne demande pas de calculs complexes, contrairement à l'addition. Pour le comprendre, on peut regarder comment la retenue sortant d'un demi-additionneur est formée. Elle est calculée en faisant un ET logique entre la retenue entrante et le bit d'opérande. Une retenue est donc un ET logique entre toutes les retenues précédentes. Un incrémenteur à anticipation de retenue utilise donc une porte ET à plusieurs entrées pour calculer une retenue. [[File:Anticipation de retenue pour un bit du résultat, incrémenteur.png|centre|vignette|upright=2.5|Anticipation de retenue pour un bit du résultat, incrémenteur]] En théorie, on peut utiliser une porte ET à plusieurs entrées pour chaque bit de l'opérande. Cependant, cela entrainera un cout en transistors très important. Pour éviter de gaspiller trop de portes logiques, une solution est de mélanger anticipation de retenues et propagation de retenue. Par exemple, pour un incrémenteur 32 bits, on peut découper l'opérande en 4 octets : on anticipe les retenues pour chaque octet, mais l'incrémentation de chaque octet se fait avec propagation de retenue et/ou ''carry skip''. [[File:Incrémenteur à anticipation de retenues.png|centre|vignette|upright=3|Incrémenteur hybride utilisant partiellement l'anticipation de retenues.]] Quelques processeurs utilisaient l'anticipation de retenues. Par exemple, le processeur Z-80 de Zilog utilisait un incrémenteur pour des nombres de 16 bits, ce qui demandait des performances assez élevées. Et cet incrémenteur utilisait à la fois anticipation de retenues et ''carry skip''. Il était découpé en quatre blocs avant anticipation de retenues entre eux : un bloc regroupant les 7 bits de poids faible, suivi par un bloc de 5 bits, lui-même suivi par un bloc de 3 bits, terminé par un dernier bit isolé. A l'intérieur de ces blocs, les bits sont regroupés en paires utilisant le ''carry skip''. Pour ceux qui veulent en savoir plus sur cet incrémenteur, voici un lien sur le sujet : * [https://www.righto.com/2013/11/the-z-80s-16-bit-incrementdecrement.html The Z-80's 16-bit increment/decrement circuit reverse engineered]. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de sélection | prevText=Les circuits de sélection | next=Les bascules : des mémoires de 1 bit | nextText=Les bascules : des mémoires de 1 bit }} </noinclude> p7hpvbovivkql0rf4iza8rk0bkwq9j6 768135 768134 2026-06-19T01:10:42Z Mewtow 31375 /* Le demi-additionneur */ 768135 wikitext text/x-wiki Le circuit '''incrémenteur''' incrémente un nombre entier. Plus précisément, il prend en entrée un nombre entier, et fournit en entier le nombre suivant, il lui ajoute 1. Une telle opération peut paraitre triviale et peu intéressante. Cependant, elle est très utilisée et est absolument cruciale pour créer des compteurs, des circuits capables de compter ou décompter, qui auront droit à un chapitre dédié. De plus, au-delà de leur utilisation dans les compteurs, les incrémenteurs étaient très utilisés sur les premiers processeurs 8 bits, comme le Z-80, le 6502, les premiers processeurs x86 comme le 8008, le 8086, le 8085, et bien d'autres. Il existe aussi des ''circuits décrémenteurs'', qui décrémentent un opérande, ainsi que des ''circuits incrémenteur-décrémenteur'', qui peuvent incrémenter ou décrémenter, selon comment on les configure. Je ne vais pas détailler ces circuits plus que ça, car de tels circuits sont assez rares, comparé à un circuit incrémenteur simple. ==Le demi-additionneur== Le circuit incrémenteur effectue l'opération suivante : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 Un incrémenteur basique doit donc faire une addition pour chaque colonne, et précisément une addition de deux bits. Il se trouve que la table d'addition est très simple en binaire. Jugez plutôt : * 0 + 0 = 0, retenue = 0 ; * 0 + 1 = 1, retenue = 0 ; * 1 + 0 = 1, retenue = 0 ; * 1 + 1 = 0, retenue = 1. Un circuit capable d'additionner deux bits est donc simple à construire avec les techniques vues dans les premiers chapitres. On voit immédiatement que la colonne des retenues donne une porte ET, alors que celle du bit de somme est calculé par un XOR. Le circuit obtenu est appelé un '''demi-additionneur'''. Il dispose d'une sortie S pour la somme, et C pour la retenue (''carry'' an anglais). {| class="flexible" |[[File:1-bit half-adder.svg|class=transparent|centre|Demi-addtionneur.]] |[[File:Half-adder.svg|centre|class=transparent|Circuit d'un demi-addtionneur.]] |} ==L'incrémenteur à propagation de retenue== Maintenant que l'on sait comment additionner deux bits, reprenons l'opération d'incrémentation : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Sur la colonne la plus à droite, il doit ajouter un au bit de poids faible. Pour les colonnes suivantes, il faut additionner le bit de l'opérande avec la retenue de la colonne précédente. En clair, on n'additionne que deux bits à chaque colonne : un 1 sur celle tout à droite, la retenue de la colonne précédente pour les autres. Et cela nous donne une idée de comment faire pour créer le circuit incrémenteur. Il suffit d'utiliser un demi-additionneur par colonne, et de les enchainer les uns à la suite des autres. Chaque demi-additionneur additionne le bit de l'opérande avec la retenue fournie par le demi-additionneur précédent. Le seul qui fait exception est celui pour la colonne de poids faible. Pour celui-là, il doit ajouter 1 au bit de poids faible. Le résultat est appelé un '''incrémenteur à propagation de retenue'''. Il est constitué de demi-additionneurs enchaînés les uns à la suite des autres, qui propagent les retenues calculées du bit de poids faible vers le bit de poids fort. [[File:Circuit incrémenteur.png|centre|vignette|upright=3|Circuit incrémenteur.]] Maintenant, regardons le demi-additionneur le plus à droite, celui pour le bit de poids faible. Son entrée de retenue entrante est mise à 1 pour faire l'incrémentation. Quelques incrémenteurs permettent de configurer cette entrée de retenue à 0 ou à 1, ce qui effectue : soit une opération identité (l'opérande est recopié sur la sortie), soit une incrémentation. Un tel circuit est nommé un '''incrémenteur commandable'''. Nous aurons à utiliser une fois ou deux de tels incrémenteurs commandables dans la suite du cours. L'incrémenteur à propagation de retenue est le plus simple et le plus économe en portes logiques. Mais de tels incrémenteurs sont rarement utilisés. À la place, on leur préfère des incrémenteurs plus performants, qui utilisent souvent plus de portes logiques. De tels incrémenteurs sont conçus pour rendre le calcul des retenues plus rapide. En effet, la rapidité d'une incrémentation est limitée par la propagation de la retenue : les retenues commencent à être calculées au bit de poids fort et on doit les calculer colonne par colonne, jusqu’à atteindre le bit de poids fort. Et cette propagation des retenues prend beaucoup de temps. Plus l'opérande est longue, plus ce temps est élevé. Il y a deux optimisations principales, appelées le ''carry skip'' et l'anticipation de retenue, que nous allons décrire ci-dessous. ==Les incrémenteurs ''carry skip''== L'optimisation '''''carry skip''''' effectue l'incrémentation, non pas bit par bit, mais par paquets de deux bits. Le résultat est que l'incrémentation est deux fois plus rapide, ou presque. Le circuit incrémenteur est donc composé en enchainant non pas des demi-additionneurs, mais des '''incrémenteurs 2 bits''' qui incrémentent un opérande de deux bits. [[File:Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits.png|centre|vignette|upright=2.5|Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits]] Reste à concevoir l'incrémenteur 2 bits. Une première solution part de deux demi-additionneurs et effectue quelques simplifications au niveau des transistors et des portes logiques. Par exemple, l'Intel 8085 a utilisé un circuit optimisé, fabriqué avec des portes NAND et NOR. La raison est qu'avec les technologies de transistors CMOS actuelles, les portes NAND et NOR utilisent moins de transistors que les portes ET et OU. Et cette possibilité a été utilisée pour effectuer des simplifications assez mineures, mais toujours bonnes à prendre. Mais nous ne pouvons pas en parler ici. Une solution alternative fabrique des incrémenteurs 2 bits qui calculent séparément les deux bits du résultat et la retenue sortante. La retenue sortante est calculée à partir des bits de l’opérande, sans propager des retenues. Ainsi, la retenue sortante est connue en avance, sans passer par deux demi-additionneurs. Pour créer un tel incrémenteur, le mieux est de partir de sa table de vérité. {|class="wikitable" |- ! Opérande !! Retenue entrante !! !! Retenue sortante !! Résultat |- | 00 || 0 || || 0 || 00 |- | 01 || 0 || || 0 || 01 |- | 10 || 0 || || 0 || 10 |- | 11 || 0 || || 0 || 11 |- | colspan="5" | |- | 00 || 1 || || 0 || 01 |- | 01 || 1 || || 0 || 10 |- | 10 || 1 || || 0 || 11 |- | 11 || 1 || || 1 || 00 |} Elle nous dit que la retenue sortante ne vaut 1 que dans un seul cas : les deux bits d'opérande valent 1, la retenue entrante vaut 1. Elle se calcule alors avec une porte ET à trois entrées. Pour les deux bits du résultat, les équations logiques ne donnent pas un résultat satisfaisant. La solution la plus simple est d'utiliser deux demi-additionneurs et de retirer les portes logiques superflues. Le résultat est alors un '''incrémenteur 2 bits ''carry skip''''', où la retenue sortante est calculée séparément du reste. [[File:Incrémenteur carry skip 2 bits.png|centre|vignette|upright=2.5|Incrémenteur ''carry skip'' 2 bits]] ==Les incrémenteurs à anticipation de retenue== L''''anticipation de retenue''' calcule la retenue d'une colonne sans attendre les retenues des colonnes précédentes. Il s'agit d'une optimisation qui est utilisée pour l'incrémentation, l'addition et d'autres opérations similaires. Pour l'incrémentation, déterminer la retenue ne demande pas de calculs complexes, contrairement à l'addition. Pour le comprendre, on peut regarder comment la retenue sortant d'un demi-additionneur est formée. Elle est calculée en faisant un ET logique entre la retenue entrante et le bit d'opérande. Une retenue est donc un ET logique entre toutes les retenues précédentes. Un incrémenteur à anticipation de retenue utilise donc une porte ET à plusieurs entrées pour calculer une retenue. [[File:Anticipation de retenue pour un bit du résultat, incrémenteur.png|centre|vignette|upright=2.5|Anticipation de retenue pour un bit du résultat, incrémenteur]] En théorie, on peut utiliser une porte ET à plusieurs entrées pour chaque bit de l'opérande. Cependant, cela entrainera un cout en transistors très important. Pour éviter de gaspiller trop de portes logiques, une solution est de mélanger anticipation de retenues et propagation de retenue. Par exemple, pour un incrémenteur 32 bits, on peut découper l'opérande en 4 octets : on anticipe les retenues pour chaque octet, mais l'incrémentation de chaque octet se fait avec propagation de retenue et/ou ''carry skip''. [[File:Incrémenteur à anticipation de retenues.png|centre|vignette|upright=3|Incrémenteur hybride utilisant partiellement l'anticipation de retenues.]] Quelques processeurs utilisaient l'anticipation de retenues. Par exemple, le processeur Z-80 de Zilog utilisait un incrémenteur pour des nombres de 16 bits, ce qui demandait des performances assez élevées. Et cet incrémenteur utilisait à la fois anticipation de retenues et ''carry skip''. Il était découpé en quatre blocs avant anticipation de retenues entre eux : un bloc regroupant les 7 bits de poids faible, suivi par un bloc de 5 bits, lui-même suivi par un bloc de 3 bits, terminé par un dernier bit isolé. A l'intérieur de ces blocs, les bits sont regroupés en paires utilisant le ''carry skip''. Pour ceux qui veulent en savoir plus sur cet incrémenteur, voici un lien sur le sujet : * [https://www.righto.com/2013/11/the-z-80s-16-bit-incrementdecrement.html The Z-80's 16-bit increment/decrement circuit reverse engineered]. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de sélection | prevText=Les circuits de sélection | next=Les bascules : des mémoires de 1 bit | nextText=Les bascules : des mémoires de 1 bit }} </noinclude> 5smgr78jgr0682jxfhqccjvbuyffy4h 768136 768135 2026-06-19T01:11:34Z Mewtow 31375 /* Le demi-additionneur */ 768136 wikitext text/x-wiki Le circuit '''incrémenteur''' incrémente un nombre entier. Plus précisément, il prend en entrée un nombre entier, et fournit en entier le nombre suivant, il lui ajoute 1. Une telle opération peut paraitre triviale et peu intéressante. Cependant, elle est très utilisée et est absolument cruciale pour créer des compteurs, des circuits capables de compter ou décompter, qui auront droit à un chapitre dédié. De plus, au-delà de leur utilisation dans les compteurs, les incrémenteurs étaient très utilisés sur les premiers processeurs 8 bits, comme le Z-80, le 6502, les premiers processeurs x86 comme le 8008, le 8086, le 8085, et bien d'autres. Il existe aussi des ''circuits décrémenteurs'', qui décrémentent un opérande, ainsi que des ''circuits incrémenteur-décrémenteur'', qui peuvent incrémenter ou décrémenter, selon comment on les configure. Je ne vais pas détailler ces circuits plus que ça, car de tels circuits sont assez rares, comparé à un circuit incrémenteur simple. ==Le demi-additionneur== Le circuit incrémenteur effectue l'opération suivante : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 Un incrémenteur basique doit donc faire une addition pour chaque colonne, et précisément une addition de deux bits. Il se trouve que la table d'addition est très simple en binaire. Jugez plutôt : * 0 + 0 = 0, retenue = 0 ; * 0 + 1 = 1, retenue = 0 ; * 1 + 0 = 1, retenue = 0 ; * 1 + 1 = 0, retenue = 1. Un circuit capable d'additionner deux bits est appelé un '''demi-additionneur'''. Il dispose d'une sortie S pour la somme, et C pour la retenue (''carry'' an anglais). Il est très simple à construire avec les techniques vues dans les premiers chapitres. On voit immédiatement que la colonne des retenues donne une porte ET, alors que celle du bit de somme est calculé par un XOR. {| class="flexible" |[[File:1-bit half-adder.svg|class=transparent|centre|Demi-addtionneur.]] |[[File:Half-adder.svg|centre|class=transparent|Circuit d'un demi-addtionneur.]] |} ==L'incrémenteur à propagation de retenue== Maintenant que l'on sait comment additionner deux bits, reprenons l'opération d'incrémentation : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Sur la colonne la plus à droite, il doit ajouter un au bit de poids faible. Pour les colonnes suivantes, il faut additionner le bit de l'opérande avec la retenue de la colonne précédente. En clair, on n'additionne que deux bits à chaque colonne : un 1 sur celle tout à droite, la retenue de la colonne précédente pour les autres. Et cela nous donne une idée de comment faire pour créer le circuit incrémenteur. Il suffit d'utiliser un demi-additionneur par colonne, et de les enchainer les uns à la suite des autres. Chaque demi-additionneur additionne le bit de l'opérande avec la retenue fournie par le demi-additionneur précédent. Le seul qui fait exception est celui pour la colonne de poids faible. Pour celui-là, il doit ajouter 1 au bit de poids faible. Le résultat est appelé un '''incrémenteur à propagation de retenue'''. Il est constitué de demi-additionneurs enchaînés les uns à la suite des autres, qui propagent les retenues calculées du bit de poids faible vers le bit de poids fort. [[File:Circuit incrémenteur.png|centre|vignette|upright=3|Circuit incrémenteur.]] Maintenant, regardons le demi-additionneur le plus à droite, celui pour le bit de poids faible. Son entrée de retenue entrante est mise à 1 pour faire l'incrémentation. Quelques incrémenteurs permettent de configurer cette entrée de retenue à 0 ou à 1, ce qui effectue : soit une opération identité (l'opérande est recopié sur la sortie), soit une incrémentation. Un tel circuit est nommé un '''incrémenteur commandable'''. Nous aurons à utiliser une fois ou deux de tels incrémenteurs commandables dans la suite du cours. L'incrémenteur à propagation de retenue est le plus simple et le plus économe en portes logiques. Mais de tels incrémenteurs sont rarement utilisés. À la place, on leur préfère des incrémenteurs plus performants, qui utilisent souvent plus de portes logiques. De tels incrémenteurs sont conçus pour rendre le calcul des retenues plus rapide. En effet, la rapidité d'une incrémentation est limitée par la propagation de la retenue : les retenues commencent à être calculées au bit de poids fort et on doit les calculer colonne par colonne, jusqu’à atteindre le bit de poids fort. Et cette propagation des retenues prend beaucoup de temps. Plus l'opérande est longue, plus ce temps est élevé. Il y a deux optimisations principales, appelées le ''carry skip'' et l'anticipation de retenue, que nous allons décrire ci-dessous. ==Les incrémenteurs ''carry skip''== L'optimisation '''''carry skip''''' effectue l'incrémentation, non pas bit par bit, mais par paquets de deux bits. Le résultat est que l'incrémentation est deux fois plus rapide, ou presque. Le circuit incrémenteur est donc composé en enchainant non pas des demi-additionneurs, mais des '''incrémenteurs 2 bits''' qui incrémentent un opérande de deux bits. [[File:Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits.png|centre|vignette|upright=2.5|Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits]] Reste à concevoir l'incrémenteur 2 bits. Une première solution part de deux demi-additionneurs et effectue quelques simplifications au niveau des transistors et des portes logiques. Par exemple, l'Intel 8085 a utilisé un circuit optimisé, fabriqué avec des portes NAND et NOR. La raison est qu'avec les technologies de transistors CMOS actuelles, les portes NAND et NOR utilisent moins de transistors que les portes ET et OU. Et cette possibilité a été utilisée pour effectuer des simplifications assez mineures, mais toujours bonnes à prendre. Mais nous ne pouvons pas en parler ici. Une solution alternative fabrique des incrémenteurs 2 bits qui calculent séparément les deux bits du résultat et la retenue sortante. La retenue sortante est calculée à partir des bits de l’opérande, sans propager des retenues. Ainsi, la retenue sortante est connue en avance, sans passer par deux demi-additionneurs. Pour créer un tel incrémenteur, le mieux est de partir de sa table de vérité. {|class="wikitable" |- ! Opérande !! Retenue entrante !! !! Retenue sortante !! Résultat |- | 00 || 0 || || 0 || 00 |- | 01 || 0 || || 0 || 01 |- | 10 || 0 || || 0 || 10 |- | 11 || 0 || || 0 || 11 |- | colspan="5" | |- | 00 || 1 || || 0 || 01 |- | 01 || 1 || || 0 || 10 |- | 10 || 1 || || 0 || 11 |- | 11 || 1 || || 1 || 00 |} Elle nous dit que la retenue sortante ne vaut 1 que dans un seul cas : les deux bits d'opérande valent 1, la retenue entrante vaut 1. Elle se calcule alors avec une porte ET à trois entrées. Pour les deux bits du résultat, les équations logiques ne donnent pas un résultat satisfaisant. La solution la plus simple est d'utiliser deux demi-additionneurs et de retirer les portes logiques superflues. Le résultat est alors un '''incrémenteur 2 bits ''carry skip''''', où la retenue sortante est calculée séparément du reste. [[File:Incrémenteur carry skip 2 bits.png|centre|vignette|upright=2.5|Incrémenteur ''carry skip'' 2 bits]] ==Les incrémenteurs à anticipation de retenue== L''''anticipation de retenue''' calcule la retenue d'une colonne sans attendre les retenues des colonnes précédentes. Il s'agit d'une optimisation qui est utilisée pour l'incrémentation, l'addition et d'autres opérations similaires. Pour l'incrémentation, déterminer la retenue ne demande pas de calculs complexes, contrairement à l'addition. Pour le comprendre, on peut regarder comment la retenue sortant d'un demi-additionneur est formée. Elle est calculée en faisant un ET logique entre la retenue entrante et le bit d'opérande. Une retenue est donc un ET logique entre toutes les retenues précédentes. Un incrémenteur à anticipation de retenue utilise donc une porte ET à plusieurs entrées pour calculer une retenue. [[File:Anticipation de retenue pour un bit du résultat, incrémenteur.png|centre|vignette|upright=2.5|Anticipation de retenue pour un bit du résultat, incrémenteur]] En théorie, on peut utiliser une porte ET à plusieurs entrées pour chaque bit de l'opérande. Cependant, cela entrainera un cout en transistors très important. Pour éviter de gaspiller trop de portes logiques, une solution est de mélanger anticipation de retenues et propagation de retenue. Par exemple, pour un incrémenteur 32 bits, on peut découper l'opérande en 4 octets : on anticipe les retenues pour chaque octet, mais l'incrémentation de chaque octet se fait avec propagation de retenue et/ou ''carry skip''. [[File:Incrémenteur à anticipation de retenues.png|centre|vignette|upright=3|Incrémenteur hybride utilisant partiellement l'anticipation de retenues.]] Quelques processeurs utilisaient l'anticipation de retenues. Par exemple, le processeur Z-80 de Zilog utilisait un incrémenteur pour des nombres de 16 bits, ce qui demandait des performances assez élevées. Et cet incrémenteur utilisait à la fois anticipation de retenues et ''carry skip''. Il était découpé en quatre blocs avant anticipation de retenues entre eux : un bloc regroupant les 7 bits de poids faible, suivi par un bloc de 5 bits, lui-même suivi par un bloc de 3 bits, terminé par un dernier bit isolé. A l'intérieur de ces blocs, les bits sont regroupés en paires utilisant le ''carry skip''. Pour ceux qui veulent en savoir plus sur cet incrémenteur, voici un lien sur le sujet : * [https://www.righto.com/2013/11/the-z-80s-16-bit-incrementdecrement.html The Z-80's 16-bit increment/decrement circuit reverse engineered]. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de sélection | prevText=Les circuits de sélection | next=Les bascules : des mémoires de 1 bit | nextText=Les bascules : des mémoires de 1 bit }} </noinclude> 3uqlpdcisc0v3jvu728yuusnx23toqz Fonctionnement d'un ordinateur/Les timers et diviseurs de fréquence 0 83954 768068 2026-06-18T16:54:37Z Mewtow 31375 Mewtow a déplacé la page [[Fonctionnement d'un ordinateur/Les timers et diviseurs de fréquence]] vers [[Fonctionnement d'un ordinateur/Les compteurs à rétroaction]] 768068 wikitext text/x-wiki #REDIRECTION [[Fonctionnement d'un ordinateur/Les compteurs à rétroaction]] rdvyajgckfaq0abqickq9rfda26cxkx Fonctionnement d'un ordinateur/Les circuits compteurs et décompteurs 0 83955 768123 2026-06-19T01:05:32Z Mewtow 31375 Mewtow a déplacé la page [[Fonctionnement d'un ordinateur/Les circuits compteurs et décompteurs]] vers [[Fonctionnement d'un ordinateur/Les compteurs et timers]] 768123 wikitext text/x-wiki #REDIRECTION [[Fonctionnement d'un ordinateur/Les compteurs et timers]] tdde8mw388gy76xe7gqwrkmhw5hgc45 Fonctionnement d'un ordinateur/Les compteurs à rétroaction 0 83956 768128 2026-06-19T01:06:26Z Mewtow 31375 Mewtow a déplacé la page [[Fonctionnement d'un ordinateur/Les compteurs à rétroaction]] vers [[Fonctionnement d'un ordinateur/Les registres à décalage à rétroaction linéaire]] 768128 wikitext text/x-wiki #REDIRECTION [[Fonctionnement d'un ordinateur/Les registres à décalage à rétroaction linéaire]] kbuf0nwakrs6vfwj695hl4a61hduenh Catégorie:Éthique 14 83957 768156 2026-06-19T04:15:05Z PandaMystique 119061 Page créée avec « [[Catégorie:Discipline philosophique]] » 768156 wikitext text/x-wiki [[Catégorie:Discipline philosophique]] 08d5py569n2prl4un6bob6eoalb349u